受管节点上特定sudo命令的不良行为

时间:2019-06-22 18:02:38

标签: ansible sudo

这里讨论当受管节点的用户被赋予特定命令的sudo特权时的ansible行为。

我对远程受管主机[rm-host.company.com]具有特定命令的sudo特权。其中两个是:

   /bin/mkdir /opt/somedir/unit*
   /bin/chmod 2775 /opt/somedir/unit*

PS:远程节点上的/ opt / somedir已经存在。

我的Ansible控制机器版本:

ansible 2.7.10
python version = 2.7.5 (default, Mar 26 2019, 22:13:06) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

即使使用上面列出的chmod和mkdir的sudo权限,当我使用ansbile“文件”模块时,YAML代码也会失败。

   - name:  7|Ensure Directory - "/opt/somedir/{{ ENV_CHOSEN }}" Permissions are 2775

     become: yes
     become_method: sudo
     file: path="/opt/somedir/{{ ENV_CHOSEN }}" state=directory mode=2775

     when:
       - ansible_facts['os_family'] == "CentOS" or ansible_facts['os_family'] == "RedHat"
       - ansible_distribution_version | int >= 6
       - http_dir_path.stat.exists == true
       - http_dir_path.stat.isdir == true
       - CreateWebAgentEnvDir is defined
       - CreateWebAgentEnvDir is succeeded

     register: ChangeDirPermission

   - debug:
       var: ChangeDirPermission

运行时错误:

TASK [7|Ensure Directory - "/opt/somedir/unitc" Permissions are 2775] **************************************************************************************************************************************************************************************
fatal: [rm-host.company.com]: FAILED! => {"changed": false, "module_stderr": "FIPS mode initialized\r\nShared connection to rm-host.company.com closed.\r\n", "module_stdout": "sudo: a password is required\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
        to retry, use: --limit @/u/joker/scripts/Ansible/playbooks/agent/plays/agent_Install.retry

PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************
rm-host.company.com     : ok=9    changed=2    unreachable=0    failed=1

但是当我使用命令模块时会成功,例如:

  - name:  7|Ensure Directory - "/opt/somedir/{{ ENV_CHOSEN }}" Permissions are 2775

     command: sudo /bin/chmod 2775 "/opt/somedir/{{ ENV_CHOSEN }}"

     when:
       - ansible_facts['os_family'] == "CentOS" or ansible_facts['os_family'] == "RedHat"
       - ansible_distribution_version | int >= 6
       - http_dir_path.stat.exists == true
       - http_dir_path.stat.isdir == true
       - CreateagentEnvDir is defined
       - CreateagentEnvDir is succeeded

     register: ChangeDirPermission

   - debug:
       var: ChangeDirPermission

捕获到的成功运行时调试输出:

TASK [7|Ensure Directory - "/opt/somedir/unitc" Permissions are 2775] **************************************************************************************************************************************************************************************
 [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo

changed: [rm-host.company.com]

TASK [debug] *************************************************************************************************************************************************************************************************************************************************
ok: [rm-host.company.com] => {
    "ChangeDirPermission": {
        "changed": true,
        "cmd": [
            "sudo",
            "/bin/chmod",
            "2775",
            "/opt/somedir/unitc"
        ],
        "delta": "0:00:00.301570",
        "end": "2019-06-22 13:20:17.300266",
        "failed": false,
        "rc": 0,
        "start": "2019-06-22 13:20:16.998696",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "",
        "stdout_lines": [],
        "warnings": [
            "Consider using 'become', 'become_method', and 'become_user' rather than running sudo"
        ]
    }
}

问题

如何在不使用命令模块的情况下完成这项工作?我想坚持使用'become','become_method'而不是在命令模块中运行sudo的ansible核心模块。

注意

当为所有命令启用sudo时,它起作用。但是[user ALL =(ALL)NOPASSWD:ALL]无法在远程主机上给出。公司政策不允许我所在的组。

2 个答案:

答案 0 :(得分:0)

简短的回答是您不能。 ansible的工作方式是通过在远程主机中执行python脚本(原始,命令和shell模块除外)。

file模块使用一长行参数执行this script。但是ansible首先将成为必需的用户,在这种情况下,将通过在远程ssh会话中运行root来成为sudo -H -S -n -u root /bin/sh的用户(请记住,此命令在您的情况下可能会略有不同)。

一旦远程登录的用户成为root用户,Ansible将上载并执行file.py脚本。

在您的情况下,您似乎需要恢复以使用原始,命令或外壳程序,以运行特权命令。

要对此有更好的了解并查看正在执行的命令的详细信息和顺序,请使用参数ansible-playbook运行-vvvv

答案 1 :(得分:0)

我通过从剧本中删除 become_methodbecome_user 解决了这个问题。

首先,我使用 ansible_user=your_user 在清单文件中指定了用户。然后,我从剧本中删除了 become_methodbecome_user,只留下 become=yes

有关此答案的更多详细信息,请查看其他 answer