下面是显示我认为存在问题的代码:
# 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 }}"
这是输出,您可以看到,如果不添加“the fix”,路径就不完整。
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
答案1
这是正常且预期的行为。
请记住,sudo
切换用户时会净化环境,这就是为什么您最终会得到最小默认 PATH。
PATH 中的其余项目来自 shell 启动脚本,当您(或者更确切地说是 Ansible)调用时这些脚本不会运行sudo <command>
,因为它没有要求交互式或登录 shell。
如果您必须运行不在默认位置的命令,请明确提供其路径。