Вопрос или проблема
У меня в файле 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)
Решение данного вопроса требует проверки нескольких ключевых элементов:
-
Проверьте правильность конфигурации переменных: Убедитесь, что в
group_vars
илиhost_vars
указаны все необходимые переменные. Особенно обратите внимание на переменнуюansible_become
, которая отвечает за использованиеsudo
. Она должна быть установлена вtrue
, если вы планируете использоватьsudo
. -
Проверка синтаксиса
sudoers
: Убедитесь, что в файлеsudoers
нет синтаксических ошибок и что весь необходимый доступ действительно предоставляется. -
Использование флага
-K
: В Ansible можно явно указать, чтобы пароль для повышения привилегий не запрашивался:ansible-playbook -K -i inventory.yaml common_install.yaml --limit vpn.lan.example.com -vvv
Данный флаг требует от Ansible запроса пароля для
sudo
, что, на первый взгляд, противоречит нашей цели, но иногда может помочь обойти некорректные настройки переменных. -
Проверка других конфигураций: Проверьте другие конфигурационные файлы, такие как
/etc/ansible/ansible.cfg
, на наличие специфичных установок Authorize или настройки Ansible с другим уровнем аутентификации (например, через SSH-ключи). -
Журналы и отладка: Используйте детализированные журналы отладки (
-vvv
или-vvvv
), чтобы детально просмотреть, где может происходить ошибка и какие шаги Ansible предпринимает до запроса пароля. -
Обновление и тесты: Периодически стоит обновлять Ansible и точечно тестировать конфигурацию, так как причинами могут быть баги или несовместимость версий.
Следуя вышеописанным рекомендациям, вы сможете выявить и исправить ошибки, связанные с запросом пароля в условиях безпарольной sudo
настройки для Ansible.