Od ok. 3 lat używam Ansible, z wielkim powodzeniem, do zarządzania stale rosnącym stadem systemów linuksowych. Zanim przejdę do pytania, muszę ustalić kontekst.
W ramach mojej codziennej pracy zajmuję się projektowaniem, wdrażaniem i konserwacją systemów dla różnych firm, które działają pod patronatem jednej firmy typu venture / inkubator. Nasze spółki portfelowe są bardzo zapylone i dlatego nie możemy powiedzieć, że tylko użytkownicy A, B i C będą potrzebować dostępu do systemów firmy X. Mogą także potrzebować dostępu do systemów firmy Y. Komplikuje to fakt, że środowisko ansible każdej firmy żyje w innym repozytorium git. Oznacza to, że przy wdrażaniu użytkowników w różnych systemach firmy występuje dużo duplikatów kodu. W rezultacie kopiuję / wklejam bloki kodu w taki sposób, aby wdrożyć użytkowników w systemach pewnej firmy:
- name: add several users
user: >
name={{ item.name }}
state=present
groups={{ item.groups }}
uid={{ item.uid }}
password={{ item.password }}
shell=/bin/bash
with_items:
- { name: 'user1', groups: 'ssh-access,sudo', uid: '501', password: '<redacted>' }
- { name: 'user2', groups: 'ssh-access,sudo', uid: '502', password: '<redacted>' }
tags: users
- name: authorized_keys - user1
action: authorized_key user=user1 key="{{ lookup('file', 'pubkeys/user1') }}" manage_dir=yes
tags:
- pubkeys
- users
- name: authorized_keys - user2
action: authorized_key user=user2 key="{{ lookup('file', 'pubkeys/user2') }}" manage_dir=yes
tags:
- pubkeys
- users
Działało to OK, gdy miałem <5 użytkowników do zarządzania, ale wraz z powiększaniem się bazy użytkowników coraz trudniej jest aktualizować klucze, zmieniając hasła, nowe hasła itp.
Po ustawieniu historii i kontekstu, moje pytanie:
Zakładając, że korzystanie ze scentralizowanego systemu uwierzytelniania (LDAP itp.) Nie jest opcją, w jaki sposób mogę rozwiązać problem tworzenia scentralizowanej bazy danych użytkowników, z której mogłyby korzystać różne odpowiadające podręczniki? Chciałbym móc utrzymać jedną centralną listę użytkowników, identyfikatory użytkowników, skróty haseł i klucze publiczne, a następnie móc wdrożyć użytkowników (z niestandardowym członkostwem w grupie dla poszczególnych hostów) na hostach każdej firmy.
Przewiduję jakąś strukturę gry, taką jak:
- name: Deploy users
user_management:
- { name: "user1", groups: "sudo" }
- { name: "user1", groups: "sudo" }
... gdzie identyfikator użytkownika, skrót i klucz publiczny każdego użytkownika byłyby pobierane z centralnej listy i wdrażane jak zwykle.
Jakie mam opcje? Zastanawiam się nad tym od dłuższego czasu i nie byłem w stanie wymyślić nic lepszego niż to, co już robię. Czy mogę zrobić coś z niestandardowym plikiem faktów, aby przechowywać bazę danych użytkowników?