Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
linux:ansible:playbook_example_13 [12.10.2022 20:08. ] – [Lösung] django | linux:ansible:playbook_example_13 [28.11.2022 18:48. ] (aktuell) – Playbook mit Hilfe des GH-Plugin eingebunden. django | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Ansible - weiterte | + | ====== Ansible - weitere |
{{: | {{: | ||
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%> | ||
Zeile 23: | Zeile 23: | ||
Anschliessend kann man direkt **[[# | Anschliessend kann man direkt **[[# | ||
</ | </ | ||
- | === Vorbereitung - Admindaten im Inventory === | + | ==== 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. | 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 == | + | === Inventory-Hülle |
Wir werden uns also erst einmal unsere Admins im Inventory eine zugehörige Datei anlegen. | Wir werden uns also erst einmal unsere Admins im Inventory eine zugehörige Datei anlegen. | ||
$ ansible-vault create ~/ | $ ansible-vault create ~/ | ||
Zeile 32: | Zeile 32: | ||
Dort legen wir als erstes mal eine Hülle für die weitere Bearbeitung an. | Dort legen wir als erstes mal eine Hülle für die weitere Bearbeitung an. | ||
<file c++ admins> | <file c++ admins> | ||
- | - user : | + | - user : |
- | name : | + | name : |
groups : wheel | groups : wheel | ||
- | ids : | + | ids : 1000 |
shell : /bin/bash | shell : /bin/bash | ||
- | state : present | + | state : present |
- | pwd : | + | pwd : <-- Ergebnis: openssl passwd -6 --> |
- | key : | + | key : ssh-key |
+ | | ||
</ | </ | ||
- | == gehashtes Passwort == | + | === 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 **'' | 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 **'' | ||
| | ||
Zeile 49: | 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 | + | Ferner benötigen wir noch den SSH-Publickey den wir uns ebenso wie das gerade erstellte gehashte Passwort von unseren |
- | == Inventory Daten für unsere Admins == | + | === Inventory Daten für unsere Admins |
Diese Daten übernehmen wir dann in unser Inventory: | Diese Daten übernehmen wir dann in unser Inventory: | ||
$ ansible-vault edit inventories/ | $ ansible-vault edit inventories/ | ||
Zeile 83: | Zeile 84: | ||
In diesem Beispiel haben wir also drei Admins mit den zugehörigen Daten. | In diesem Beispiel haben wir also drei Admins mit den zugehörigen Daten. | ||
+ | ==== Playbook mit zugehörigen Rollen ==== | ||
+ | Hatten wir das **[[https:// | ||
+ | === Playbook === | ||
+ | Das Playbook an sich ist relativ unspektakulär, | ||
+ | $ vim ~/ | ||
- | FIXME | + | {{gh> https:// |
- | Für die Grundkonfiguration in der Basisausführung | + | === Rolle und Tasks === |
+ | Bevor wir unsere Rolle **'' | ||
+ | $ cp -avr ~/ | ||
- | 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, | + | Nun legen wir unseren Main-Task an. |
+ | $ vim ~/ | ||
+ | {{gh> https:// | ||
- | Folgende Schritte sollen von dem playbook abgearbeitet | + | 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 |
- | - Kopieren der Ansible-Konfigurationsdatei /etc/ansible/ansible.cfg in das **'' | + | $ vim ~/ansible/roles/ |
- | - Anpassen, sprich konfigurieren der individuellen Ansible Umgebung. | + | {{gh> https:// |
- | | + | |
- | Schliesslich wollen | + | Zu guter Letzt legen wir noch den Task an, damit die Admins, die Mitglied der Gruppe **'' |
+ | $ vim ~/ | ||
+ | {{gh> https:// | ||
+ | ===== Ausführung ===== | ||
+ | Mit Hilfe dieses Playbooks können alle erforderlichen Konfigurationsschritte reproduzierbar und beliebig oft abgesetzt werden. Somit können neue Admins hinzugefügt, | ||
+ | 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 **'' | ||
+ | - SSH-Client-Verzeichnis anlegen | ||
+ | - SSH-Key des Admins hinterlegen | ||
+ | - SSH-Client-Verzeichnis entfernen, sofern der User zum Löschen gekennzeichnet ist mit **'' | ||
+ | - Der Gruppe **'' | ||
+ | Entscheidend für das Anlegen bzw. Löschen eines Admins ist die Array-Variable **'' | ||
+ | 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/ | ||
+ | bzw. für einzelne Hosts: | ||
+ | $ ansible-playbook playbooks/ | ||
- | $ ansible-vault edit inventories/ | + | Interessiert uns lediglich die erfolgreiche Abarbeitung unseres Playbook-Aufrufs können wir dies z.B. beim Host mit dem Namen **'' |
- | <file c++ admins> | + | |
- | - user | + | |
- | name : django | + | |
- | groups : wheel | + | |
- | ids : 1000 | + | |
- | shell : /bin/bash | + | |
- | state : present | + | |
- | pwd : $6$QYCbUeY2/EecXmL4$iA7Q.M457er0F0354573RoPyKcbbPMozx8uFYKMpZLJnz2JIoAlcMxi0o0b1zJywJLECw1fSB2OCdfzc9vOX1 | + | |
- | key : ssh-ed25519 AAAAC3N1NTE5A0aTHP001zaC1lZDI1NTE5AAAAINPs/ | + | |
- | | + | |
- | 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 | + | |
- | </ | + | |
+ | PLAY RECAP ******************************************************************************************************** | ||
+ | vml000137 | ||
+ | ===== 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. | ||
+ | </ | ||
- | < | + | ====== |
- | + | | |
- | - name: " | + | |
- | ansible.builtin.group: | + | |
- | gid: '{{ item.ids }}' | + | |
- | name: '{{ item.name }}' | + | * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]** |
- | state: present | + | |
- | with_items: '{{ linux_admins }}' | + | |
- | + | ||
- | - name: " | + | |
- | ansible.builtin.user: | + | |
- | append: true | + | |
- | comment: '{{ item.user }}' | + | |
- | create_home: | + | |
- | 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: " | + | |
- | ansible.builtin.group: | + | |
- | gid: '{{ item.ids }}' | + | |
- | name: '{{ item.name }}' | + | |
- | state: '{{ item.state }}' | + | |
- | with_items: '{{ linux_admins }}' | + | |
- | + | ||
- | - name: " | + | |
- | ansible.builtin.file: | + | |
- | path: /home/{{ item.name }}/.ssh | + | |
- | state: directory | + | |
- | owner: '{{ item.name }}' | + | |
- | group: '{{ item.name }}' | + | |
- | mode: ' | + | |
- | when: ' item.state | + | |
- | with_items: '{{ linux_admins }}' | + | |
- | + | ||
- | - name: " | + | |
- | ansible.builtin.copy: | + | |
- | dest: /home/{{ item.name }}/ | + | |
- | content: | | + | |
- | {{ item.key }} | + | |
- | owner: '{{ item.name }}' | + | |
- | group: '{{ item.name }}' | + | |
- | mode: ' | + | |
- | when: ' item.state | + | |
- | with_items: '{{ linux_admins }}' | + | |
- | + | ||
- | - name: "VIM Konfig ablegen" | + | |
- | ansible.builtin.copy: | + | |
- | src: files/ | + | |
- | dest: /home/{{ item.name }}/.vimrc | + | |
- | owner: '{{ item.name }}' | + | |
- | group: '{{ item.name }}' | + | |
- | mode: ' | + | |
- | when: ' item.state | + | |
- | with_items: '{{ linux_admins }}' | + | |
- | + | ||
- | - name: " | + | |
- | ansible.builtin.copy: | + | |
- | src: files/ | + | |
- | dest: /home/{{ item.name }}/ | + | |
- | owner: '{{ item.name }}' | + | |
- | group: '{{ item.name }}' | + | |
- | mode: ' | + | |
- | when: ' item.state | + | |
- | with_items: '{{ linux_admins }}' | + | |
- | + | ||
- | - name: " | + | |
- | ansible.builtin.copy: | + | |
- | src: files/ | + | |
- | dest: /home/{{ item.name }}/ | + | |
- | owner: '{{ item.name }}' | + | |
- | group: '{{ item.name }}' | + | |
- | mode: ' | + | |
- | when: ' item.state | + | |
- | | + | |
- | + | ||
- | - name: " | + | |
- | | + | |
- | src: files/ | + | |
- | dest: /home/{{ item.name }}/ | + | |
- | owner: '{{ item.name }}' | + | |
- | group: '{{ item.name }}' | + | |
- | mode: ' | + | |
- | when: ' item.state == "present"' | + | |
- | | + | |
- | + | ||
- | - name: "SSH-Client-Verzeichnis entfernen, sofern der User zum Löschen gekennzeichnet ist mit absent im Inventory/ | + | |
- | | + | |
- | path: /home/{{ item.name }}/.ssh | + | |
- | state: absent | + | |
- | when: ' item.state == " | + | |
- | with_items: '{{ linux_admins }}' | + | |
- | + | ||
- | ... | + | |
- | </code> | + |