Вот код, показывающий, что я считаю проблемой:
# 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 }}"
Вот результат, вы можете видеть, что путь не завершен без добавления «исправления».
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 поступают из сценариев запуска оболочки, которые не запускаются, когда вы (или, скорее, Ansible) вызываете sudo <command>
, потому что он не запрашивает интерактивную оболочку или оболочку входа.
Если вам нужно запустить команду, которая находится не в местоположении по умолчанию, укажите ее путь явно.