我如何指定一个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 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:所有

其他回答

查看代码(runner/__init__.py),我认为你可以将其设置在你的库存文件中:

[whatever]
some-host ansible_sudo_pass='foobar'

ansible.cfg配置文件中似乎也有一些规定,但现在还没有实现(constants.py)。

我不认为ansible会让你在标志中指定密码,因为你希望这样做。 可能在配置的某个地方可以设置这个,但这将使使用ansible整体不太安全,不建议使用。

您可以做的一件事是在目标计算机上创建一个用户,并向其授予所有命令或受限制的命令列表的无密码sudo特权。

如果你运行sudo visudo并输入如下一行,那么用户'privilegedUser'在运行sudo service xxxx start时应该不需要输入密码:

%privilegedUser ALL= NOPASSWD: /usr/bin/service

我的黑客自动化这是使用一个环境变量,并通过——extralvars =“ansible_become_pass='{{lookup('env', ' ansible_become_pass ')}}'”访问它。

导出一个env变量,但避免bash/shell历史记录(前面有一个空格或其他方法)。例如:

     export ANSIBLE_BECOME_PASS='<your password>'

查找env变量,同时将额外的ansible_become_pass变量传递到ansible-playbook中,例如:

ansible-playbook playbook.yml -i inventories/dev/hosts.yml -u user --extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"

好的替代答案:

@toast38coza: simply use a vaulted value for ansible_become_pass. This is decent. However, for the paranoid teams that need to share ansible vault passwords, and execute ansible plays with induvidual accounts, they coudld use the shared vault password to reverse each others operating system password (identiy theft). Arguably, you need to trust your own team? @slm's bash subshell output generated to temp file descriptor and using the @ prefix to read the ansible variable from the file desriptor. Avoids bash history at least. Not sure, but hopefully subshell echo doesn't get caught and exposed in audit logging (e.g. auditd).

使用ansible 2.4.1.0和以下应该工作:

[all]
17.26.131.10
17.26.131.11
17.26.131.12
17.26.131.13
17.26.131.14

[all:vars]
ansible_connection=ssh
ansible_user=per
ansible_ssh_pass=per
ansible_sudo_pass=per

然后用这个清单运行剧本:

ansible-playbook -i inventory copyTest.yml

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

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