Вот что я делаю, если 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
пункта, который проверяет, является ли факт, который вы используете, пуст или нет, прежде чем вы называете его в своей роли.