我如何指定一个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:所有
一个更聪明的方法是将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