Ich benutze Ansible seit ~ 3 Jahren mit großem Erfolg, um eine ständig wachsende Herde von Linux-Systemen zu verwalten. Bevor ich auf meine Frage eingehe, muss ich einen Kontext festlegen.
Als Teil meiner täglichen Arbeit mache ich Systemdesign, -bereitstellung und -wartung für verschiedene Unternehmen, die alle unter dem Dach eines einzigen Unternehmens / Inkubator-Unternehmens arbeiten. Unter unseren Portfoliounternehmen gibt es viele Fremdbestäubungen, und daher können wir nicht sagen, dass nur die Benutzer A, B und C Zugriff auf die Systeme von Unternehmen X benötigen. Möglicherweise benötigen sie auch Zugriff auf die Systeme von Unternehmen Y. Dies wird durch die Tatsache erschwert, dass sich die ansible Umgebung jedes Unternehmens in einem anderen Git-Repository befindet. Dies bedeutet, dass viel Code dupliziert wird, um Benutzer auf den Systemen verschiedener Unternehmen bereitzustellen. Am Ende kopiere / füge ich Codeblöcke wie diesen ein, um Benutzer auf den Systemen eines bestimmten Unternehmens bereitzustellen:
- 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
Dies funktionierte einwandfrei, wenn ich <5 Benutzer verwalten musste, aber mit zunehmender Benutzerbasis wird es immer schwieriger, die Dinge mit Schlüsselrotation, neuen Passwörtern usw. auf dem neuesten Stand zu halten.
Mit der Hintergrundgeschichte und dem Kontext, weiter mit meiner Frage:
Angenommen, die Verwendung eines zentralisierten Authentifizierungssystems (LDAP usw.) ist keine Option. Wie könnte ich die Erstellung einer zentralisierten Benutzerdatenbank angehen, die verschiedene ansible Playbooks nutzen könnten? Ich würde gerne in der Lage sein, eine zentrale Liste von Benutzern, Benutzeroberflächen, Kennwort-Hashes und öffentlichen Schlüsseln zu verwalten und dann die Benutzer (mit benutzerdefinierten Gruppenmitgliedschaften pro Host) auf den Hosts jedes Unternehmens bereitzustellen.
Ich stelle mir eine Art Spielstruktur vor wie:
- name: Deploy users
user_management:
- { name: "user1", groups: "sudo" }
- { name: "user1", groups: "sudo" }
... wo die UID, der Hash und der öffentliche Schlüssel jedes Benutzers aus der zentralen Liste abgerufen und wie gewohnt bereitgestellt werden.
Welche Optionen habe ich? Ich habe eine ganze Weile darüber nachgedacht und konnte mir nichts Besseres einfallen lassen als das, was ich bereits mache. Könnte ich etwas mit einer benutzerdefinierten Faktendatei tun, um meine Benutzerdatenbank zu speichern?