Назад | Перейти на главную страницу

Ansible begin_user не выбирает путь правильно

Вот код, показывающий, что я считаю проблемой:

# 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>, потому что он не запрашивает интерактивную оболочку или оболочку входа.

Если вам нужно запустить команду, которая находится не в местоположении по умолчанию, укажите ее путь явно.