Вот что я делаю, если ansible_userотличается для «первого запуска» playbook (например, если у вас есть только rootпользователь, и вы собираетесь настроить нового пользователя с ключом SSH):
- Сохраните пароль,
ansible_passкак если бы вы использовали пароли для входа (не забудьте использовать Vault), это должен быть пароль пользователя, которого вы используете для «первого запуска» книги.
- Задайте
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пункта, который проверяет, является ли факт, который вы используете, пуст или нет, прежде чем вы называете его в своей роли.