我正在尝试使用Ansible自动化在多台远程机器上安装和设置软件。我的个人用户账户在机器上被锁定,但是当我手动登录后,我可以使用
当我尝试通过Ansible执行此操作时,我尝试使用Ansible的
当我运行此命令时,出现错误提示,指出我的用户不被允许运行该命令。
这个方法可以工作,但很丑陋,而且没有使用Ansible的幂等性检查机制。在Ansible中有更好的方法来执行
sudo su -
变成root用户,然后我可以运行像yum install git
这样的命令。当我尝试通过Ansible执行此操作时,我尝试使用Ansible的
yum
模块:- name: install Git
yum:
name: git
state: present
become: yes
become_method: sudo
become_user: root
become_exe: "sudo su -"
当我运行此命令时,出现错误提示,指出我的用户不被允许运行该命令。
sudo su - root /tmp/foobarbazblablabla
发生的情况是Ansible将所有的Yum命令放入一个临时脚本文件中,然后尝试使用become方法/exe运行该脚本。
结果我的用户有权限运行sudo su -
,但不能使用sudo
或sudo su -
运行任意脚本,因此Ansible无法运行上述命令。
最终我使用了一个丑陋的解决方法,如下:
- name: install Git
shell:
cmd: |
sudo su - <<EOF
yum install -y git
EOF
这个方法可以工作,但很丑陋,而且没有使用Ansible的幂等性检查机制。在Ansible中有更好的方法来执行
sudo su -
,然后在打开的子shell中执行其一系列命令吗?或者我对此不太了解?我怀疑安全团队会授予我的用户权限以使用sudo
运行任意脚本。(另一方面,询问一下也许不会有害。)这是一个类似问题的描述,但是建议的解决方案与我上面使用的丑陋hack相同: https://gist.github.com/nanobeep/3b3d614a709086ff832a还有一个非常相似的错误实例,我遇到了一个非常相似的错误: https://www.reddit.com/r/devops/comments/53hukf/ansible_centrify_become_root/
fatal: [hostname]: FAILED! => {"changed": false, "failed": true, "module_stderr": "",
"module_stdout": "Sorry, user username is not allowed to execute
'/bin/sh -c echo BECOME-SUCCESS-msylkobbkasuuxlawgqppdpjxmeqirgd; LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
/usr/bin/python /home/username/.ansible/tmp/ansible-tmp-1474243234.94-154392424015843/lineinfile; rm -rf \"/home/username/.ansible/tmp/ansible-tmp-1474243234.94-154392424015843/\" > /dev/null 2>&1'
as root on hostname.\r\n", "msg": "MODULE FAILURE", "parsed": false}
更新 如果运行 sudo -l
, 将显示以下内容:
User foo may run the following commands on this host:
(root) /bin/kill
(root) /bin/su - bar
(root) su -
sudo -l
命令,它会显示什么? - Paul Hodgessudo -l
的输出添加到问题中。 - nwinklerANSIBLE_BECOME_EXE='sudo su -'
有助于使用sudo su进行特权升级 https://www.coveros.com/ansible-privledge-escalation-using-sudo-su/ - Kohei Nozaki