这里讨论当受管节点的用户被赋予特定命令的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]无法在远程主机上给出。公司政策不允许我所在的组。
答案 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_method
和 become_user
解决了这个问题。
首先,我使用 ansible_user=your_user
在清单文件中指定了用户。然后,我从剧本中删除了 become_method
和 become_user
,只留下 become=yes
有关此答案的更多详细信息,请查看其他 answer。