Ось, що я роблю, якщо ansible_user
для "першого запуску" в програмі "інше" (наприклад, якщо у вас є лише 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
оскільки параміко може несподівано не ввійти на сервер у деяких конфігураціях (наприклад, коли сервер налаштований не приймати паролі, і ви намагаєтеся спочатку з ключем, а потім паролем ... дивно!) Також транспорт ssh швидше, тому все одно варто.
Подальше зауваження: Якщо ви використовуєте цей метод, вам потрібно вказати gather_facts: false
у файлі визначення вашої ігрової книги так, щоб завдання налаштування / збору фактів не виконувалися автоматично, перш ніж ви перейдете до етапу тестування паролів. Якщо вам потрібен будь-який з відповідних фактів, вам потрібно буде чітко зателефонувати setup
у свою роль, перш ніж отримати доступ до будь-якої з даних, зазвичай доступних у таких місцях, як ansible_devices
і т. Д. Один хороший спосіб зробити це - зателефонувати setup
з when
пунктом, який перевіряє, чи немає факт, який ви використовуєте, порожній чи ні перед тим, як називати його у своїй ролі.