Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Изменить пароль пользователя в настройках роли при смене пароля пользователя на удаленном хосте ansible

Имеем Ansible, роль common_users, которая создает на хостах пользователей, с предустановленным паролем. Пароль юзера одинаков на всех хостах.
Далее сценарий: пользователь меняет свой пароль на одном из хостов.
Проблема в следующем:
Как изменить пароль в конфигах роли Ansible, чтобы при следующем проходе Ansible пароль юзера изменился на остальных хостах.


Ответ

Допустим есть роль server_admin, в которой вы создаёте спец. пользователя admin.
Файл roles/server_admin/tasks/main.yml
- name: add special user user: name={{ server_admin.login }} password={{ server_admin.password }}
В реальности, конечно, нужно бывает сразу предусмотреть список спец. пользователей (ну а вдруг понадобится больше одного?), что-то вроде:
- name: add special users user: name={{ item.username}} password={{ item.password }} groups=wheel with_items: - "{{ server_admins.special_userss }}"
но будем считать, что нужно создать одного.
При этом у нас в роли есть настройки где хранится логин и пароль спецпользователя, файл roles/server_admin/defaults/main.yml
server_admin: login: "admin" password: "$6$rounds=40000$vx8fkGJ1A5ucZQuasdfasdfasdfa58TuC38M3yrkCYL6l/" ssh_key_file: "files/ssh_keys/admin.pub"
Таким образом задаются настройки пользователя.
Если вы будете каждые сутки в полночь запускать скрипт обновления паролей -- то на тех серверах, где пользователь поменял пароль он будет восстановлен.
Всё это разумеется верно, если не менялся пароль на учётную запись ansible из-под которой он работает (кто-то оставляет root, я для этого создаю и держу спец. учётку)

А вот в обратную сторону есть закавыки.
Нет способа для такого сценария: как только пользователь на одном из серверов поменяет пароль -- он тут же будет передан на центральный сервер ansible в специальный скрипт, который поменяет конфиги.
Ansible больше ориентирован на модель push, а не pull: изменения идут с центрального (командного сервера) на клиенты, а не клиенты периодически опрашивают центральный сервер на предмет нет ли изменений.
Но даже если и так, то я не знаю, как из системной утилиты смены пароля вытащить пароль: подозреваю, что такой дырки в системе просто не оставлено.
А не зная пароля и нет смысла городить обратную цепочку по забросу пароля обратно. (Такая цепочка в принципе возможна, но уж больно хлопотна -- да и не особо и нужна)
Чисто умозрительно, если у вас на клиентских машинах есть возможность отследить событие смены пароля и по этому событию запустить скрипт, в который передавать пароль -- то вам можно на каждый клиенсткий сервер, где возможна процедура смены пароля, поставить ansible со специальным скриптом, который будет подключаться к серверу и модицифировать конфиг-файл, но это громоздко, костыльно и жутко небезопасно.
Я предлагаю отказаться от этого сценария вообще. Не нужно вообще менять пароль на клиентских машинах -- от слова совсем. Меняйте его на сервере ансибл в конфиге -- и отправляйте на остальные машины.
Такая модель весьма проста: центральный сервер считается хранителем эталонной конфигурации, а все отклонения от неё на клиентах -- это нештатные ситуации, которые требуют исправления.
Дело касается не только паролей, но и любых других вещей. Скажем, хочется поменять строчку в конфиге nginx, чтобы увеличить лимит на размер загружаемых файлов -- изволь сделать это на сервере ансибл, а не ковыряй локальный конфиг, надеясь, что он потом сам загрузится на центральный сервер и сохранится в качестве эталонного образца для всех серверов.
Кроме того, ничто не запрещает иметь дефолтный пароль (мы его задаём на уровне роли) для большинства серверов и какой-то индивидуальный для одного нестандартного сервера (просто переопределите для нужных серверов пароль в host_vars).
Update Кстати, когда вы сказали, что можно отловить какой-нибудь файл я подумал вот о чём. Насчёт дополнительных инсталляций ansible: они действительно не нужны. Можно на управляющем сервере запускать кроном скрипт ансибл, который будет выполнять проверку удалённых файлов и по существованию файла запускать обработчик со сменой паролей.
Закавыка по-прежнему именно в том, что вы не сможете сделать так, чтобы при смене пароля пользователем пароль писался бы в файл. Вот это делает схему неработоспособной.
Также перенесу из комментария мысль, которую я обдумывал вчера. Вам нужно смотреть в сторону LDAP -- это как раз каталог, который при смене пользователем пароля меняет его в централизованном хранилище.
Update 2. Насчёт /etc/shadow (беглое гугление подсказывает, что там хранится md5 от пароля): если бы ansible умел подставлять от md5пароля (сейчас может применяться либо сам пароль, либо sha_512 -- уточнить, можно ли как-то подсунуть именно md5) то написание такого скрипта, который вы хотите в принципе стало бы вполне непростой, но вполне реальной задачей.
С тем ограничением, что если пароль меняется сразу на двух и более хостах, то результат непредсказуем -- какой-то хост обработается раньше и этот пароль будет перетёрт информацией с другого хоста.

Комментариев нет:

Отправить комментарий