Як зробити пароль Ansible для використання, якщо ключ було відхилено?


14

Мої нові екземпляри сервера налаштовані для входу в root через ssh з паролем. Я хочу, щоб моя книжка "Ansible" переконфігурувала її для використання клавіш і відключення root-коду з паролем під час першого запуску, тому мені потрібно щось подібне:

  • спробуйте увійти за допомогою ключа
  • якщо ви не можете увійти за допомогою ключа:

    • увійти з паролем
    • додати ключ до авторизованих_колій
    • вимкнути логін root з паролем
    • необов'язково підключіться за допомогою ключа
  • робити інші завдання

Як я можу це досягти?

EDIT : Щоб зрозуміти, я не запитую, як додати ключ або відключити root, це лише для контексту. Я запитую, як відновлювати пароль, якщо він не міг автентифікувати ключ. За допомогою --ask-passабо ansible_ssh_passвстановленого режиму Ansible навіть не намагатиметься використовувати автентифікацію відкритих ключів


Добре запитання, що ви пробували поки що?
dawud

1
Я переніс конфігурацію ssh до окремої ігрової книги і запускаю її з опцією -k, потім я запускаю основну книгу без -k (використовуючи ключ від агента). Я сподівався, що він може бути загорнутий в єдину програму
ігрових книжок

@ petr0 Це працює для мене, коли пароль на запит передачі призначений для іншого користувача, ніж ключ (тобто коли ви перемикаєте віддаленого користувача після відключення пароля ssh). Не впевнений, чи допоможе це.
DylanYoung

Відповіді:


6

Ви можете спробувати 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).

7

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


Ваше рішення хороше, але ви повинні додати gather_facts: noзупинку анзібла, намагаючись підключитися під час запуску
ігрової книги

Ви праві. У мене збираються_факти для всіх моїх ігрових книг, так що я повинен викликати "налаштування" явно. Я забув згадати про це у відповіді, я її зараз оновлю.
Том Булл

5

Ви можете використовувати --ask-passпід час роботи ansible-playbook.

Для інших завдань, які ви задали, це можна досягти різними способами, наприклад, модулем копіювання.
Відключення кореневого входу також можна зробити, наприклад. шляхом шаблонування sshd_confабо вставлення рядка в конф-файл.


-ask-pass (що таке саме як -k) - це те, що я роблю, і я написав про це в коментарі вище
petr0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.