Dies ist eine alte Version des Dokuments!
Ansible - weitere Beispiele: Admin Benutzer verwalten (v2)
Im Eingangskapitel Grundlagen haben wir uns mit der Installation bereits befasst. Mit den Hintergrundinformationen haben wir uns auch schon in den beiden Kapiteln Playbooks und YAML - was ist das? eingehend beschäftigt, sowie erste Erfahrungen mit Playbooks gesammelt.
Mit einer erste grundlegende Version unseres Ansible-Playbooks zum Anlegen, Modifizieren und Löschen unserer Admin-Konten haben wir im letzten Kapitel bereits betrachtet. Dieses Playbook werden wir nun noch etwas verändern und ein paar Prüfroutinen einbauen.
Aufgabenstellung
Oft steht man vor der Herausforderung, Admin-Konten auf unzähligen Zielsystemen anzulegen und wieder zu löschen. So sind im Zuge eines onboarding von neuen Admins jeweils Konten anzulegen und mit Passworten und Schlüsselmaterial zu versorgen. Beim Ausscheiden eines Admins, müssen dessen|ihre Konten samt Passworten und Schlüssel wieder gelöscht werden.
Es soll ja zuweilen Unternehmungen geben, bei denen sich das Personal mehr oder weniger in sehr kurzen Zeitabständen die Klinge in die Hand geben, was das Prozedere dann zusätzlich vom Aufwand her nach oben treibt.
Möchte ein bestehender Admin sein|ihr Passwort oder Schlüssel ändern, kann dies auch zu einer zeitraubenden Tätigkeit ausarten. Was liegt also näher das Anlegen und Löschen der Konten samt Passwörter und Schlüsselmaterial sowie die Pflege dieser Daten mit Hilfe von Ansible zu automatisieren?
Die Beschreibung kennen wir schon aus dem ersten Beispiel Admin Benutzer verwalten - so weit, so gut. Zusätzlich zu dieser Ausgangssituation wollen wir nun noch sicherstellen, dass die Adminspezifischen Definitionen aus dem Inventory valide sind. Folgende Rahmenbedingungen bei den Eigenschaften eines Admin-Kontos sollen gelten:
user
: Der Admin muss mit Vor und Nachnamen bekannt sein und auch definiert werden, darf also nicht leer sein,name
: der Account-Name des Admins muss definiert werden, darf also nicht leer sein,groups
: Admins müssen zur Rechterweiterung der Gruppewheel
angehören, daher muss der Gruppennamewheel
lauten und darf nicht leer sein,ids
: die UID/GID unserer Admins müssen sich im Bereich von1000 - 5000
bewegen,shell
: die Variable darf nicht leer sein - der Admin soll sich ja schliesslich anmelden können undstate
: letztendlich wird über die Variablestate
geregelt, ob eine Admin-Konto existierten (present
) darf, oder ob dies ggf. gelöscht werden soll (absent
). Das bedeutet, die Variable im Inventory kann also entweder nurpresent
oderabsent
sein - andere Werte sind schlichtweg unzulässig.
Lösung
Der ungeduldigen Leser kann auch direkt zur Tat schreiten und das manuelle Anlegen der Inventory-Hülle, des Playbooks und der zugehörigen Rollen überspringen und diese Aufgaben mit folgendem Befehl sozusagen auf einem Rutsch erledigen:
$ mkdir ~/ansible ; wget https://gitlab.nausch.org/django/example_14/-/archive/main/example_14-main.tar.gz -O - | tar -xz --strip-components=1 -C ~/ansible
Wichtig: Aber nicht vergessen die Admin-Inventory-Daten in ein Ansible-.Vault verpacken!
$ ansible-vault encrypt ~/ansible/inventories/production/group_vars/all/admins
Anschliessend kann man direkt zur Ausführung schreiten.
Vorbereitung - Admindaten im Inventory
Dreh- und Angelpunkt unserer Admin-Verwaltung ist natürlich unser Inventory. Dank unserer Vorbereitungen ins Sachen Ansible Vault können wir natürlich gehashte Passwörter und SSH-keys im Inventory vorhalten, da diese dort ja sicher verwahrt vorliegen.
Inventory-Hülle
Wir werden uns also erst einmal unsere Admins im Inventory eine zugehörige Datei anlegen.
$ ansible-vault create ~/ansible/inventories/production/group_vars/all/admins
Dort legen wir als erstes mal eine Hülle für die weitere Bearbeitung an.
- admins
linux_admins: - user : Vorname Nachname name : User-Name groups : wheel ids : 1000 shell : /bin/bash state : present # present bzw. absent pwd : <-- Ergebnis: openssl passwd -6 --> key : ssh-key
gehashtes Passwort
Damit wir keine PLAIN-Text Passworte sondern nun gehashte Passwörter im Inventory stehen haben wollen, denn aus Sicherheitsgründen dürfen nur die Admins selbst deren Passwort kennen und sonst niemand bitten wir diese uns das gehashte Passwort mit openssl
zu generieren.
$ openssl passwd -6 Password: Verifying - Password: $6$n9UE0JVV7T.nzFJOdSY1dHDEsbfY3$0SPNKmewfaQ0z5thaRMrrrI9Uig.nzFJOdSY1erIZbw5yzDqeCg4S2oXa8zn2jEf9KDfjg31
Ferner benötigen wir noch den SSH-Publickey den wir uns ebenso wie das gerade erstellte gehashte Passwort von unseren Admins auf einem sicheren Kommunikationsweg zukommen.
Inventory Daten für unsere Admins
Diese Daten übernehmen wir dann in unser Inventory:
$ ansible-vault edit inventories/production/group_vars/all/admins
- admins
linux_admins: - user : Michael Nausch name : django groups : wheel ids : 1000 shell : /bin/bash state : present pwd : $6$QYCbUeY2/EecXmL4$iA7Q.M457er0F0354573RoPyKcbbPMozx8uFYKMpZLJnz2JIoAlcMxi0o0b1zJywJLECw1fSB2OCdfzc9vOX1 key : ssh-ed25519 AAAAC3N1NTE5A0aTHP001zaC1lZDI1NTE5AAAAINPs/cN40aTu2HTGeHhV7IV1EngqT5 openpgp:0xDAED833F - user : Christoph Leichi name : rookie groups : wheel ids : 1001 shell : /bin/bash state : present pwd : $6$n9UE0JVV7T.nzFJOdSY1dHDEsbfY3$0SPNKmewfaQ0z5thaRMrrrI9Uig.nzFJOdSY1erIZbw5yzDqeCg4S2oXa8zn2jEf9KDfjg31 key : ssh-ed25519 AAAAC3NzaqK6Pb38bv0oM9fw0C1lZDI1NTE5AAAAIDo46Pb38bv0oM9fmgM6byylc0815 rookie@nausch.org - user : Oliver Gewinnbringer name : oliver groups : wheel ids : 1002 shell : /bin/bash state : present pwd : $6$nJVSYV9J17.SY1v0oM9fow8Do46dHDEsbfY3$0SPNKmewfaQ0z5tsafZi3haRMrrrI9Uig.OdSY1e6dHDEsbfY3$rI51ewfaQ0z5th key : ssh-ed25519 AAAAK6Pb38bv0oM9fw8DoOdSY1er4b38bNzaqK6Pb38bv0oM9fw01erIZbw5yzDqeCC5 oliver@nausch.org
In diesem Beispiel haben wir also drei Admins mit den zugehörigen Daten.
Playbook mit zugehörigen Rollen
Hatten wir das Gitlab-Paket wie unter dem Abschnitt Lösung beschrieben können wir die nächsten Schritte zum Anlegen des Playbooks und der Rolle mit den zugehörigen Tasks, getrost überspringen und gleich zur Ausführung schreiten.
Playbook
Das Playbook an sich ist relativ unspektakulär, wird doch nur die zugehörige Rolle eingebunden, wie wir hier sehen.
$ vim ~/ansible/playbooks/admin_updates.yml
- playbooks/admin_updates.yml
--- # Ansible Playbook zum Anlegen, Aktualisieren und Löschen der Administratoren, # inkl. der zugehörigen Passwörter und SSH-Schlüssel, basierend auf den Angaben # im Inventory. Admins mit dem state "present" werden angelegt bzw. deren Passworte # und Schlüssel aktualisiert. Admins mit dem state "absent" werden auf den Hosts # gelöscht und können anschliessend aus dem Inventory entfernt werden. # # Aufruf zum Anlegen, Ändern oder Löschen auf allen Hosts, die im Inventory # definiert sind: # # $ ansible-playbook playbooks/admin_updates.yml # # bzw. für einzelne Hosts: # $ ansible-playbook playbooks/admin_updates.yml --limit <-hostnames-> - name: admin_updates.yml # Name des Playbooks hosts: DMZ # Hostgruppe für den das Playbook gelten soll roles: - role: admins # Admins anlegen, ändern oder löschen tags: admins # Tag-Kennzeichnung der definierten Rolle ...
GH-Plugin (private Gitlab-Instanz)
https://gitlab.nausch.org/django/example_8b/blob/main/playbooks/ansible_grundconfig_v2.yml
- playbooks/ansible_grundconfig_v2.yml
vars: ansible_working_dir: devel/ansible ansible_config: '/home/{{ admin_user }}/.ansible.cfg' admin_user: "{{ lookup('env','USER') }}" admin_mail: '{{ admin_user }}@nausch.org' vars_prompt: - name: pass_secret prompt: "Enter password for vault-password-store?" - name: pass_secret_2nd prompt: "Retype password for vault-password-store?"