如果不允许 sudo 用户运行任意脚本,Ansible 可以使用“sudo su -”吗?

nwi*_*ler 5 sudo ansible

我正在尝试使用 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 -"
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,它失败并出现错误,指出不允许我的用户运行该命令

sudo su - root /tmp/foobarbazblablabla
Run Code Online (Sandbox Code Playgroud)

发生的情况是,Ansible 将所有 Yum 命令放入临时脚本文件中,然后尝试使用变为方法/exe 来运行该文件。

事实证明,我的用户有权运行sudo su -,但不能使用sudo或运行任意脚本sudo su -,因此 Ansible 无法运行上述内容。

我最终使用了一个丑陋的解决方法,如下所示:

- name: install Git
  shell:
    cmd: |
      sudo su - <<EOF
      yum install -y git
      EOF
Run Code Online (Sandbox Code Playgroud)

这可行,但很丑陋,并且不使用 Ansible 的幂等检查机制。

在 Ansible 中是否有更好的方法来执行此操作,其中 Ansiblesudo 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}
Run Code Online (Sandbox Code Playgroud)

更新如果我运行sudo -l,将显示以下内容:

User foo may run the following commands on this host:
    (root) /bin/kill
    (root) /bin/su - bar
    (root) su -
Run Code Online (Sandbox Code Playgroud)

Mad*_*ike 5

我对 也有类似的问题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 }}'
Run Code Online (Sandbox Code Playgroud)

这将运行:

sudo su - root /bin/bash -c 'teamviewer passwd Th3Passw0r8'
Run Code Online (Sandbox Code Playgroud)

作为旁注:become_*如果您使用shell-task 而不是 ,则可以跳过 -stuff command。但随之而来的是 ansible 警告和更糟糕的情况:用你的密码逃离地狱。别去那里。


Mil*_*eek 1

认为这将与

- name: install Git
  yum:
    name: git
    state: present
  become: yes
  become_method: sudo
  become_exe: "sudo su - /bin/bash -c"
Run Code Online (Sandbox Code Playgroud)

  • @nwinkler 最终,如果他们将您锁定,那么允许“sudo su -”可能是一个意外。出于可审核性的原因,sudo 总是比 su 更好,因此如果它们阻止 sudo 使用,则允许“sudo su”似乎是无意的。 (2认同)