【问题标题】:Ansible and "sudo su - "Ansible 和“sudo su -”
【发布时间】:2019-11-01 13:56:29
【问题描述】:

我正在尝试创建一个适用于我当前工作环境的 ansible playbook。我使用 ssh 密钥以用户“myuser”的身份登录服务器。我从来没有给过密码,所以我不知道。我运行的大多数命令都是以不同的非 root 用户身份执行的——例如“应用管理员”。我通过“sudo su - appadmin”成为这些用户,因为我也没有这个用户的密码。

我尝试过的不同变体要么抱怨“sudo:需要密码”,要么在 12 秒后超时。我将展示第二个示例。

剧本很简单:

---
- hosts: sudo-test
  gather_facts: False
  remote_user: myuser
  become: yes
  become_user: appadmin
  tasks:
    - name: who
      shell: whoami > qwert.txt

我的主机入口如下:

[sudo-test]
appserver.example.com ansible_become_method=su ansible_become_exe="sudo su"

这是我得到的错误:

pablo@host=> ansible-playbook test_sudo.yml

PLAY [sudo-test] ****************************************************************************************************

TASK [who] **********************************************************************************************************
fatal: [appserver.example.com]: FAILED! => {"msg": "Timeout (12s) waiting for privilege escalation prompt: "}
        to retry, use: --limit @/home/pablo/ansible_dir/test_sudo.retry

PLAY RECAP **********************************************************************************************************
appserver.example.com : ok=0    changed=0    unreachable=0    failed=1

此时我同意剧本和库存配置正确。我认为问题在于 /etc/sudoers 不允许我的“appadmin”用户以允许我利用 ansible 成为另一个用户的能力的方式运行。 This thread 描述了类似的场景和限制。

/etc/sudoers 的相关部分如下所示:

User myuser may run the following commands on this host:
    (root) NOPASSWD: /bin/su - appadmin

看来我必须让系统管理员将其更改为:

User myuser may run the following commands on this host:
    (root) NOPASSWD: /bin/su - appadmin *

这听起来对吗?

【问题讨论】:

  • 使用 -vvvv 运行 Ansible 命令以查看 Ansible 执行 sudo 的确切命令。这个其他答案可能会有所启发,但它适用于不同的场景:stackoverflow.com/a/56721207/608820。这将有助于诊断问题。要修复它,您可能需要更改服务器的配置,或者您可以使用不同的 become_method
  • 感谢您的建议。在详细模式下运行会产生相当多的输出,但我认为最相关的 sn-p 如下:```ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications =gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=pmena -o ConnectTimeout=10 -o ControlPath=/home/pablo/.ansible/cp/b70630738d -tt appserver.example。 com /bin/sh -c '"'"'sudo su - ooiui -c '"'"'"'"'"'"'"'"'/bin/sh -c '"'"'"'"' "'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-* `
  • 这行不通。这是 ansible 权限提升的已知限制:it must be general 即不限于某些命令(这​​是您的情况)。

标签: ansible


【解决方案1】:

我没有发现 yaml 有任何问题,事实上我在我的 ansible2.8 环境中对其进行了测试。

---
- hosts: node1
  gather_facts: False
  remote_user: ansible
  become: yes
  become_user: testuser
  tasks:
    - name: who
      shell: whoami
      register: output

    - debug: var=output

和库存:

[node1]
node1.example.com ansible_become_method=su ansible_become_exe="sudo su"

输出:

TASK [debug] ****************************************************************************************************************************
ok: [node1.example.com] =>

我会要求您在 ansible.cfg 文件中增加 ssh 计时器(取消注释超时行并将其设置为 60,无论您希望什么秒数)并观察这种情况。

# SSH timeout
#timeout = 300

【讨论】:

  • 感谢您的建议。我取消注释评论字段并将其更改为 60 秒,但行为的唯一变化是超时错误发生在 62 秒而不是 12 秒之后。在 Google 中挖掘似乎这可能是“appadmin”用户的限制在“appserver”主机上的 /etc/sudoers 中设置。现在相关条目是“(root)NOPASSWD:/bin/su - appadmin”,这可能有问题。不幸的是,这是另一个团队控制 sudo 访问,所以如果是这种情况,我可能会不走运。
【解决方案2】:

试试这个:

- hosts: application
  become: yes
  become_exe: "sudo su - appadmin"
  become_method: su
  tasks:

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2020-02-20
    • 2017-02-04
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多