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

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


当前回答

如果你愿意将密码保存在纯文本文件中,另一种选择是使用带有——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”)

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

我相信,最好的解决方案是沿着上面的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标志本身不做任何事情(除了提示您输入一个稍后可能使用或不使用的值)。

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

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

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

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

可能做到这一点的最好方法——假设你不能使用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

如果您正在使用密码管理器,您可以使用模块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提示。