Коротко — причин много, но в 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) — помогу разобрать и дам точечное исправление.