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

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


当前回答

只是一个补充,所以没有人会经历我最近遇到的烦恼:

我相信,最好的解决方案是沿着上面的toast38coza的大致路线。如果将密码文件和剧本静态地绑定在一起是有意义的,那么使用vars_files(或include_vars)遵循他的模板。如果你想让它们分开,你可以在命令行上提供仓库内容,如下所示:

ansible-playbook --ask-vault-pass -e@<PATH_TO_VAULT_FILE> <PLAYBOOK_FILE>

回想起来,这是显而易见的,但这里有一些陷阱:

那个该死的@符号。如果省略它,解析将无声地失败,ansible-playbook将继续进行,就好像您从未指定过该文件一样。 您必须显式地导入保险库的内容,可以使用命令行——extra-vars/-e,也可以在YAML代码中导入。——ask-vault-pass标志本身不做任何事情(除了提示您输入一个稍后可能使用或不使用的值)。

愿你把“@”也写进去,节省一个小时。

其他回答

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。

文档强烈建议不要将sudo密码设置为明文:

提醒一下,密码永远不应该以纯文本的形式存储。有关使用Ansible Vault加密您的密码和其他秘密的信息,请参见使用Ansible Vault加密内容。

相反,当运行ansible-playbook时,你应该在命令行上使用——ask-become-pass

之前版本的Ansible使用——ask-sudo-pass和sudo来代替become。

可能做到这一点的最好方法——假设你不能使用scottod提供的NOPASSWD解决方案——是将Mircea Vutcovici的解决方案与Ansible vault Archived结合使用。

例如,你可能有这样的剧本:

- hosts: all

  vars_files:
    - secret

  tasks:
    - name: Do something as sudo
      service: name=nginx state=restarted
      sudo: yes

在这里,我们将包含一个名为secret的文件,其中将包含我们的sudo密码。

我们将使用ansible-vault来创建这个文件的加密版本:

ansible-vault create secret

这将要求您输入密码,然后打开默认编辑器来编辑该文件。你可以把ansible_sudo_pass放在这里。

例如:秘密:

ansible_sudo_pass: mysudopassword

保存并退出,现在你有一个加密的秘密文件,Ansible是能够解密时,你运行你的剧本。注意:您可以使用ansible-vault edit secret编辑文件(并输入创建文件时使用的密码)

谜题的最后一部分是为Ansible提供一个——vault-password-file,它将使用它来解密你的秘密文件。

创建一个名为vault.txt的文件,并在其中放入创建秘密文件时使用的密码。密码应该是存储在文件中的单行字符串。

来自Ansible Docs:

. .确保文件上的权限是这样的,没有其他人可以访问您的密钥,并且没有将您的密钥添加到源代码控制中

最后:您现在可以使用以下内容运行您的剧本

ansible-playbook playbook.yml -u someuser -i hosts --sudo --vault-password-file=vault.txt 

上面假设的目录布局如下:

.
|_ playbook.yml
|_ secret
|_ hosts
|_ vault.txt

你可以在这里阅读更多关于Ansible Vault: https://docs.ansible.com/playbooks_vault.html存档


https://docs.ansible.com/ansible/latest/user_guide/vault.html

如果你愿意将密码保存在纯文本文件中,另一种选择是使用带有——extra-vars参数的JSON文件(确保将该文件排除在源代码控制之外):

ansible-playbook --extra-vars "@private_vars.json" playbook.yml 

Ansible从1.3开始就支持这个选项。

用——extra-vars "become_pass=Password"调用你的剧本

become_pass =(“ansible_become_password”、“ansible_become_pass”)