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

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


当前回答

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

每台主机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文件…

其他回答

非常简单,只需在变量file中添加:

例子:

$ vim group_vars/all

加上这些:

Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123

您可以为一个组或所有服务器设置密码:

[all:vars]
ansible_sudo_pass=default_sudo_password_for_all_hosts

[group1:vars]
ansible_sudo_pass=default_sudo_password_for_group1

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

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

一个更聪明的方法是将sudo密码存储在LastPass或KeePass等安全库中,然后使用-e@将其传递给ansible-playbook,但不是在实际文件中硬编码内容,您可以使用构造-e@<(…)在子shell中运行命令,并将其输出(STDOUT)重定向到匿名文件描述符,有效地将密码提供给-e@<(..)。

例子

$ ansible-playbook -i /tmp/hosts pb.yml \
   -e@<(echo "ansible_sudo_pass: $(lpass show folder1/item1 --password)")

以上是做几件事,让我们分解一下。

Ansible-playbook -i /tmp/hosts pb. exeYml -显然运行一个剧本通过ansible-playbook $(lpass show folder1/item1——password)"-执行LastPass CLI的lpass命令,获取要使用的密码 Echo "ansible_sudo_pass:…password…"-获取字符串'ansible_sudo_pass: '并将其与lpass提供的密码结合 -e@<(..) -将上述内容放在一起,并将<(…)的子shell连接为ansible-playbook使用的文件描述符。

进一步的改善

如果你不想每次都输入,你可以这样简单地输入。首先在你的.bashrc中创建一个别名,如下所示:

$ cat ~/.bashrc
alias asp='echo "ansible_sudo_pass: $(lpass show folder1/item1 --password)"'

现在你可以像这样运行你的剧本:

$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)

参考文献

https://docs.ansible.com/ansible/2.4/ansible-playbook.html#cmdoption-ansible-playbook-e

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