Почему в Ansible не работает повышение привилегий (become) на хосте с Ubuntu 26.04 LTS?

Контроллер Ansible — Ubuntu 22.04 LTS: <br/> <code class="bash">ansible [core 2.17.13]</code> <br/><br/> Управляемый хост: <br/> <pre><code class="bash">Distributor ID: Ubuntu
  • 1 июня 2026 г. 14:01
Ответы на вопрос 1
Коротко — причин много, но в 99% случаев проблема с повышением привилегий через Ansible на новом хосте сводится к одному из трёх: sudo/аналог не установлен или не в PATH, пользователь не имеет права sudo (или sudo требует пароль и нет tty/askpass), либо Ansible неправильно настроен (неправильный become_method / интерпретатор Python). Ниже — конкретный план диагностики и типичные решения.

1) Быстрая диагностика вручную (на контроллере):
- Попробуйте по SSH выполнить sudo напрямую, чтобы понять поведение sudo:
  - ssh user@host 'sudo -l'   — покажет, что разрешено/нельзя
  - ssh user@host 'sudo whoami'
  - ssh -t user@host 'sudo whoami'   — проверит, нужен ли tty
- Проверьте наличие sudo:
  - ssh user@host 'command -v sudo || echo "sudo not found"'
- Проверьте, в какой группе пользователь:
  - ssh user@host 'id'

2) Запуск Ansible с максимальным логом — присылает точную ошибку:
- На контроллере:
  - ansible host -m ping -u user -b -vvvv
  - или ansible-playbook play.yml -i inventory -u user -b -vvvv
  Посмотрите конкретную ошибку (например “sudo: a password is required”, “no tty present and no askpass program specified”, “no such file or directory: /usr/bin/sudo”, или ошибки Python).

3) Частые причины и как их исправить

A. Пользователь не в sudoers или sudo требует пароль
- Симптомы: “a password is required”, “user is not in the sudoers file”, Ansible просит become password или падает.
- Решение:
  - Добавьте пользователя в sudoers (или группу sudo) или обеспечьте NOPASSWD для Ansible:
    - sudo visudo -f /etc/sudoers.d/ansible
    - строка: ansibleuser ALL=(ALL) NOPASSWD: ALL
    - установить права 0440
  - Либо запускать Ansible с запросом пароля повышения: --ask-become-pass (-K) или задать ansible_become_pass (не рекомендуется хранить в явном виде).

B. sudo требует tty / нет askpass
- Симптом: “no tty present and no askpass program specified”
- Решение:
  - Уберите опцию requiretty (чаще встречается в RHEL); или
  - Запускайте с явным tty (-t при ssh; Ansible обычно не использует tty) — лучше разрешить NOPASSWD или настроить askpass.
  - Можно установить sudoers-параметр Defaults: Defaults:ansibleuser !requiretty

C. /usr/bin/sudo не найден (PATH/будет другой инструмент)
- Симптом: ошибка “/usr/bin/sudo: No such file or directory” или “sudo: command not found”
- Решение:
  - Установите sudo: sudo apt install sudo
  - Или укажите правильный путь в sudoers/ansible (обычно не нужно). Если на системе используется другой эскалационный инструмент (doas, su), укажите become_method: doas/su в inventory/playbook:
    - ansible_become_method=doas

D. Проблемы с Python на хосте
- Симптом: ошибки модуля, “/usr/bin/python not found”, «failed to find interpreter»
- Решение:
  - Убедитесь, что на удалённом хосте установлен Python 3 (обычно /usr/bin/python3).
  - Установите в inventory/playbook: ansible_python_interpreter=/usr/bin/python3
  - Пример: host ansible_host=1.2.3.4 ansible_user=ubuntu ansible_become=true ansible_python_interpreter=/usr/bin/python3

E. Неправильный become_method
- По умолчанию Ansible использует sudo. Если система использует su/doas, явно укажите:
  - ansible_become_method=sudo (или doas, su)
  - ansible_become_user=root

4) Пример правильной записи в inventory (без пароля):
host.example.com ansible_user=ubuntu ansible_become=true ansible_become_method=sudo ansible_python_interpreter=/usr/bin/python3

5) Что сделать прямо сейчас и прислать мне (если не помогло)
- Выполните: ansible host -m ping -u user -b -vvvv
- Вставьте сюда (или в личку) вывод с -vvvv — посмотрю конкретную ошибку и скажу точное решение.

Если хотите, укажите точную ошибку/вывод Ansible (-vvvv) — помогу разобрать и дам точечное исправление.
Похожие вопросы