Ansible临时命令与剧本中become-user的差异及权限问题排查
问题描述
我通过LDAP用户登录Ansible,随后sudo切换为db2inst1用户执行命令。临时命令模式运行正常,但使用剧本执行时提示需将用户添加至sudoers文件,执行失败。
正常运行的临时命令
ansible all -i ftest.lst -e ansible_user=user@a.com -e "ansible_ssh_pass={{pass}}" -e "ansible_become_pass={{test_user}}" -e "@pass.yml" --vpas vault -a ". /home/db2inst1/sqllib/db2profile;db2pd -hadr -alldbs;whoami" -m raw -b --become-user=db2inst1
剧本执行情况
执行命令:
ansible-playbook -i ftest.lst -e target=test -e ansible_user=user@a.com -e "ansible_ssh_pass={{pass}}" -e "ansible_become_pass={{test_user}}" -e "@pass.yml" --vpas vault test.yml
test.yml关键配置:
become: true become_user: "{{ instance }}"
已传入参数instance=db2inst1
报错信息
fatal: [hostname123.a]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "module_stderr": "Shared connection to hostname123.a closed.\r\n", "module_stdout": "\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
排查与解决方法
Raw模块与常规模块的差异
临时命令使用-m raw模块,直接通过SSH发送命令,无Ansible模块封装逻辑;而剧本默认使用常规模块(如command/shell),会先在目标主机执行Python模块,该过程的sudo规则与直接执行命令不同,可能触发权限限制。检查sudoers配置细节
确保LDAP用户user@a.com的sudo规则允许切换到db2inst1时执行Python解释器及Ansible临时文件相关操作,而非仅限制db2命令。示例规则:
user@a.com ALL=(db2inst1) NOPASSWD: ALL
若需要输入密码,移除规则中的NOPASSWD并确保become_pass参数正确传递。
- 在剧本中使用raw/shell模块
保持与临时命令一致的执行逻辑,在剧本中改用raw或shell模块编写命令串:
- name: 执行db2相关操作 hosts: "{{ target }}" tasks: - name: 切换至db2inst1用户执行命令 raw: ". /home/db2inst1/sqllib/db2profile;db2pd -hadr -alldbs;whoami" become: true become_user: "{{ instance }}"
- 开启调试日志定位问题
执行剧本时添加-vvv参数,查看详细stderr输出,明确sudo被拒绝的具体原因:
ansible-playbook -i ftest.lst -e target=test -e ansible_user=user@a.com -e "ansible_ssh_pass={{pass}}" -e "ansible_become_pass={{test_user}}" -e "@pass.yml" --vpas vault test.yml -vvv
内容的提问来源于stack exchange,提问作者user19137493
相关产品推荐
相关产品推荐

