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

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

其他回答

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

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

只要提示其他解决方案。 你可以设置你的ansible用户在没有密码的情况下运行sudo(这是GCP虚拟机的默认设置)

sudo visudo

添加行(tom是用户):

tom ALL=(ALL) NOPASSWD:ALL

文档强烈建议不要将sudo密码设置为明文:

提醒一下,密码永远不应该以纯文本的形式存储。有关使用Ansible Vault加密您的密码和其他秘密的信息,请参见使用Ansible Vault加密内容。

相反,当运行ansible-playbook时,你应该在命令行上使用——ask-become-pass

之前版本的Ansible使用——ask-sudo-pass和sudo来代替become。

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

[whatever]
some-host ansible_sudo_pass='foobar'

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

一个更聪明的方法是将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