Ansible playbook使用delegate_to时如何以非root用户运行任务
Ansible委派任务become不生效排查指南
下面是按优先级从高到低的排查点:
- 语法缩进错误
你贴出的任务代码存在缩进问题,become、become_user等任务参数必须正确缩进在name字段下方,如果和- name行平级的话,会被Ansible识别为play级配置,不会对当前任务生效。正确的任务写法如下:
- name: Set access to starz app become: yes become_user: starz command: giveaccess {{ inventory_hostname }} {{ access_app_port }} delegate_to: "{{starz_central_node}}"
- 委派目标节点sudo配置错误
检查{{starz_central_node}}节点上的/etc/sudoers配置:
- 确认Ansible连接该节点使用的用户,是否配置了无密码切换到
starz用户的权限,如果切换需要输入密码,Ansible会切换失败 fallback 到root执行 - 确认sudoers中没有设置
Defaults requiretty配置限制非交互式会话切换用户
可以手动用Ansible连接用户登录到委派节点,执行sudo -u starz whoami测试切换是否正常,若需要密码可在对应主机变量中添加ansible_become_password参数传入切换密码,或在sudoers中添加配置:
你的Ansible连接用户名 ALL=(starz) NOPASSWD: ALL
- 更高优先级配置覆盖
检查play级别、inventory主机配置、全局配置中是否有更高优先级的become_user: root配置覆盖了任务级配置,Ansible变量优先级顺序为:额外变量 > 任务级配置 > play级配置 > inventory主机配置 > 全局配置。 - 目标命令设置了SUID权限
检查giveaccess命令是否设置了SUID位,若该命令所有者为root且设置了SUID位,不管哪个用户执行都会以root身份运行。可在委派节点执行以下命令验证:
ls -l $(which giveaccess)
若输出权限位包含s标记(如-rwsr-xr-x),说明设置了SUID权限,可执行chmod u-s $(which giveaccess)取消SUID设置。
- Ansible版本bug
部分旧版本Ansible(如2.8及更早版本)存在delegate_to和become联用时存在已知bug,可升级到最新稳定版Ansible后重新测试。
内容的提问来源于stack exchange,提问作者Arjun Starz
相关产品推荐
相关产品推荐

