以slurm用户运行Ansible时ansible.legacy.setup执行失败的解决方法
问题描述
节点启动时以slurm用户执行Ansible playbook,在收集事实(Gathering Facts)阶段失败,报错提示sudo需要密码。该playbook用普通ubuntu用户执行可正常运行,求高效调试方案。
报错详情
TASK [Gathering Facts] ********************************************************* task path: /opt/playbook/site.yml:1 Using module file /usr/local/lib/python3.10/dist-packages/ansible/modules/setup.py Pipelining is enabled. <localhost> ESTABLISH LOCAL CONNECTION FOR USER: slurm <localhost> EXEC /bin/sh -c 'sudo -H -S -n -u root /bin/sh -c '"'"'echo BECOME-SUCCESS-mvloemssulwwmnnhtatxivyevcbshjsb ; /usr/bin/python3'"'"' && sleep 0' fatal: [localhost]: FAILED! => { "ansible_facts": {}, "changed": false, "failed_modules": { "ansible.legacy.setup": { "failed": true, "module_stderr": "sudo: a password is required ", "module_stdout": "", "msg": "MODULE FAILURE See stdout/stderr for the exact error", "rc": 1 } }, "msg": "The following modules failed to execute: ansible.legacy.setup " }
简化后的host文件内容
vpn: children: master: hosts: localhost: ansible_connection: local ansible_python_interpreter: /usr/bin/python3 ansible_user: ubuntu ip: localhost
调试与解决方法
配置slurm用户的免密sudo权限:
用visudo编辑sudoers文件(避免语法错误导致sudo失效),添加规则让slurm用户无需密码执行sudo:slurm ALL=(ALL) NOPASSWD: ALL为降低安全风险,也可仅授权必要命令,比如只允许执行python3:
slurm ALL=(ALL) NOPASSWD: /usr/bin/python3验证host文件配置的执行逻辑:
当前host文件指定了ansible_user: ubuntu,但实际执行用户是slurm,需确认playbook是否强制启用了become,或连接配置是否被覆盖。可尝试显式指定用户执行playbook:ansible-playbook -i hosts site.yml --user=ubuntu --become直接测试slurm用户的sudo能力:
切换到slurm用户,执行sudo -n /usr/bin/python3,若报错说明sudo权限未配置正确;若能正常执行,再测试ansible连接:ansible localhost -i hosts -m setup -u ubuntu --become逐步排查是sudo权限问题还是ansible配置逻辑问题。
明确ansible的become配置:
在host文件的localhost条目下添加become相关参数,明确免密规则:ansible_become: yes ansible_become_method: sudo ansible_become_user: root ansible_become_password: ""
内容的提问来源于stack exchange,提问作者Xaver
相关产品推荐
相关产品推荐

