Can Ansible可以使用" sudo su - "如果不允许sudo用户运行任意脚本?

时间:2018-05-24 14:54:25

标签: ansible sudo

我正在尝试使用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 -,但不能使用sudosudo 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 -

4 个答案:

答案 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-东西。但是随之而来的是警告,甚至更糟:使用密码转义。不要去那里。