我如何指定一个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**

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


当前回答

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 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。

您可以使用sshpass实用程序如下所示,

$ sshpass -p "your pass" ansible pattern -m module -a args \
   -i inventory --ask-sudo-pass

你可以在命令行通过——extra-vars "name=value"传递变量。Sudo密码变量为ansible_sudo_pass。所以你的命令看起来像这样:

ansible-playbook playbook.yml -i inventory.ini --user=username \
                              --extra-vars "ansible_sudo_pass=yourPassword"

2017年更新:Ansible 2.2.1.0现在使用var ansible_become_pass。两种方法似乎都有效。

2021年更新:ansible_become_pass仍然有效,但现在,我们应该使用-e而不是——extra-vars

查看代码(runner/__init__.py),我认为你可以将其设置在你的库存文件中:

[whatever]
some-host ansible_sudo_pass='foobar'

ansible.cfg配置文件中似乎也有一些规定,但现在还没有实现(constants.py)。

只要提示其他解决方案。 你可以设置你的ansible用户在没有密码的情况下运行sudo(这是GCP虚拟机的默认设置)

sudo visudo

添加行(tom是用户):

tom ALL=(ALL) NOPASSWD:ALL