Ansible Tower执行任务触发sudo权限异常问题求助
问题描述
我在RHEL 8.9上部署了最新版的Ansible Tower,但运行某些特定任务时,总会触发sudo权限相关的错误,错误详情如下:
{ "module_stdout": "", "module_stderr": "sudo: /etc/sudo.conf is owned by uid 65534, should be 0\nsudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1, "_ansible_no_log": false, "changed": false }
我遇到问题的示例任务如下:
- name: Install cx_Oracle Python module pip: name: cx_Oracle state: present - name: Execute SQL to get Schemas from DB ibre5041.ansible_oracle_modules.oracle_sql: username: "{{ db_username }}" password: "{{ db_password }}" mode: "{{ 'sysdba' if ar_orcl_db_sql_user|upper == 'SYS' else 'normal' }}" hostname: "{{ db_host }}" service_name: "{{ db_service_name }}" port: "{{ db_port }}" #sql: "SELECT username FROM dba_users" sql: "SELECT NAME FROM v$database" delegate_to: 127.0.0.1 register: schema_result
奇怪的是,哪怕我注释掉其中任意一个任务,错误依然会出现。我已经检查过Tower所在机器上相关文件的权限和属主,看起来都是正常的:
$ ls -la /usr/bin/sudo ---s--x--x. 1 root root 165528 Dec 7 2021 /usr/bin/sudo $ stat /usr/bin/sudo File: /usr/bin/sudo Size: 165528 Blocks: 328 IO Block: 4096 regular file Device: ca02h/51714d Inode: 9184962 Links: 1 Access: (4111/---s--x--x) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:sudo_exec_t:s0 Access: 2024-02-23 12:17:03.876558806 +0000 Modify: 2021-12-07 12:02:43.000000000 +0000 Change: 2022-11-21 19:52:23.879128352 +0000 Birth: 2022-11-21 19:47:26.179931860 +0000 $ stat /etc/sudo.conf File: /etc/sudo.conf Size: 1786 Blocks: 8 IO Block: 4096 regular file Device: ca02h/51714d Inode: 8619263 Links: 1 Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:etc_t:s0 Access: 2024-02-23 12:17:03.883558691 +0000 Modify: 2021-12-07 11:57:12.000000000 +0000 Change: 2022-11-21 19:52:23.873128307 +0000 Birth: 2022-11-21 19:47:26.165931757 +0000
请问我哪里考虑漏了?
可能的排查方向
根据你的描述,我整理了几个容易忽略的排查点:
确认任务的执行目标节点
你的第一个任务没有设置delegate_to,默认会在Inventory中指定的受控节点上执行,而你只检查了Tower本机的sudo相关文件权限。如果这个任务是在其他节点运行,你需要登录到对应受控节点,检查/etc/sudo.conf和/usr/bin/sudo的属主、权限是否正常——错误提示里的uid 65534是nobody用户,很可能是目标节点上的这两个文件权限出了问题。检查Tower执行环境的权限
第二个任务是委托到Tower本机(127.0.0.1)执行的,哪怕注释第一个任务仍报错,要考虑Tower的执行用户(比如默认的awx用户)是否存在sudo配置异常:- 查看
/etc/sudoers或/etc/sudoers.d/下的配置,确认awx用户是否有无需密码sudo的权限,或者配置是否有语法错误(可以用visudo -c检查)。 - 有可能Tower的虚拟环境(比如Python venv)存在权限继承问题,尝试在Tower的执行环境中手动执行sudo命令,看是否能复现错误。
- 查看
SELinux上下文异常排查
虽然你看到stat输出的SELinux上下文是正常的,但有时候SELinux的规则会导致权限拦截。可以临时执行setenforce 0关闭SELinux,再重新运行任务测试——如果问题消失,就需要调整SELinux的规则(比如用restorecon /usr/bin/sudo /etc/sudo.conf修复上下文,或者添加自定义规则)。重新修复sudo的setuid权限
有时候文件权限的显示和实际生效可能存在不一致(比如文件系统缓存问题),可以手动重新设置sudo的setuid位:chmod u+s /usr/bin/sudo chown root:root /etc/sudo.conf执行后重启机器或sudo服务,再测试任务。
Tower作业模板配置检查
检查你的Tower作业模板是否设置了错误的选项:比如是否强制使用了某个非root用户执行sudo,或者开启了become但配置的become_user不正确。
备注:内容来源于stack exchange,提问作者Budianto IP

