Для авторизации на клиентских устройствах можно использовать 2 метода:

  1. Авторизация с использованием логина и пароля (рассматривалось в более ранней статье)
  2. Авторизация с помощью сертификата

Ansible auth types

Авторизация с помощью сертификата

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

  1. Создаём сертификат для пользователя на хосте, с установленным Ansible
  2. Распространяем этот сертификат на другие хосты

Создание пары ssh ключей

На хосте с установленным Ansible генерируем ключи для пользователя admin (какой пользователь решаете сами). Естественно подразумевается, что и на клиентских устройствах тоже будет присутствовать этот пользователь. Т.е проще чтобы у вас клиентские устройства разворачивались уже с этим пользователем.

Для этого выполняем:

ssh-keygen

На все запросы просто нажимаем ENTER.

В итоге получаем пару закрытого и открытого ключа в каталоге ~/.ssh/

ls ~/.ssh/

Доставка открытого ключа на клиентское устройство

copy public key

Теперь надо полученный публичный ключ доставить на клиентские устройства, чтобы мы могла заходить на них без пароля с основного хоста Ansible.

Для этого выполняем:

ssh-copy-id admin@mylab-vm-2.dc2.my.local

где:

  • admin - пользователь на клиентском устройстве
  • mylab-vm-2.dc2.my.local - наше клиентское устройство, на который мы копируем сертификат

Проверка

Теперь вы можете попытаться залогиниться с хоста Ansible на клиентское устройства. В идеале вы должны залогиниться без запроса пароля.

ssh mylab-vm-2.dc2.my.local

Теперь давайте проверим выполнив, команду Ansible, которая перезагрузит наше клиентское устройство:

ansible mylab-vm-2.dc2.my.local  -a "sudo /sbin/reboot" -i inventory/static.yml

Sudo команды без пароля

Перезагрузка - это команда, выполняемая с наивысшими правами sudo. Т.е Ansible пытается выполнить команду от sudo, но сталкивается с проблемой что на клиентском устройстве для этого нужно ввести пароль.

Для того чтобы такого не происходило можно отключить запрос пароля для команд sudo для пользователя admin.

Для этого на клиентском устройстве:

sudo vim /etc/sudoers.d/admin
admin		ALL=(ALL)       NOPASSWD: ALL

Рекомендуется вместо ALL прописывать конкретные команды, которые можно выполнять без запроса пароля.

Либо вы можете запускать команду ansible-playbook и использованием опции --ask-become-pass, которая приведёт к запросу пароля для sudo. Решать какой именно подход выбирать остаётся за вами.

Автоматизация всего этого

Для того чтобы не выполнять все эти действия на каждом хосте руками можно скачать готовый Ansible playbook c github.