Was ist der aktuelle Stand der Technik für die Benutzerverwaltung mit Ansible?

10

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?

EEAA
quelle

Antworten:

8

Sie müssen Ihre Spiele und Ihre Daten trennen.

Ich habe ein einziges Repo mit all meinen Rollen, Fakten usw., die für eine Vielzahl von Kundensystemen bereitgestellt werden. Ich stelle sicher, dass alle Rollen resuierbar und datenfrei sind. In host_vars/fqdn.ymloder group_vars/customer_name.ymlIch definiere die Daten, die für diesen Kunden oder dieses Remote-System eindeutig sind.

Die meisten meiner Rollen werden im Laufe der Zeit erweitert je nach Bedarf und statt alles zu tun , from roles/foo/main.ymlich habe roles/foo/debian-foo.ymlund roles/foo/openbsd-foo.ymldas sind nur enthalten , wenn das Betriebssystem oder eine andere Bedingung Streichhölzer.

Vereinfacht, roles/adduser/main.ymlkönnte dies beinhalten:

- user: name={{ item.name }} ...
  with_items:
  - customer_users

und group_vars/ACME.ymlkönnte dies beinhalten:

customer_users:
- name: sausage
   uid: 32153
- name: beans
   uid: 1024

In Ihrem Fall ist es möglicherweise in Ordnung, in jedem Git-Repo separate ansible Umgebungen zu haben, solange der Rollenordner ein freigegebenes Submodul ist, das für alle Ihre Kunden identisch ist.

Alex Holst
quelle
Das weist mich in die richtige Richtung. Danke Alex! Ich muss noch klären, wie eine einzelne Datenbank mit Benutzernamen / Schlüsseln / Uids / usw. verwaltet werden kann, auf die ich aus verschiedenen Rollen und / oder Gruppen verweisen kann, aber ich denke, ich habe einige Ideen, wie ich das erreichen kann.
EEAA
1
@EEAA Denken Sie daran, Rollen / alle können ein Verzeichnis mit Dateien sein, so dass Sie Rollen / all / staff.yml, Rollen / all / foo.yml usw. einfach zentralisieren können
Alex Holst