insiki
@insiki
broken pipe

Как правильно реализовать работу Ansible по SSH?

Собсно сабж.
Вводные данные:
- Мой рабочий ПК с установленным на него Ansible. Для пользователя 'user1', под которым работаю, с помощью ssh-keygen сгенерирована пара ключей (без кодовой фразы) - id_rsa и id_rsa.pub.
- На сервера, на которых заведен такой же пользователь 'user1' (входит в группу sudoers), проброшен открытый ключ id_rsa.pub.
- Как результат - аутентификация "ssh 192.168.1.*" проходит по ключам (пароль не требуется).

На своем рабочем ПК прогоняю:
ansible all -m ping
приходит pong.

Иду дальше, хочу разом обновлять все сервера по типу дистрибутива - deb / rpm.
Обозначил их в /etc/ansible/hosts:
[deb:children]
vms
fileservers
[rpm:children]
gateway

Для deb создаю playbook "upgrade-deb-servers.yml" со следующим содержимым:
---
- hosts: deb
  sudo: true
  tasks:
  - name: update packages
    apt: update_cache=yes
  - name: upgrade packages
    apt: upgrade=dist

Пробую прогнать:
ansible-playbook upgrade-deb-server.yml
PLAY [deb] ******************************************************************** 

GATHERING FACTS *************************************************************** 
fatal: [192.168.1.230] => Missing sudo password
fatal: [192.168.1.231] => Missing sudo password
fatal: [192.168.1.232] => Missing sudo password
fatal: [192.168.1.222] => Missing sudo password

Логично, просит пароль. Добавляю ключ -K (он же --ask-sudo-pass, запрашивает пароль для root удаленной машины):
ansible-playbook -K upgrade-deb-server.yml
Запрашивает пароль, ввожу:
sudo password: 
PLAY [deb] ******************************************************************** 
GATHERING FACTS *************************************************************** 
ok: [192.168.1.230]
ok: [192.168.1.232]
ok: [192.168.1.231]
fatal: [192.168.1.222] => Incorrect sudo password
...
192.168.1.222              : ok=0    changed=0    unreachable=1    failed=0   
192.168.1.230              : ok=3    changed=0    unreachable=0    failed=0   
192.168.1.231              : ok=3    changed=0    unreachable=0    failed=0   
192.168.1.232              : ok=3    changed=0    unreachable=0    failed=0

Уже лучше, но на 192.168.1.222 у меня стоит другой пароль, поэтому введенный пароль не проходит.
Вопрос:
  1. Как быть с хостом, у которого пароль к sudo отличается от других? (Запускать для него playbook отдельно? Или всё таки можно как-то обработать за один playbook в купе с остальными хостами?)
  2. Как с точки зрения безопасности/удобства правильно реализовать работу Ansible по SSH?
  3. Правильно ли я понял, что для работы Ansible подойдет только сгенерированные без кодовой фразы закрытый/открытый ключи через ssh-keygen?
  4. По идеи, я могу сгенерировать пару ключей для root и раскидать их на сервера, но ведь с точки зрения безопасности за это можно дать себе и по рукам?
  • Вопрос задан
  • 16992 просмотра
Решения вопроса 1
insiki
@insiki Автор вопроса
broken pipe
remote_user: user1

не? :D
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
opium
@opium
Просто люблю качественно работать
Пароли использовать в принципе нельзя, с учетом того что ансибл владеет доступом к системе на уровне рута у вас нет по сути другого способа, как использовать пользователя с судо на стороне настраиваемого сервера.
И да если вы профукали доступы к ансибл серверу вы профукали доступ ко всем серверам.
С точки зрения безопасности это вообще нормально, так как логично держать сервер ансибл без возможности внешнего доступа
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
вы можете логин пароль в инвентори файл зашить а сам файл зашифровать в gpg (я так делаю собственно с ключами, вшиваю их в инвентори файл и шифрую). Еще можно поковыряться с ansible vault но это не сильно удобнее.
Ответ написан
@mmblsc
https://habr.com/ru/users/mmblsc/
# выполнить с правами пользователя
become: no 
# выполнить с правами супер пользователя
become: yes

Частая задача должна решаться просто. )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы