我正在尝试使用Ansible在多台远程计算机上自动执行软件安装和设置。我的计算机上的个人用户帐户已被锁定,但我可以使用sudo su -
在我手动登录时成为root用户。一旦我成了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 method / exe运行它。
事实证明,我的用户有权运行sudo su -
,但不能使用sudo
或sudo su -
运行任意脚本,因此Ansible无法运行上述内容。
我最终使用了这样一个丑陋的解决方法:
- name: install Git
shell:
cmd: |
sudo su - <<EOF
yum install -y git
EOF
这很有效,但很难看,并且没有使用Ansible的幂等检查机制。
有没有更好的方法在Ansible中执行此操作,Ansible首先执行sudo su -
,然后在打开的子shell中执行其命令集?或者我运气不好?我怀疑安全团队是否会授予我的用户使用sudo
运行任意脚本的权限。 (另一方面,问问可能没什么坏处。)
这是对类似问题的描述,但建议的解决方案与我上面使用的丑陋相同: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 -
答案 0 :(得分:1)
只需将其添加到剧本:
become: yes
become_method: su
并且在主机服务器上的env变量下运行剧本导出之前:
ANSIBLE_BECOME_EXE=’sudo su -‘
这里是参考文献link。
答案 1 :(得分:0)
我认为这将与
一起使用- name: install Git
yum:
name: git
state: present
become: yes
become_method: sudo
become_exe: "sudo su - /bin/bash -c"
答案 2 :(得分:0)
也许你过度复杂了?试试这种方式 -
- name: install Git
become: yes
become_user: root
shell: yum install -y git
或者最糟糕的是,
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}
这有帮助吗?
答案 3 :(得分:0)
我在teamviewer passwd
上遇到过类似的问题,也不允许我与become: true
一起跑步。我的任务定义是使用ansible设置teamviewer密码:
- name: set teamviewer login to password only
become: true
become_method: sudo
become_flags: 'su - root /bin/bash -c'
command: 'teamviewer passwd {{ teamviewer_password }}'
这将运行:
sudo su - root /bin/bash -c 'teamviewer passwd Th3Passw0r8'
作为旁注:如果您使用become_*
任务而不是shell
,则可以跳过command
-东西。但是随之而来的是警告,甚至更糟:使用密码转义。不要去那里。