Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
linux:ansible:playbook_example_13 [12.10.2022 19:11. ] – [Aufgabenstellung] djangolinux:ansible:playbook_example_13 [28.11.2022 18:48. ] (aktuell) – Playbook mit Hilfe des GH-Plugin eingebunden. django
Zeile 1: Zeile 1:
-====== Ansible - weiterte Beispiele: Admin Benutzer verwalten ======+====== Ansible - weitere Beispiele: Admin Benutzer verwalten ======
 {{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\ {{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\
  
Zeile 11: Zeile 11:
 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?  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? 
  
-==== Lösung ====+===== Lösung ====
 <WRAP center round tip 80%> <WRAP center round tip 80%>
-Der ungeduldigen Leser kann auch direkt zur Tat schreiten und das manuelle Anlegen des Verzeichnisses und des Ansible-Scripts überspringen. Mit Folgendem Befehl erledigt man dies sozusagen auf einem Rutsch:+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:
  
 <code> $ mkdir ~/ansible ; wget https://gitlab.nausch.org/django/example_13/-/archive/main/example_13-main.tar.gz -O - | tar -xz --strip-components=1 -C ~/ansible</code> <code> $ mkdir ~/ansible ; wget https://gitlab.nausch.org/django/example_13/-/archive/main/example_13-main.tar.gz -O - | tar -xz --strip-components=1 -C ~/ansible</code>
 +<WRAP center round alert 100%> 
 +**Wichtig**: Aber nicht vergessen die Admin-Inventory-Daten in ein Ansible-.Vault verpacken! 
 +   $ ansible-vault encrypt ~/ansible/inventories/production/group_vars/all/admins 
 +</WRAP>
 Anschliessend kann man direkt **[[#script_starten|zur Ausführung schreiten]]**. Anschliessend kann man direkt **[[#script_starten|zur Ausführung schreiten]]**.
 </WRAP> </WRAP>
 +==== Vorbereitung - Admindaten im Inventory ====
 +Dreh- und Angelpunkt unserer Admin-Verwaltung ist natürlich unser Inventory. Dank unserer Vorbereitungen ins Sachen **[[playbook_example_07|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.
 +<file c++ 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
 +    
 +</file>
  
-Für die Grundkonfiguration in der Basisausführung der Ansible-Umgebung, wie wir Sie im Kapitel **[[first#grund-_konfiguration|Erste Schritte Rund um Ansible - (Grund-)Konfiguration]]** Eingangs kennengelernt hattenbenötigen wir eine vordefinierte Grundinstallation und Konfiguration. Damit diese Erstkonfiguration unserer Ansible-Umgebung nicht von Hand erfolgen muss, greifen wir auf das Playbook **''ansible_grundconfig_v1.yml''** zurück.  +=== gehashtes Passwort === 
- +Damit wir keine PLAIN-Text Passworte sondern nun gehashte Passwörter im Inventory stehen haben wollendenn 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
-Mit Hilfe dieses Playbooks können alle erforderlichen Konfigurationsschritte reproduzierbar und beliebig oft abgesetzt werden. Bei Bedarf ist als also jederzeit ohne grossen Aufwand möglich den Ansible-Controll-Node neu aufzusetzen und das System für spätere Playbook-Rollouts vorzubereiten, den Host also auch initial frisch zu versorgen. +   $  openssl passwd -6 
- +  Password:  
-Folgende Schritte sollen von dem playbook abgearbeitet werden+  Verifying Password:  
-  - Kopieren der Ansible-Konfigurationsdatei /etc/ansible/ansible.cfg in das **''$HOME''**-Verzeichnis des Admin-Users. +  $6$n9UE0JVV7T.nzFJOdSY1dHDEsbfY3$0SPNKmewfaQ0z5thaRMrrrI9Uig.nzFJOdSY1erIZbw5yzDqeCg4S2oXa8zn2jEf9KDfjg31
-  - Anpassen, sprich konfigurieren der individuellen Ansible Umgebung. +
-  - Ansible Directory Layout anlegen und mit Dummy-Inhalten versorgen. +
- +
-Schliesslich wollen wir unsere Zeit als Admin ja auch sinnvoll nutzen und mit möglichst geringen Aufwand zu Ziel kommen+
  
 +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
  
- 
- 
-   $ ansible-vault edit inventories/production/group_vars/all/admins 
 <file c++ admins>linux_admins: <file c++ admins>linux_admins:
   - user   : Michael Nausch   - user   : Michael Nausch
Zeile 60: Zeile 78:
     ids    : 1002     ids    : 1002
     shell  : /bin/bash     shell  : /bin/bash
-    state  : absent+    state  : present
     pwd    : $6$nJVSYV9J17.SY1v0oM9fow8Do46dHDEsbfY3$0SPNKmewfaQ0z5tsafZi3haRMrrrI9Uig.OdSY1e6dHDEsbfY3$rI51ewfaQ0z5th     pwd    : $6$nJVSYV9J17.SY1v0oM9fow8Do46dHDEsbfY3$0SPNKmewfaQ0z5tsafZi3haRMrrrI9Uig.OdSY1e6dHDEsbfY3$rI51ewfaQ0z5th
     key    : ssh-ed25519 AAAAK6Pb38bv0oM9fw8DoOdSY1er4b38bNzaqK6Pb38bv0oM9fw01erIZbw5yzDqeCC5 oliver@nausch.org     key    : ssh-ed25519 AAAAK6Pb38bv0oM9fw8DoOdSY1er4b38bNzaqK6Pb38bv0oM9fw01erIZbw5yzDqeCC5 oliver@nausch.org
 </file> </file>
 +In diesem Beispiel haben wir also drei Admins mit den zugehörigen Daten.
  
 +==== Playbook mit zugehörigen Rollen ====
 +Hatten wir das **[[https://gitlab.nausch.org/django/example_13|Gitlab-Paket]]** wie unter dem Abschnitt **[[#loesung|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 **[[#ausfuehrung|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
  
-<code>---+{{ghhttps://gitlab.nausch.org/django/example_13/-/blob/main/playbooks/admin_updates.yml }}
  
-- name: "Sicherstellen dass die Gruppen für Admin-User existieren" 
-  ansible.builtin.group: 
-    gid: '{{ item.ids }}' 
-    name: '{{ item.name }}' 
-    state: present 
-  with_items: '{{ linux_admins }}' 
  
-- name: "Sicherstellen dass die Admin-User existieren" +=== Rolle und Tasks === 
-  ansible.builtin.user: +Bevor wir unsere Rolle **''admins''** anlegen, kopieren wir noch kurz das Vorlageverzeichnis **''common''**, welches wir bei der Erstkonfiguration von Ansible, wie im Kapitel **[[playbook_example_08|Ansible mit Hilfe von Ansible einrichten]]** beschrieben, bereits angelegt hatten
-    append: true +   $ cp -avr ~/ansible/roles/common/ ~/ansible/roles/admins
-    comment: '{{ item.user }}' +
-    create_home: true +
-    force: true +
-    state: '{{ item.state }}' +
-    group: '{{ item.name }}' +
-    groups: '{{ item.groups }}' +
-    name: '{{ item.name }}' +
-    password: '{{ item.pwd }}' +
-    shell: '{{ item.shell }}' +
-    uid: '{{ item.ids }}' +
-    remove: true +
-  with_items: "{{ linux_admins }}"+
  
-name: "Gruppe entfernen, sofern der User zum Löschen gekennzeichnet ist mit absent im Inventory/Vault" +Nun legen wir unseren Main-Task an. 
-  ansible.builtin.group: +   $ vim ~/ansible/roles/admins/tasks/main.yml 
-    gid: '{{ item.ids }}' +{{gh> https://gitlab.nausch.org/django/example_13/-/blob/main/roles/admins/tasks/main.yml }}
-    name'{{ item.name }}' +
-    state: '{{ item.state }}' +
-  with_items: '{{ linux_admins }}'+
  
-name: "SSH-Client-Verzeichnis anlegen" +Was nun noch fehlt sind die beiden eigentlichen Tasks. Als erstes legen wir den Task an, mit Hilfe dessen die jeweilige(n) Admin-Gruppe(n) und User gepflegt werden
-  ansible.builtin.file: +   $ vim ~/ansible/roles/admins/tasks/useranlage.yml 
-    path: /home/{{ item.name }}/.ssh +{{gh> https://gitlab.nausch.org/django/example_13/-/blob/main/roles/admins/tasks/useranlage.yml }}
-    state: directory +
-    owner: '{{ item.name }}' +
-    group'{{ item.name }}' +
-    mode: '0700' +
-  when: ' item.state == "present"' +
-  with_items: '{{ linux_admins }}'+
  
-name: "SSH-Key des Admins hinterlegen" +Zu guter Letzt legen wir noch den Task an, damit die Admins, die Mitglied der Gruppe **''wheels''** sind, auch sudo-Rechte erlangen können
-  ansible.builtin.copy: +   $ vim ~/ansible/roles/admins/tasks/sudoers.yml 
-    dest: /home/{{ item.name }}/.ssh/authorized_keys +{{gh> https://gitlab.nausch.org/django/example_13/-/blob/main/roles/admins/tasks/sudoers.yml }}
-    content: | +
-      {{ item.key }} +
-    owner: '{{ item.name }}' +
-    group'{{ item.name }}' +
-    mode: '0600' +
-  when: ' item.state == "present"' +
-  with_items: '{{ linux_admins }}'+
  
-- name: "VIM Konfig ablegen" +===== Ausführung ===== 
-  ansible.builtin.copy: +Mit Hilfe dieses Playbooks können alle erforderlichen Konfigurationsschritte reproduzierbar und beliebig oft abgesetzt werdenSomit können neue Admins hinzugefügt, SSH-Keys und Passwörter ausgerollt bzwaktualisiert werden und natürlich bestehende Admin-Konten auch bei Bedarf wieder gelöscht werden.
-    src: files/vimrc +
-    dest: /home/{{ item.name }}/.vimrc +
-    owner: '{{ item.name }}' +
-    group: '{{ item.name }}' +
-    mode: '0640' +
-  when: ' item.state == "present"' +
-  with_items: '{{ linux_admins }}'+
  
-- name"bashrc Konfig ablegen" +Folgende Schritte werden also mit Hilfe des Playbooks abgearbeitet
-  ansible.builtin.copy: +  - Sicherstellen dass die Gruppen für Admin-User existieren
-    src: files/bashrc +  - Sicherstellen dass die Admin-User existieren
-    dest: /home/{{ item.name }}/.bashrc +  - Gruppe entfernen, sofern der User zum Löschen gekennzeichnet ist mit **''absent''** im Inventory/Vault. 
-    owner: '{{ item.name }}' +  - SSH-Client-Verzeichnis anlegen 
-    group: '{{ item.name }}+  - SSH-Key des Admins hinterlegen 
-    mode: '0640' +  - SSH-Client-Verzeichnis entfernen, sofern der User zum Löschen gekennzeichnet ist mit **''absent''** im Inventory/Vault. 
-  when: item.state == "present"+  - Der Gruppe **''wheel''** sudo Rechte zuweisen.
-  with_items: '{{ linux_admins }}'+
  
-name: "bash_logout Konfig ablegen" +Entscheidend für das Anlegen bzw. Löschen eines Admins ist die Array-Variable **''state''**; ist ihr der Wert **''present''** zugewiesen wir der Admin neu angelegt und dessen Schlüssel angelegtIst der Wert der Vaiable aber **''absent''** wir dessen Gruppe und User auf den Zielsystemen entfernt. Nach einem erfolgreichen Playbooklauf können wir dann anschliessend den Admin wieder aus dem Inventory löschen oder eben solange dort stehen lassen, bis dieser wieder z.B. nach einem [[https://de.wikipedia.org/wiki/Sabbatical|Sabbatical]] seinen Dienst antritt.
-  ansible.builtin.copy: +
-    src: files/bash_logout +
-    dest: /home/{{ item.name }}/.bash_logout +
-    owner: '{{ item.name }}' +
-    group: '{{ item.name }}' +
-    mode: '0640' +
-  when: item.state == "present"' +
-  with_items: '{{ linux_admins }}'+
  
-- name: "bash_profile Konfig ablegen" +Haben wir die Daten in unserem Vault entsprechend aktualisiert können wir, wie im Playbook vermerkt, das Playbook wie gewohnt aufrufen
-  ansible.builtin.copy: +Aufruf via für alles Hosts
-    srcfiles/bash_profile +   $ ansible-playbook playbooks/admin_updates.yml 
-    dest: /home/{{ item.name }}/.bash_profile +bzwfür einzelne Hosts
-    owner: '{{ item.name }}' +   $ ansible-playbook playbooks/admin_updates.yml --limit <-hostnames->
-    group'{{ item.name }}' +
-    mode: '0640' +
-  when: ' item.state == "present"' +
-  with_items: '{{ linux_admins }}'+
  
-name: "SSH-Client-Verzeichnis entfernen, sofern der User zum Löschen gekennzeichnet ist mit absent im Inventory/Vault" +Interessiert uns lediglich die erfolgreiche Abarbeitung unseres Playbook-Aufrufs können wir dies z.Bbeim Host mit dem Namen **''vml000137''** auch wie folgt erreichen
-  ansible.builtin.file+   $ ansible-playbook playbooks/admin_updates.yml --limit vml000137 | sed -n '/PLAY RECAP/,$p' 
-    path: /home/{{ item.name }}/.ssh + 
-    state: absent +  PLAY RECAP ******************************************************************************************************** 
-  when' item.state == "absent" ' +  vml000137                  ok=7    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0 
-  with_items: '{{ linux_admins }}'+ 
 +===== Zusammenfassung ===== 
 +<WRAP center round tip 80%> 
 +Wir haben nun eine standardisiertes Verfahren für die Pflege unserer Admins, so dass aufwändiges manuelles Anlegen oder Löschen von Admin-Konten nicht mehr wichtige Ressourcen auffrisst. Auch können so unsere Admins ihre Passwörter und|oder SSH-Key sehr einfach auf Dutzenden oder vielen Hunderten Servern austauschen und aktualisieren. 
 +</WRAP>
  
-... +====== Links ====== 
-</code>+  * **[[detail|zurück zum Kapitel "Ansible - Erweiterte Konfigurationsbeispiele"]] <= ** 
 +  * **=> [[playbook_example_10|weiter zum Kapitel "Ansible Controll Node]]** 
 +  * **[[start|Zurück zur "Ansible"-Übersicht]]** 
 +  * **[[wiki:start|Zurück zu >>Projekte und Themenkapitel<<]]** 
 +  * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**
  • linux/ansible/playbook_example_13.1665601870.txt.gz
  • Zuletzt geändert: 12.10.2022 19:11.
  • von django