我如何指定一个sudo密码Ansible在非交互的方式?

我是这样运行Ansible剧本的:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username --ask-sudo-pass

但我想这样运行它:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username` **--sudo-pass=12345**

有办法吗?我希望尽可能地自动化我的项目部署。


当前回答

如果您正在使用密码管理器,您可以使用模块passwordstore,这使得这非常容易。

假设您将用户的sudo密码保存为pass as

服务器 1/用户

然后您可以像这样使用解密后的值

{{ lookup('community.general.passwordstore', 'Server1/User')}}"

我在我的清单中使用它:

---
   servers:
     hosts:
       server1:
         ansible_become_pass: "{{ lookup('community.general.passwordstore', 'Server1/User')}}"

请注意,您应该运行gpg-agent,这样您就不会在每次运行“成为”任务时看到pinentry提示。

其他回答

sudo密码存储为名为ansible_sudo_pass的变量。 你可以通过以下几种方式设置这个变量:

对于每个主机,在您的目录hosts文件(inventory/<inventoryname>/hosts)中

[server]
10.0.0.0 ansible_sudo_pass=foobar

每个组,在您的库存组文件(inventory/<inventoryname>/groups)

[server:vars]
ansible_sudo_pass=foobar

每个组,在组vars中(group_vars/<groupname>/ansible.yml)

ansible_sudo_pass: "foobar"

每个组,加密(ansible-vault create group_vars/<groupname>/ansible.yml)

ansible_sudo_pass: "foobar"

我们也可以在ansible中使用EXPECT BLOCK来生成bash并根据您的需要自定义它

- name: Run expect to INSTALL TA
  shell: |
    set timeout 100
    spawn /bin/sh -i

    expect -re "$ "
    send "sudo yum remove -y xyz\n"

    expect "$ "
    send "sudo yum localinstall -y {{ rpm_remotehost_path_for_xyz }}\n"

    expect "~]$ "
    send "\n"

    exit 0
  args:
  executable: /usr/bin/expect

你可以使用ansible vault,它会把你的密码编码成加密的vault。之后,你可以使用变量从金库在剧本。

ansible vault的一些文档: http://docs.ansible.com/playbooks_vault.html

我们使用它作为每个环境的保险库。要编辑vault,我们有如下命令: Ansible-vault编辑库存/生产/group_vars/all/vault

如果你想调用保险库变量,你必须使用ansible-playbook的参数如下: Ansible-playbook -s——vault-password-file=~/.ansible_vault.password

是的,我们存储仓库密码在本地目录明文,但这不是更危险的存储根密码为每个系统。根密码在保险库文件中,或者您可以将它像sudoers文件一样用于您的用户/组。 我建议在服务器上使用sudoers文件。下面是组管理的示例: %admin所有=(所有)NOPASSWD:所有

Ansible vault已经在这里被建议了几次,但我更喜欢git-crypt加密我的剧本中的敏感文件。如果你使用git来保存你的ansible playbook,这是一个snap。我发现ansible vault的问题是,我不可避免地会遇到我想要使用的文件的加密副本,在我工作之前必须解密它。git-crypt提供了一个更好的工作流程。

https://github.com/AGWA/git-crypt

使用这个,你可以把你的密码放在你的剧本的var中,并把你的剧本标记为一个加密文件。gitattributes,像这样:

 my_playbook.yml filter=git-crypt diff=git-crypt

你的剧本将在Github上透明加密。然后,您只需要在用于运行ansible的主机上安装加密密钥,或者按照文档上的说明使用gpg进行设置。

这里有一个关于像SSH -agent转发SSH密钥一样转发gpg密钥的很好的问答:https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent。

使用ansible 2.4.1.0和以下应该工作:

[all]
17.26.131.10
17.26.131.11
17.26.131.12
17.26.131.13
17.26.131.14

[all:vars]
ansible_connection=ssh
ansible_user=per
ansible_ssh_pass=per
ansible_sudo_pass=per

然后用这个清单运行剧本:

ansible-playbook -i inventory copyTest.yml