Ansible “отсутствует пароль sudo”, даже если включен sudo без пароля

Вопрос или проблема

У меня в файле sudoers есть

ALL            ALL = (ALL) NOPASSWD: ALL

Что позволяет любому использовать sudo без ввода пароля. И я подтвердил, что могу использовать sudo без пароля, когда вхожу в систему по ssh на машину.

Тем не менее, когда я пытаюсь запустить на ней плейбук, я получаю ошибку “missing sudo password”.

Команда, которую я использую для запуска:

ansible-playbook -i inventory.yaml common_install.yaml --limit vpn.lan.example.com -vvv

Я запускал ту же команду, ограничив её другим хостом, который имеет то же правило sudo, и оба работают на Ubuntu 20.04, и это работает на том хосте. Но на этом хосте не работает.

Почему это не работает?

Возможно, вы не заполнили директорию group_vars или host_vars значениями/файлами имени пользователя и пароля.

Пример директории group_vars:

nodes.yml

ansible_port: 22
ansible_user: username
ansible_password: password
ansible_connection: ssh
ansible_become_pass: otherPassword

Примечание: переменные в директории group_vars/host_vars содержат файлы только с переменными, не включайте ключевое слово vars:, иначе ваши другие переменные будут игнорироваться.

Сообщение об ошибке исходит от команды ansible-playbook, вам нужно предоставить ваш пароль для запуска плейбука. Самый простой способ – использовать опцию -K для ansible-playbook:

  -K, --ask-become-pass # запрос пароля для повышения привилегий
ansible-playbook -K -b -i inventory.yaml common_install.yaml --limit vpn.lan.example.com -vvv

Для получения дополнительных вариантов см. https://stackoverflow.com/questions/60777149/how-to-define-a-script-that-provides-the-become-password-in-ansible

Ответ или решение

Когда вы сталкиваетесь с ошибкой "missing sudo password" в Ansible при включенной безпарольной sudo, важно учитывать несколько факторов, которые могут влиять на это поведение. Даже если вы правильно настроили файл sudoers, что позволяет выполнять команды без запроса пароля, Ansible может по-прежнему запрашивать пароль. Давайте разберёмся в причинах и решениях этой проблемы.

Теория (Theory)

Основной задачей Ansible является автоматизация конфигурации и управления серверами. Оно использует SSH для связи с удалёнными хостами, а также может использовать sudo для выполнения команд с повышенными привилегиями. Когда в файл sudoers добавляется параметр NOPASSWD, это обычно позволяет пользователям выполнять команды sudo без запроса пароля. Однако Ansible, как инструмент, требовательный к аутентификации и безопасности, при обращении к узлам, может интерпретировать настройки иначе.

Одной из причин, по которой Ansible может продолжать запрашивать пароль, является то, как именно сконфигурированы переменные в Ansible. Использование неправильных переменных или ошибок в настройках могут вызвать необходимость в указании пароля, несмотря на наличие конфигурации NOPASSWD в sudoers.

Пример (Example)

Вы уже указали, что строка в вашем sudoers файле выглядит следующим образом:

ALL            ALL = (ALL) NOPASSWD: ALL

Вы также отметили, что при прямом входе через SSH в систему, вы можете использовать sudo без запроса пароля, что указывает на то, что конфигурация sudoers работает правильно. Тем не менее, при запуске Ansible с помощью команды:

ansible-playbook -i inventory.yaml common_install.yaml --limit vpn.lan.example.com -vvv

возникает ошибка "missing sudo password".

Причина, по которой это может происходить, связана с переменными или дополнительными конфигурациями Ansible, которые необходимы для работы без пароля. Например, возможно, вы не указали или неправильно указали переменные уровня хоста или группы, как в следующем примере:

ansible_port: 22
ansible_user: username
ansible_password: password
ansible_connection: ssh
ansible_become_pass: otherPassword

Применение (Application)

Решение данного вопроса требует проверки нескольких ключевых элементов:

  1. Проверьте правильность конфигурации переменных: Убедитесь, что в group_vars или host_vars указаны все необходимые переменные. Особенно обратите внимание на переменную ansible_become, которая отвечает за использование sudo. Она должна быть установлена в true, если вы планируете использовать sudo.

  2. Проверка синтаксиса sudoers: Убедитесь, что в файле sudoers нет синтаксических ошибок и что весь необходимый доступ действительно предоставляется.

  3. Использование флага -K: В Ansible можно явно указать, чтобы пароль для повышения привилегий не запрашивался:

    ansible-playbook -K -i inventory.yaml common_install.yaml --limit vpn.lan.example.com -vvv

    Данный флаг требует от Ansible запроса пароля для sudo, что, на первый взгляд, противоречит нашей цели, но иногда может помочь обойти некорректные настройки переменных.

  4. Проверка других конфигураций: Проверьте другие конфигурационные файлы, такие как /etc/ansible/ansible.cfg, на наличие специфичных установок Authorize или настройки Ansible с другим уровнем аутентификации (например, через SSH-ключи).

  5. Журналы и отладка: Используйте детализированные журналы отладки (-vvv или -vvvv), чтобы детально просмотреть, где может происходить ошибка и какие шаги Ansible предпринимает до запроса пароля.

  6. Обновление и тесты: Периодически стоит обновлять Ansible и точечно тестировать конфигурацию, так как причинами могут быть баги или несовместимость версий.

Следуя вышеописанным рекомендациям, вы сможете выявить и исправить ошибки, связанные с запросом пароля в условиях безпарольной sudo настройки для Ansible.

Оцените материал
Добавить комментарий

Капча загружается...