При работе с Ansible часто возникает задача: настроить доступ к удалённым серверам по SSH-ключам, чтобы отказаться от ввода пароля при каждом подключении. Для этого удобно использовать роль ssh_authorized_key, которая автоматически добавит нужный публичный ключ в authorized_keys на целевых серверах.
Структура роли
Простейшая роль для заливки ключа в root выглядит так:
roles/ssh_authorized_key/defaults/main.yml
---
ssh_key: ~/.ssh/ansible.pub
roles/ssh_authorized_key/tasks/main.yml
---
- name: Set authorized key taken from file
authorized_key:
user: <username> #вот тут ОБЫЧНЫЙ пользак с правами sudo
state: present
key: "{{ lookup('file', ssh_key) }}"
Здесь мы используем модуль Ansible authorized_key, который добавляет публичный ключ в ~/.ssh/authorized_keys.
Inventory и переменные
Пример inventory-файла:
inventory
[groupname]
<alias> ansible_host=<IP>
Переменные для группы:
group_vars/groupname
---
ansible_connection: ssh
ansible_port: 22
ansible_user: <username> #ОБЫЧНЫЙ пользак с правами sudo
# ansible_password: password # пароль можно не хранить в файле
ansible_ssh_private_key_file: ~/.ssh/ansible
⚠️ Рекомендуется не хранить пароль в group_vars. Лучше вводить его при запуске через ключ
-k.
Плейбук
rolebook.yml
---
- name: Rolebook
hosts: <groupname>
become: yes
roles:
- {role: ssh_authorized_key, when: ansible_system == 'Linux'}
-
become: yes— используется, чтобы Ansible мог переключиться наrootи положить ключ в егоauthorized_keys. -
Т.к. подключение идёт не от root, то дополнительно понадобится
-K(ввод пароля дляsudo).
Запуск
ansible-playbook rolebook.yml -kK
-
-k— попросит SSH-пароль для пользователя<username>. -
-K— попросит sudo-пароль для<username>, чтобы выполнитьbecome: root.
После того как ключ добавлен, при последующих запусках можно подключаться напрямую по ключу:
ansible-playbook rolebook.yml -K
Итог
-
Роль
ssh_authorized_keyавтоматизирует настройку SSH-доступа. -
Не стоит хранить пароль в
group_vars, достаточно использовать-kK. -
После первого запуска доступ к root по ключу обеспечен.
Таким образом, Ansible позволяет легко перевести инфраструктуру на работу через SSH-ключи и избавиться от постоянного ввода паролей.