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

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


当前回答

你可以在剧本执行时传递它。语法是-

ansible-playbook -i inventory my.yml \
--extra-vars 'ansible_become_pass=YOUR-PASSWORD-HERE'

但出于安全考虑,这并不是一个好主意。最好使用可靠的拱顶

首先更新你的库存文件如下:

[cluster:vars]
k_ver="linux-image-4.13.0-26-generic"
ansible_user=vivek  # ssh login user
ansible_become=yes  # use sudo 
ansible_become_method=sudo 
ansible_become_pass='{{ my_cluser_sudo_pass }}'
 
[cluster]
www1
www2
www3
db1
db2
cache1
cache2

接下来,创建一个名为password的新加密数据文件。Yml,执行如下命令:

$ ansible-vault create passwd.yml

设置保险箱密码。在提供密码后,该工具将启动您用$ editor定义的任何编辑器。附加以下内容 my_cluser_sudo_pass: your_sudo_password_for_remote_servers 在vi/vim中保存并关闭文件。最后运行playbook如下:

$ ansible-playbook -i inventory --ask-vault-pass --extra-vars '@passwd.yml' my.yml

如何重新编辑我的加密文件

ansible-vault edit passwd.yml

如何更改加密文件的密码

ansible-vault rekey passwd.yml

其他回答

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

你可以使用ansible vault,它会把你的密码编码成加密的vault。之后,你可以使用变量从金库在剧本。

ansible vault的一些文档: http://docs.ansible.com/playbooks_vault.html

我们使用它作为每个环境的保险库。要编辑vault,我们有如下命令: Ansible-vault编辑库存/生产/group_vars/all/vault

如果你想调用保险库变量,你必须使用ansible-playbook的参数如下: Ansible-playbook -s——vault-password-file=~/.ansible_vault.password

是的,我们存储仓库密码在本地目录明文,但这不是更危险的存储根密码为每个系统。根密码在保险库文件中,或者您可以将它像sudoers文件一样用于您的用户/组。 我建议在服务器上使用sudoers文件。下面是组管理的示例: %admin所有=(所有)NOPASSWD:所有

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

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

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"

五年过去了,我可以看出这仍然是一个非常相关的主题。有点像leucos的答案,我发现在我的情况下,只使用ansible工具(没有任何集中的身份验证,令牌或其他东西)。这假设您在所有服务器上都有相同的用户名和相同的公钥。如果你不这样做,当然你需要更具体,并在主机旁边添加相应的变量:

[all:vars]
ansible_ssh_user=ansible
ansible_ssh_private_key_file=home/user/.ssh/mykey
[group]
192.168.0.50 ansible_sudo_pass='{{ myserver_sudo }}'

ansible-vault create mypasswd.yml
ansible-vault edit mypasswd.yml

Add:

myserver_sudo: mysecretpassword

然后:

ansible-playbook -i inv.ini my_role.yml --ask-vault --extra-vars '@passwd.yml'

至少这样你就不用写更多指向密码的变量了。