我如何指定一个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标志本身不做任何事情(除了提示您输入一个稍后可能使用或不使用的值)。

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

其他回答

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

become_pass =(“ansible_become_password”、“ansible_become_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

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

我在这个问题上撕了我的头发,现在我找到了一个解决方案,这是我想要的:

每台主机1个加密文件,包含sudo密码

/etc/ansible/hosts:

[all:vars]
ansible_ssh_connection=ssh ansible_ssh_user=myuser ansible_ssh_private_key_file=~/.ssh/id_rsa

[some_service_group]
node-0
node-1

然后为每个主机创建一个加密的var文件,如下所示:

ansible-vault create /etc/ansible/host_vars/node-0

与内容

ansible_sudo_pass: "my_sudo_pass_for_host_node-0"

如何组织保险库密码(通过——ask-vault-pass输入)或CFG由您决定

基于此,我怀疑你可以加密整个hosts文件…

以上@toast38coza的解决方案对我来说很管用;只是sudo: yes现在在Ansible中被弃用了。 请使用become和become_user。

tasks:
 - name: Restart apache service
   service: name=apache2 state=restarted
   become: yes
   become_user: root