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

Как заставить Ansible использовать пароль, если ключ был отклонен?

Мои новые экземпляры сервера настроены для входа в систему под root через ssh с паролем. Я хочу, чтобы моя книга воспроизведения Ansible перенастроила его, чтобы вместо этого использовать ключи и отключить вход в систему с паролем при первом запуске, поэтому мне нужно что-то вроде этого:

Как я могу этого добиться?

РЕДАКТИРОВАТЬ: Для ясности, я не спрашиваю, как добавить ключ или отключить root, это просто для контекста. Я спрашиваю, как вернуться к паролю, если он не смог пройти аутентификацию с помощью ключа. С участием --ask-pass или ansible_ssh_pass установлен, Ansible даже не будет пытаться использовать аутентификацию с открытым ключом

Вот что я сделаю, если ansible_user отличается для "первого запуска" учебника (например, если у вас есть только root user, и вы собираетесь создать нового пользователя с ключом SSH):

  • Сохраните пароль в ansible_pass как если бы вы использовали парольные входы (не забудьте использовать Vault), это должен быть пароль пользователя, которого вы используете для «первого запуска» playbook.
  • Устанавливать ansible_user на имя пользователя, которого вы хотите использовать после первого запуска, когда у вас есть пользователи, настроенные правильно на сервере.
  • Установите переменную ansible_user_first_run пользователю, которого вы собираетесь использовать для «первого запуска» плейбука, например root.
  • Используйте локальную команду, чтобы попытаться подключиться к серверу с правильным ключом SSH, используя ignore_errors и changed_when: False
  • Если это не удается, обновите ansible_user к стоимости ansible_user_first_run

Вот код:

---
- name: Check if connection is possible
  command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
  register: result
  connection: local
  ignore_errors: yes
  changed_when: False
- name: If no connection, change user_name
  connection: local
  set_fact:
    ansible_user: "{{ ansible_user_first_run }}"
  when: result|failed

Примечание: стоит настроить transport = ssh поскольку paramiko может неожиданно не войти на сервер в некоторых конфигурациях (например, когда сервер настроен так, чтобы не принимать пароли, и вы пытаетесь сначала с ключом, а затем с паролем ... странно!) Также ssh-транспорт быстрее, так что оно того стоит.

Дополнительное примечание: если вы используете этот метод, вам необходимо указать gather_facts: false в вашем файле определения playbook, чтобы задачи установки / сбора фактов не запускались автоматически до того, как вы перейдете к этапу тестирования паролей. Если вам нужен какой-либо из доступных фактов, вам нужно будет явно вызвать setup в вашей роли перед доступом к любым данным, обычно доступным в таких местах, как ansible_devicesи т. д. Хороший способ сделать это - позвонить setup с when предложение, которое проверяет, является ли используемый вами факт пустым или нет, прежде чем вы его вызовете в своей роли.

Ты можешь использовать --ask-pass при запуске ansible-playbook.

Для других задач, которые вы задали, это можно выполнить различными способами, например, с помощью модуля копирования.
Отключение входа в систему root также может быть выполнено, например. по шаблону sshd_conf или вставив строку в файл conf.

Вы можете попробовать PreferredAuthentications вариант, установив его на publickey,password. По умолчанию они включаются в этом порядке вместе с другими параметрами, поэтому вероятно, что ansible устанавливает это. Добавление через -o или клиент ssh_config может предотвратить это.

Вы можете использовать сценарий-оболочку. Например, с этим в key_or_password.sh и pass.sh который дает пароль, работает bash key_or_password.sh root@host попробует ввести открытый ключ, а затем ввести неинтерактивный пароль.

export DISPLAY=dummy:0
export SSH_ASKPASS=$PWD/pass.sh
exec setsid ssh -v -o 'PreferredAuthentications publickey,password' "$@"

Журнал показывает, какой метод был успешным, например

debug1: Authentication succeeded (publickey).