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 [13.10.2022 17:35. ] 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 50: Zeile 50:
   $6$n9UE0JVV7T.nzFJOdSY1dHDEsbfY3$0SPNKmewfaQ0z5thaRMrrrI9Uig.nzFJOdSY1erIZbw5yzDqeCg4S2oXa8zn2jEf9KDfjg31   $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 Andmins auf einem sicheren Kommunikationsweg zukommen.+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 === === Inventory Daten für unsere Admins ===
Zeile 85: Zeile 85:
  
 ==== Playbook mit zugehörigen Rollen ==== ==== Playbook mit zugehörigen Rollen ====
-Hatten wir das 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.+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 === === Playbook ===
 Das Playbook an sich ist relativ unspektakulär, wird doch nur die zugehörige Rolle eingebunden, wie wir hier sehen. 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    $ vim ~/ansible/playbooks/admin_updates.yml
-<file c++ 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önen anschließend aus 
-# dem Inventory entfernt werden. 
-# Aufruf via für alles Hosts: 
-#         $ 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 +{{gh> https://gitlab.nausch.org/django/example_13/-/blob/main/playbooks/admin_updates.yml }}
-  hosts: DMZ                                # Host-Gruppe für den das Playbook gelten soll+
  
-  roles: 
-    - role: admins                          # Admins anlegne, ändern und|oder löschen 
-      tags: admins                          # Tag-Kennzeichnung der definierten Rolle 
-... 
-</file> 
  
 === Rolle und Tasks === === Rolle und Tasks ===
Zeile 116: Zeile 100:
 Nun legen wir unseren Main-Task an. Nun legen wir unseren Main-Task an.
    $ vim ~/ansible/roles/admins/tasks/main.yml    $ vim ~/ansible/roles/admins/tasks/main.yml
- +{{ghhttps://gitlab.nausch.org/django/example_13/-/blob/main/roles/admins/tasks/main.yml }}
-<file c++ main.yml>--- # User unter Archlinux erstellen +
-- includeuseranlage.yml             # Admin-Gruppe und -User pflegen +
-- include: sudoers.yml                # Admins der Gruppe wheel sudoers zuweisen +
-... +
-</file>+
  
 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. 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.
    $ vim ~/ansible/roles/admins/tasks/useranlage.yml    $ vim ~/ansible/roles/admins/tasks/useranlage.yml
 +{{gh> https://gitlab.nausch.org/django/example_13/-/blob/main/roles/admins/tasks/useranlage.yml }}
  
-<file c++ useranlage.yml>--- +Zu guter Letzt legen wir noch den Task an, damit die Admins, die Mitglied der Gruppe **''wheels''** sind, auch sudo-Rechte erlangen können.
- +
-- 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" +
-  ansible.builtin.user: +
-    append: true +
-    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" +
-  ansible.builtin.group: +
-    gid: '{{ item.ids }}' +
-    name: '{{ item.name }}' +
-    state: '{{ item.state }}' +
-  with_items: '{{ linux_admins }}' +
- +
-- name: "SSH-Client-Verzeichnis anlegen" +
-  ansible.builtin.file: +
-    path: /home/{{ item.name }}/.ssh +
-    state: directory +
-    owner: '{{ item.name }}' +
-    group: '{{ item.name }}' +
-    mode: '0700' +
-  when: ' item.state == "present"' +
-  with_items: '{{ linux_admins }}' +
- +
-- name: "SSH-Key des Admins hinterlegen" +
-  ansible.builtin.copy: +
-    dest: /home/{{ item.name }}/.ssh/authorized_keys +
-    content: | +
-      {{ item.key }} +
-    owner: '{{ item.name }}' +
-    group: '{{ item.name }}' +
-    mode: '0600' +
-  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" +
-  ansible.builtin.file: +
-    path: /home/{{ item.name }}/.ssh +
-    state: absent +
-  when: ' item.state == "absent"+
-  with_items: '{{ linux_admins }}' +
- +
-...</file> +
- +
-Zu guter Letzt legen wir noch den Task an, damit die Admins, die Miitglied der Gruppe **''wheels''** sind, auch sudo-Rechte erlangen können.+
    $ vim ~/ansible/roles/admins/tasks/sudoers.yml    $ vim ~/ansible/roles/admins/tasks/sudoers.yml
- +{{ghhttps://gitlab.nausch.org/django/example_13/-/blob/main/roles/admins/tasks/sudoers.yml }}
-<file c++ sudoers.yml>--- +
- +
-- name"Die Gruppe wheel sudo Rechte zuweisen" +
-  ansible.builtin.copy: +
-    content: "# Generated by Ansible, do not edit manually!\n# Allows people in group wheel to run all command\n%wheel    ALL=(ALL)       ALL\n" +
-    dest: /etc/sudoers.d/10_passwd_sudo_wheel +
-    owner: root +
-    group: root +
-    mode: "0440" +
-    validate: visudo -cf %s +
- +
-...</file>+
  
 ===== Ausführung ===== ===== Ausführung =====
 +Mit Hilfe dieses Playbooks können alle erforderlichen Konfigurationsschritte reproduzierbar und beliebig oft abgesetzt werden. Somit können neue Admins hinzugefügt, SSH-Keys und Passwörter ausgerollt bzw. aktualisiert werden und natürlich bestehende Admin-Konten auch bei Bedarf wieder gelöscht werden.
  
 +Folgende Schritte werden also mit Hilfe des Playbooks abgearbeitet:
 +  - Sicherstellen dass die Gruppen für Admin-User existieren.
 +  - Sicherstellen dass die Admin-User existieren.
 +  - Gruppe entfernen, sofern der User zum Löschen gekennzeichnet ist mit **''absent''** im Inventory/Vault.
 +  - SSH-Client-Verzeichnis anlegen
 +  - SSH-Key des Admins hinterlegen
 +  - SSH-Client-Verzeichnis entfernen, sofern der User zum Löschen gekennzeichnet ist mit **''absent''** im Inventory/Vault.
 +  - Der Gruppe **''wheel''** sudo Rechte zuweisen.
  
-FIXME+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 angelegt. Ist 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.
  
 +Haben wir die Daten in unserem Vault entsprechend aktualisiert können wir, wie im Playbook vermerkt, das Playbook wie gewohnt aufrufen.
 +Aufruf via für alles Hosts:
 +   $ ansible-playbook playbooks/admin_updates.yml
 +bzw. für einzelne Hosts:
 +   $ ansible-playbook playbooks/admin_updates.yml --limit <-hostnames->
  
-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 hatten, benötigen wir eine vordefinierte Grundinstallation und KonfigurationDamit diese Erstkonfiguration unserer Ansible-Umgebung nicht von Hand erfolgen muss, greifen wir auf das Playbook **''ansible_grundconfig_v1.yml''** zurück+Interessiert uns lediglich die erfolgreiche Abarbeitung unseres Playbook-Aufrufs können wir dies z.B. beim Host mit dem Namen **''vml000137''** auch wie folgt erreichen: 
 +   $ ansible-playbook playbooks/admin_updates.yml --limit vml000137 | sed -n '/PLAY RECAP/,$p'
  
-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.+  PLAY RECAP ******************************************************************************************************** 
 +  vml000137                  : ok=7    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
  
-Folgende Schritte sollen von dem playbook abgearbeitet werden: +===== Zusammenfassung ===== 
-  - Kopieren der Ansible-Konfigurationsdatei /etc/ansible/ansible.cfg in das **''$HOME''**-Verzeichnis des Admin-Users. +<WRAP center round tip 80%> 
-  - Anpassen, sprich konfigurieren der individuellen Ansible Umgebung. +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 auffrisstAuch können so unsere Admins ihre Passwörter und|oder SSH-Key sehr einfach auf Dutzenden oder vielen Hunderten Servern austauschen und aktualisieren
-  - Ansible Directory Layout anlegen und mit Dummy-Inhalten versorgen. +</WRAP>
- +
-Schliesslich wollen wir unsere Zeit als Admin ja auch sinnvoll nutzen und mit möglichst geringen Aufwand zu Ziel kommen.  +
- +
- +
- +
- +
- +
-   $ ansible-vault edit inventories/production/group_vars/all/admins +
-<file c++ 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  : absent +
-    pwd    : $6$nJVSYV9J17.SY1v0oM9fow8Do46dHDEsbfY3$0SPNKmewfaQ0z5tsafZi3haRMrrrI9Uig.OdSY1e6dHDEsbfY3$rI51ewfaQ0z5th +
-    key    : ssh-ed25519 AAAAK6Pb38bv0oM9fw8DoOdSY1er4b38bNzaqK6Pb38bv0oM9fw01erIZbw5yzDqeCC5 oliver@nausch.org +
-</file> +
- +
- +
- +
-<code>--- +
- +
-- 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" +
-  ansible.builtin.user: +
-    append: true +
-    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" +
-  ansible.builtin.group: +
-    gid: '{{ item.ids }}' +
-    name: '{{ item.name }}' +
-    state: '{{ item.state }}' +
-  with_items: '{{ linux_admins }}' +
- +
-- name: "SSH-Client-Verzeichnis anlegen" +
-  ansible.builtin.file: +
-    path: /home/{{ item.name }}/.ssh +
-    state: directory +
-    owner: '{{ item.name }}' +
-    group: '{{ item.name }}' +
-    mode: '0700' +
-  when: ' item.state == "present"' +
-  with_items: '{{ linux_admins }}' +
- +
-- name: "SSH-Key des Admins hinterlegen" +
-  ansible.builtin.copy: +
-    dest: /home/{{ item.name }}/.ssh/authorized_keys +
-    content: | +
-      {{ item.key }} +
-    owner: '{{ item.name }}' +
-    group: '{{ item.name }}' +
-    mode: '0600' +
-  when: ' item.state == "present"' +
-  with_items: '{{ linux_admins }}' +
- +
-- name: "VIM Konfig ablegen" +
-  ansible.builtin.copy: +
-    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" +
-  ansible.builtin.copy: +
-    src: files/bashrc +
-    dest: /home/{{ item.name }}/.bashrc +
-    owner: '{{ item.name }}' +
-    group: '{{ item.name }}' +
-    mode: '0640' +
-  when: ' item.state == "present"' +
-  with_items: '{{ linux_admins }}' +
- +
-- name: "bash_logout Konfig ablegen" +
-  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" +
-  ansible.builtin.copy: +
-    src: files/bash_profile +
-    dest: /home/{{ item.name }}/.bash_profile +
-    owner: '{{ item.name }}' +
-    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" +
-  ansible.builtin.file: +
-    path: /home/{{ item.name }}/.ssh +
-    state: absent +
-  when: ' item.state == "absent"+
-  with_items: '{{ linux_admins }}'+
  
-... +====== 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.1665682529.txt.gz
  • Zuletzt geändert: 13.10.2022 17:35.
  • von django