Ansible Tower无法分别在Linux主机和本地执行任务,sudo报错如何解决
故障根因
Error: sudo: effective uid is not 0, is /bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
上述报错的触发原因分为三类:
- 本地执行任务的提权配置错误:你配置
connection: local/delegate_to: localhost后,任务会运行在Ansible Tower执行节点的awx运行用户上下文下,该用户默认是普通权限,如果你的任务配置了become: yes但没有给localhost配置对应的sudo提权凭证,就会触发该报错 - 执行节点sudo文件所在分区挂载了
nosuid参数:容器化部署的Ansible Tower/AWX为了安全默认会给系统目录添加nosuid挂载限制,导致sudo命令无法通过suid位完成提权,有效UID无法切换为0 - 本地任务确实不需要提权但错误开启了
become参数:很多localhost执行的任务(比如调用API、生成配置文件)不需要root权限,误开提权会触发不必要的校验报错
修复方案
1. 调整本地任务的提权配置
首先确认你的localhost执行任务是否真的需要root权限,绝大多数场景下本地任务无需提权,直接在本地任务块中关闭提权即可:
- name: 执行跨节点任务 hosts: linux_remote_nodes tasks: # 远程Linux主机执行的任务,保留原有提权配置 - name: 远程主机执行任务 yum: name: nginx state: present become: yes # 本地执行的任务,单独关闭提权 - name: 本地生成配置同步记录 lineinfile: path: /tmp/sync_record.log line: "{{ inventory_hostname }} 安装nginx完成" delegate_to: localhost become: no
如果本地任务确实需要root权限,进入Ansible Tower「凭证」页面,给inventory中的localhost绑定拥有sudo免密权限的本地凭证,提权方式选择sudo并正确填写提权密码。
2. 检查执行节点的挂载参数
- 宿主机部署的Ansible Tower:登录执行节点执行
mount | grep $(df /bin/sudo | awk 'NR==2{print $1}'),如果输出中存在nosuid参数,修改/etc/fstab移除该分区的nosuid参数后重新挂载即可。 - 容器化部署的Ansible Tower/AWX:修改部署清单配置,给
awx-task容器移除nosuid挂载限制,或者开启特权模式(仅测试环境使用,生产环境不推荐)。
3. 拆分不同场景的任务配置
将远程主机任务和本地任务拆分为两个独立的play,分别配置不同的连接和提权参数,避免配置混用:
# 第一个play:远程Linux主机执行 - name: 远程节点任务 hosts: linux_remote_nodes become: yes tasks: - name: 安装基础依赖 yum: name: git state: present # 第二个play:本地执行 - name: 本地节点任务 hosts: localhost connection: local become: no gather_facts: no tasks: - name: 发送执行完成通知 debug: msg: "所有远程节点任务执行完成"
内容的提问来源于stack exchange,提问作者Swati
相关产品推荐
相关产品推荐

