我想在完全自动化的环境中使用ansible,我无法手动输入密码。为了解决这个问题,我使用SSH公钥连接服务器,并在apt-get install *
配置中将sudoers
等多个命令列入白名单,因此我不需要密码来运行它们。例如sudo apt-get install git
。
但是,如果剧本中的become
设置为True
,则ansible会要求我输入不需要的密码。
myuser ALL = NOPASSWD: /usr/bin/apt-get install *
- name: install the latest version of ntpdate
package:
name: ntpdate
state: latest
become: True
生成此输出:
failed: [x.x.x.x] (item=ntpdate) => {"failed": true, "item": "python3-dev", "module_stderr": "", "module_stdout": "sudo: a password is required\r\n", "msg": "MODULE FAILURE", "rc": 1}
答案 0 :(得分:1)
在我所做的所有Ansible剧本中,我只做了两件事,以便任务运行成为:真
在具有以下内容的目标主机上创建文件/etc/sudoers.d/demo
:
演示ALL =(ALL)NOPASSWD:ALL
使用ssh-copy-id
答案 1 :(得分:1)
template / without_sudo
%sudo ALL=(ALL) NOPASSWD: ALL
%sudo ALL=(ALL) NOPASSWD: /sbin/poweroff, /sbin/reboot, /sbin/shutdown
tasks / main.yml
- name: Sudoers no password
raw: echo '{{ user_password }}' | sudo -S sh -c 'echo "{{ lookup('file', 'templates/without_sudo') }}" > /etc/sudoers.d/without_sudo'
其余的ansible命令没有sudo
答案 2 :(得分:0)
简单的答案是,如果不启用所有命令(或至少python
),则无法执行此操作。
Ansible不会按预期运行命令。它运行Python脚本。使用ansible-playbook
执行-vvv
时,您可以看到确切的命令。它们要复杂得多,要启用它们,您必须将它们添加到sudoers
,例如:
sudo -H -S -n -u root /bin/sh -c '"'"'echo BECOME-SUCCESS-xxxxxx;
/usr/bin/python /var/www/.ansible/tmp/ansible-tmp-xxxxxxxx/apt.py;
rm -rf "/var/www/.ansible/tmp/ansible-tmp-xxxxxxxx/" > /dev/null 2>&1'"'"'
&& sleep 0
棘手的部分是所有空格,引号和其他特殊字符都是相关的,并且在通过反复试验获得正确的命令模式之前,用通配符替换字符,系统将不允许命令以提升的权限运行。实际上,您无法将Ansible运行的所有命令列入白名单。
唯一的例外是raw
模块,它完整地运行给定命令。
答案 3 :(得分:0)
您可以将带有sudo的ansible'command'模块用作命令的一部分,而不是'become:yes'
- name: install the latest version of ntpdate
command: 'sudo apt-get update ntpdate'
缺点是,它的可移植性较差。好处是,它的工作原理是...,您只需要将特定命令列入白名单。
答案 4 :(得分:-1)
在我看来,如果你用=(ALL)NOPASSWD:ALL设置你的节点。然后任何人:包括黑客可以访问你的节点。
所以我可以建议,
ansible-playbook <name>.yml --ask-sudo-pass
这将询问您的节点sudo密码。你可以执行你的操作,因为我猜你知道你的节点的凭证。