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