这是代码,显示我认为是一个问题:
# Debugging path problems with sudo --- - hosts: webservers remote_user: root tasks: - name: echo path command: echo $PATH register: output changed_when: False - name: display root path output debug: "msg={{ output.stdout }}" # Now try as apache - name: echo path command: echo $PATH become: true become_user: apache become_method: sudo register: output changed_when: False - name: display wrong output debug: "msg={{ output.stdout }}" # This is the fix - name: echo path command: echo $PATH environment: PATH: "{{ ansible_env.PATH }}" become: true become_user: apache become_method: sudo register: output changed_when: False - name: display fixed output debug: "msg={{ output.stdout }}"
这里是输出,你可以看到没有添加“修复”的path是不完整的。
TASK [echo path] *************************************************************** ok: [webapp] TASK [display root path output] ************************************************ ok: [webapp] => { "changed": false, "msg": "/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" } TASK [echo path] *************************************************************** ok: [webapp] TASK [display wrong output] **************************************************** ok: [webapp] => { "changed": false, "msg": "/sbin:/bin:/usr/sbin:/usr/bin" } TASK [echo path] *************************************************************** ok: [webapp] TASK [display fixed output] **************************************************** ok: [webapp] => { "changed": false, "msg": "/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" }
为什么这个修复是必要的,这是一个错误?
这是在CentOS 6.7和使用Ansible 2.0
这是正常和预期的行为。
请记住, sudo在切换用户时会清理环境,这就是为什么最终只有一个最小的默认path。
PATH中剩余的项目来自shell启动脚本,当你(或者说Ansible)调用sudo <command>时候,这些脚本并没有运行,因为它不需要交互或loginshell。
如果您必须运行不在默认位置的命令,请明确提供其path。