Мои новые экземпляры сервера настроены для входа в систему под 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
.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).