Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste ÜberarbeitungBeide Seiten der Revision |
centos:ansible:playbooks1 [28.06.2020 13:28. ] – [Script anlegen] django | centos:ansible:playbooks1 [14.09.2022 13:47. ] – django |
---|
===== Playbook - Beispiele ===== | ===== Playbook - Beispiele ===== |
In den beiden Kapiteln **[[centos:ansible:start#playbooks|Playbooks]]** und **[[centos:ansible:start#yaml_-_was_ist_das|YAML - was ist das?]]** hatten wir uns schon eingehend mit den Hintergrundinformationen zu diesen beiden Themenblöcken beschäftigt, so dass wir uns nun direkt mit unserem ersten Playbook beschäftigen können. | In den beiden Kapiteln **[[centos:ansible:start#playbooks|Playbooks]]** und **[[centos:ansible:start#yaml_-_was_ist_das|YAML - was ist das?]]** hatten wir uns schon eingehend mit den Hintergrundinformationen zu diesen beiden Themenblöcken beschäftigt, so dass wir uns nun direkt mit unserem ersten Playbook beschäftigen können. |
| |
| |
==== 01: Benutzer anlegen ==== | |
Bei unserem ersten Playbook-Beispiel wollen wir mit Hilfe von Ansible einen Benutzer auf unserem Zielsystem automatisiert anlegen. | |
Bevor wir unser erstes Script schreiben, wechseln wir in unser zuvor angelegtes Zielverzeichnis: | |
$ cd ~/ansible | |
| |
=== Script anlegen === | |
Hier legen wir nun unser erstes Script ab. | |
$ vim 01_create-user.yml | |
| |
<file bash 01_create-user.yml>--- | |
- hosts: centos8 | |
become: true | |
vars: | |
sudoers: ansible | |
createguid: '1010' | |
createuser: 'ruben' | |
createusername: 'Ruben Nausch' | |
createpassword: 'M31nP4p4157d3r4113r83573!' | |
| |
tasks: | |
- name: Make sure we have a group '{{ createuser }}' for our new admin-user '{{ createuser }}' | |
group: | |
name: '{{ createuser }}' | |
gid: '{{ createguid }}' | |
state: present | |
| |
- name: Add the user '{{ createuser }}' with a specific uid and a primary group of '{{ createuser }}' | |
user: | |
name: '{{ createuser }}' | |
comment: '{{ createusername }}' | |
uid: '{{ createguid }}' | |
group: '{{ createuser }}' | |
state: present | |
| |
- name: Initial password generation for user '{{ createuser }}' | |
shell: usermod -p $(echo '{{ createpassword }}' | openssl passwd -1 -stdin) {{ createuser }} | |
...</file> | |
| |
=== Script Beschreibung === | |
Die einzelnen Zeilen haben dabei folgende Funktionen und Aufgaben. | |
Zeile: | |
* Zeile **1**: **''%%---%%''** : Start-Ziele einer jeden YAML-Datei | |
* Zeile **2**: **''- hosts: centos8''** : Das Script soll auf allen Systemen, die in unserer **[[#remote_user-anpassung_via_inventory_hostsyml|Inventory]]**-Datei die Eigenschaft **//CentOS 8//** zugewiesen bekommen haben. | |
* Zeile **3**: **''become: true''** : Wir benötigen eine **[[#mit_abfrage_eines_passwortes|Rechteerweiterung]]** zu **root**-Rechten, damit wir einen neuen Nutzer auf dem Zielsystem anlegen können. | |
* Zeile **4**: **''vars:''** Wir möchten unser Script so gestalten, dass dies später für ggf. weiter Nutzer möglichst einfach zu verwenden ist. Daher verwenden wir hier Variablen. | |
* Zeile **5**: **''sudoers: ansible''** Nutzer auf dem Zielsystem, der für die Administrationsaufgaben benutzt werden soll. | |
* Zeile **6**: **''createguid: '1010'''** Variable die der **UID** bzw. der **GID** unseres Nutzers 'ruben' zugewiesen werden soll. | |
* Zeile **7**: **''createuser: 'ruben'''** Variable mit dem Nutzernamen 'ruben' | |
* Zeile **8**: **''createusername: 'Ruben Nausch'''** Variable mit dem vollen Namen des Benutzers 'ruben' | |
* Zeile **9**: **''createpassword: 'M31nP4p4157d3r4113r8357'''** Variable mit dem initialen Klartextpasswortes der Benutzers 'ruben' | |
* Zeile **10**: | |
* Zeile **11**: **''tasks''** Schlüsselwort mit den nachfolgenden Aufgaben, die mit dem Playbook dann abgearbeitet werden sollen. | |
* Zeile **12**: **''name''**: Beschreibender Text(//Make sure we have a group 'ruben' for our new admin-user 'ruben'//), der später beim Aufruf von **''ansible-playbooks''** ausgegeben werden soll. | |
* Zeile **13 - 16**: **''group:''** Ansible Module **[[https://docs.ansible.com/ansible/latest/modules/group_module.html|group]]** welches zum Anlegen, verändern und auch Löschen von Gruppen herangezogen werden kann. | |
* Zeile **17**: | |
* Zeile **18**: **''name''**: Beschreibender Text(//Add the user 'ruben' with a specific uid and a primary group of 'ruben'//), der später beim Aufruf von **''ansible-playbooks''** ausgegeben werden soll. | |
* Zeile **19 - 24**: **''user:''** Ansible Module **[[https://docs.ansible.com/ansible/latest/modules/user_module.html|user]]** welches zum Anlegen, verändern und auch Löschen von Benutzern herangezogen werden kann. | |
* Zeile **25**: | |
* Zeile **26**: **''name''**: Beschreibender Text(//Initial password generation for user 'ruben'//), der später beim Aufruf von **''ansible-playbooks''** ausgegeben werden soll. | |
* Zeile **27**: **''shell:''** Ansible Module **[[https://docs.ansible.com/ansible/latest/modules/shell_module.html|shell]]** welches zum Ausführen von Shell-Befehlen auf dem Zielsystem verwendet werden kann. Hiermit setzen wir das Passwort unseres gerade angelegten Users 'ruben'. | |
* Zeile **28**: **''%%...%%''** Endekennzeichen der YML-Datei | |
| |
| |
=== Script ausführen === | |
Nun wollen wir unser ersten Playbook ausführen, um auf dem Zielhost den gewünschten Benutzer anzulegen; hierzu rufen wir unser Script wie folgt auf: | |
$ ansible-playbook -v 01_create-user.yml --limit=demo | |
| |
<WRAP center round tip 80%> | |
Da wir den User erst einmal nur auf dem Host **demo** anlegen wollen, \\ schränken wir beim Aufruf des Playbooks die Ausführung mit dem Parameter **''limit=''** entsprechend ein. | |
</WRAP> | |
| |
| |
<html><pre class="code"> | |
<font style="color: rgb(43, 100, 164)">Using /etc/ansible/ansible.cfg as config file</font> | |
<font style="color: rgb(0, 0, 0)">BECOME password: | |
| |
PLAY [centos8] **************************************************************************************************************************************** | |
| |
TASK [Gathering Facts] ****************************************************************************************************************************************</font> | |
<font style="color: rgb(25, 100, 5)">ok: [www8.dmz.nausch.org]</font><br> | |
<font style="color: rgb(0, 0, 0)">TASK [Make sure we have a group 'ruben' for our new admin-user 'ruben'] ****************************************************************</font> | |
<font style="color: rgb(196, 160, 0)">changed: [www8.dmz.nausch.org] => {"changed": true, "gid": 1010, "name": "ruben", "state": "present", "system": false}</font><br> | |
<font style="color: rgb(0, 0, 0)">TASK [Add the user 'ruben' with a specific uid and a primary group of 'ruben'] *********************************************************</font> | |
<font style="color: rgb(196, 160, 0)">changed: [www8.dmz.nausch.org] => {"changed": true, "comment": "Ruben Nausch", "create_home": true, "group": 1010, "home": "/home/ruben", "name": "ruben", "shell": "/bin/bash", "state": "present", "stderr": "Creating mailbox file: File exists\n", "stderr_lines": ["Creating mailbox file: File exists"], "system": false, "uid": 1010}</font><br> | |
<font style="color: rgb(0, 0, 0)">TASK [Initial password generation for user 'ruben'] ************************************************************************************</font> | |
<font style="color: rgb(196, 160, 0)">changed: [www8.dmz.nausch.org] => {"changed": true, "cmd": "usermod -p $(echo 'M31nP4p4157d3r4113r83573!' | openssl passwd -1 -stdin) ruben", "delta": "0:00:00.375778", "end": "2020-01-04 20:00:16.435753", "rc": 0, "start": "2020-01-04 20:00:16.059975", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}</font></br> | |
<font style="color: rgb(0, 0, 0)">PLAY RECAP ***************************************************************************************************************************************</font> | |
<font style="color: rgb(196, 160, 0)">www8.dmz.nausch.org </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=4 </font><font style="color: rgb(196, 160, 0)">changed=3 </font><font style="color: rgb(0, 0, 0)">unreachable=0 failed=0 skipped=0 rescued=0 ignored=0</font><br></pre> | |
</html> | |
| |
=== Script Ablaufbeschreibung === | |
Bei jedem Ansible-Playbook werden beim Ausführen zu aller erst die sog. Facts durch Ansible gesammelt. | |
| |
Anschließend werden die einzelnen Tasks (Aufgaben) der Reihe nach abgearbeitet. In der Zeile nach **TASK** wird dann die Beschreibung ausgegeben, die wir im YAML-Script nach dem Schlüsselwort **''name:''** angegeben hatten. | |
| |
Bei der Ausgabe werden Stati mit einer entsprechneden Farbe hinterlegt: | |
* <html><b><font style="color: rgb(25, 100, 5)">grün</font></b></html> : Werden lediglich von Ansible Daten erhoben, oder wenn Aufgaben keine Änderungen nach sich ziehen, werden die entsprechenden Zeilen mit der Farbe <html><b><font style="color: rgb(25, 100, 5)">grün</font></b></html> dargestellt. | |
* <html><b><font style="color: rgb(196, 160, 0)">ockergelb</font></b></html> : Werden Änderungen durch das Script verursacht erfolgt die Anzeige in der Farbe <html><b><font style="color: rgb(196, 160, 0)">ockergelb</font></b></html> angezeigt. | |
* <html><b><font style="color: rgb(99, 0, 0)">rot</font></b></html> : Fehler werden in der Farbe <html><b><font style="color: rgb(99, 0, 0)">rot</font></b></html> dargestellt. | |
| |
Eine Zusammenfasssung für jeden Host wir am ende unter dem Kennzeichen **PLAY RECAP** nochmals zusammengefasst. | |
| |
=== Protokollierung === | |
Auf dem Zielhost werden die Aktivitäten des Ansible-Playbooks entsprechend protokolliert. | |
# less /var/log/secure | |
| |
<code>Jan 4 19:59:51 vml000090 sshd[11916]: Postponed publickey for ansible from 10.0.0.27 port 50940 ssh2 [preauth] | |
Jan 4 19:59:51 vml000090 sshd[11916]: Accepted publickey for ansible from 10.0.0.27 port 50940 ssh2: ED25519 SHA256:jTZQUDbCqZaV648fKVBfx3L4+tBMWL+z+iUCBY3kKMQ | |
Jan 4 19:59:51 vml000090 systemd[11920]: pam_unix(systemd-user:session): session opened for user ansible by (uid=0) | |
Jan 4 19:59:51 vml000090 sshd[11916]: pam_unix(sshd:session): session opened for user ansible by (uid=0) | |
Jan 4 19:59:58 vml000090 sudo[12053]: ansible : TTY=pts/1 ; PWD=/home/ansible ; USER=root ; COMMAND=/bin/sh -c echo BECOME-SUCCESS-lxiprplnioypvfmjjylwxvdjapibaahs ; /usr/libexec/platform-python /home/ansible/.ansible/tmp/ansible-tmp-1578164696.339052-252470145168513/AnsiballZ_setup.py | |
Jan 4 19:59:58 vml000090 sudo[12053]: pam_systemd(sudo:session): Cannot create session: Already running in a session or user slice | |
Jan 4 19:59:58 vml000090 sudo[12053]: pam_unix(sudo:session): session opened for user root by ansible(uid=0) | |
Jan 4 20:00:06 vml000090 sudo[12053]: pam_unix(sudo:session): session closed for user root | |
Jan 4 20:00:12 vml000090 sudo[12213]: ansible : TTY=pts/1 ; PWD=/home/ansible ; USER=root ; COMMAND=/bin/sh -c echo BECOME-SUCCESS-dkoativjxmvilrtomekhdjnqzyyyuqqr ; /usr/libexec/platform-python /home/ansible/.ansible/tmp/ansible-tmp-1578164713.323935-211226042197181/AnsiballZ_group.py | |
Jan 4 20:00:12 vml000090 sudo[12213]: pam_systemd(sudo:session): Cannot create session: Already running in a session or user slice | |
Jan 4 20:00:12 vml000090 sudo[12213]: pam_unix(sudo:session): session opened for user root by ansible(uid=0) | |
Jan 4 20:00:12 vml000090 groupadd[12222]: group added to /etc/group: name=ruben, GID=1010 | |
Jan 4 20:00:12 vml000090 groupadd[12222]: group added to /etc/gshadow: name=ruben | |
Jan 4 20:00:12 vml000090 groupadd[12222]: new group: name=ruben, GID=1010 | |
Jan 4 20:00:12 vml000090 sudo[12213]: pam_unix(sudo:session): session closed for user root | |
Jan 4 20:00:14 vml000090 sudo[12330]: ansible : TTY=pts/1 ; PWD=/home/ansible ; USER=root ; COMMAND=/bin/sh -c echo BECOME-SUCCESS-qrempbbpxxpgsigefdvnuctemlnerdpu ; /usr/libexec/platform-python /home/ansible/.ansible/tmp/ansible-tmp-1578164719.7395723-99484507541654/AnsiballZ_user.py | |
Jan 4 20:00:14 vml000090 sudo[12330]: pam_systemd(sudo:session): Cannot create session: Already running in a session or user slice | |
Jan 4 20:00:14 vml000090 sudo[12330]: pam_unix(sudo:session): session opened for user root by ansible(uid=0) | |
Jan 4 20:00:14 vml000090 useradd[12339]: new user: name=ruben, UID=1010, GID=1010, home=/home/ruben, shell=/bin/bash | |
Jan 4 20:00:14 vml000090 sudo[12330]: pam_unix(sudo:session): session closed for user root | |
Jan 4 20:00:15 vml000090 sudo[12448]: ansible : TTY=pts/1 ; PWD=/home/ansible ; USER=root ; COMMAND=/bin/sh -c echo BECOME-SUCCESS-guzlsexqnsjzxvmqkxlzyfmeywwkmtxf ; /usr/libexec/platform-python /home/ansible/.ansible/tmp/ansible-tmp-1578164721.6724513-118758141371611/AnsiballZ_command.py | |
Jan 4 20:00:15 vml000090 sudo[12448]: pam_systemd(sudo:session): Cannot create session: Already running in a session or user slice | |
Jan 4 20:00:15 vml000090 sudo[12448]: pam_unix(sudo:session): session opened for user root by ansible(uid=0) | |
Jan 4 20:00:16 vml000090 usermod[12455]: change user 'ruben' password | |
Jan 4 20:00:16 vml000090 sudo[12448]: pam_unix(sudo:session): session closed for user root</code> | |
| |
==== 02: sudoers anpassen ==== | ==== 02: sudoers anpassen ==== |
Bei unserem zweiten Beispiel wollen wir lediglich dafür sorgen, dass die Nutzer der Gruppe **''wheel''** beim Ausführen von Befehlen, die **root**-Berechtigungen erfordern, ihr Passwort eingeben müssen. Hierzu werden wir im Verzeichnis **''/etc/sudoers.d/''** eine Datei mit dem Namen **''10_passwd_sudo_wheel''** ablegen, die nachfolgenden Inhalt aufweist. | |
<code># Allows people in group wheel to run all command | |
%wheel ALL=(ALL) ALL</code> | |
| |
=== Script anlegen === | |
Hier legen wir nun unser erstes Script ab. | |
$ vim 02_passwd_sudo_wheel.yml | |
| |
<file bash 02_passwd_sudo_wheel.yml>--- | |
- hosts: centos8 | |
become: true | |
vars: | |
sudoers: ansible | |
| |
tasks: | |
- name: All users from groub 'wheel' are allowed sudo users | |
copy: | |
content: "# 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> | |
| |
=== Script Beschreibung === | |
Die einzelnen Zeilen/Blöcke haben dabei folgende Funktionen und Aufgaben. | |
Zeile: | |
* Zeile **1 - 5**: Der bereits bekannte Block aus dem **[[#script_beschreibung|ersten Beispiel]]**, der Aussagen trifft, wo das Script laufen soll, unter welchen User-Rechten das passiern soll etc. pp.. | |
* https://docs.ansible.com/ansible/latest/modules/copy_module.html | |
* Zeile **6**: | |
* Zeile **7**: **''tasks''** Schlüsselwort mit den nachfolgenden Aufgaben, die mit dem Playbook dann abgearbeitet werden sollen. | |
* Zeile **8**: **''name''**: Beschreibender Text (//All users from groub 'wheel' are allowed sudo users//), der später beim Aufruf von **''ansible-playbooks''** ausgegeben werden soll. | |
* Zeile **9 - 15**: **''copy:''** Ansible Module **[[https://docs.ansible.com/ansible/latest/modules/copy_module.html|copy]]** welches zum Kopieren, verändern und auch Löschen von Dateien herangezogen werden kann. | |
| |
=== Script ausführen === | |
Nun wollen wir unser ersten Playbook ausführen, um auf dem Zielhost eine Datei mit dem gewünschten Inhalt ablegen; hierzu rufen wir unser Script wie folgt auf: | |
$ ansible-playbook -v 02_passwd_sudo_wheel.yml | |
| |
<html><pre class="code"> | |
<font style="color: rgb(43, 100, 164)">Using /etc/ansible/ansible.cfg as config file</font> | |
<font style="color: rgb(0, 0, 0)">BECOME password: | |
| |
PLAY [centos8] **************************************************************************************************************************************** | |
| |
TASK [Gathering Facts] ****************************************************************************************************************************************</font> | |
<font style="color: rgb(25, 100, 5)">ok: [www8.dmz.nausch.org]</font><br> | |
<font style="color: rgb(0, 0, 0)">TASK [All users from groub 'wheel' are allowed sudo users] *****************************************************************************</font> | |
<font style="color: rgb(196, 160, 0)">changed: [www8.dmz.nausch.org] => {"changed": true, "checksum": "b51f017f799aca0d0aef9fa29b7da87006ea5c29", "dest": "/etc/sudoers.d/10_passwd_sudo_wheel", "gid": 0, "group": "root", "md5sum": "a7c4cc84eb0dbbf844d2a8d4fbe64164", "mode": "0440", "owner": "root", "secontext": "system_u:object_r:etc_t:s0", "size": 80, "src": "/home/ansible/.ansible/tmp/ansible-tmp-1578174240.9800038-82649856412743/source", "state": "file", "uid": 0}</font><br> | |
<font style="color: rgb(0, 0, 0)">PLAY RECAP ***************************************************************************************************************************************</font> | |
<font style="color: rgb(196, 160, 0)">www8.dmz.nausch.org </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=2 </font><font style="color: rgb(196, 160, 0)">changed=1 </font><font style="color: rgb(0, 0, 0)">unreachable=0 failed=0 skipped=0 rescued=0 ignored=0</font><br></pre> | |
</html> | |
| |
=== Ergebnis === | |
Auf dem Zielhost findet sich nun unsere gewünschte Datei mit dem zugehörigen Inhalt. | |
# cat /etc/sudoers.d/10_passwd_sudo_wheel | |
| |
<file bash /etc/sudoers.d/10_passwd_sudo_wheel># Allows people in group wheel to run all command | |
%wheel ALL=(ALL) ALL</file> | |
| |
| |
==== 03: mehrere Benutzer anlegen und SSH-Schlüssel kopieren ==== | ==== 03: mehrere Benutzer anlegen und SSH-Schlüssel kopieren ==== |
Beim drittem Playbook-Beispiel wollen wir mit Hilfe von Ansible nicht nur ein Admin-Konto sondern gleich mehrere anlegen. Dabei kopieren wir dann auch noch gleich die zugehörigen öffentlichen SSH-Schlüssel an Ort und Stelle. Zu guter Letzt stellen wir noch sicher dass der Eintrag **''%wheel ALL=(ALL) ALL''** gesetzt ist, hierzu binden wird das YAML-Playbook von [[#sudoers_anpassen|Beispiel 02]] ein. | Beim drittem Playbook-Beispiel wollen wir mit Hilfe von Ansible nicht nur ein Admin-Konto sondern gleich mehrere anlegen. Dabei kopieren wir dann auch noch gleich die zugehörigen öffentlichen SSH-Schlüssel an Ort und Stelle. Zu guter Letzt stellen wir noch sicher dass der Eintrag **''%wheel ALL=(ALL) ALL''** gesetzt ist, hierzu binden wird das YAML-Playbook von [[#sudoers_anpassen|Beispiel 02]] ein. |
| |
- include_tasks: 02_passwd_sudo_wheel.yml | - include_tasks: 02_passwd_sudo_wheel.yml |
| ... |
</file> | </file> |
| |
- ansible_facts['distribution'] == "CentOS" | - ansible_facts['distribution'] == "CentOS" |
- ansible_facts['distribution_major_version'] == "7" | - ansible_facts['distribution_major_version'] == "7" |
| ... |
</file> | </file> |
| |
state: started | state: started |
enabled: yes | enabled: yes |
| ... |
</file> | </file> |
| |
#https://docs.ansible.com/ansible/latest/modules/raw_module.html | #https://docs.ansible.com/ansible/latest/modules/raw_module.html |
raw: uci set gluon-node-info.@owner[0].contact=' Django [BOfH] django@nausch.org | chat -> @django' ; uci commit | raw: uci set gluon-node-info.@owner[0].contact=' Django [BOfH] django@nausch.org | chat -> @django' ; uci commit |
| ... |
</file> | </file> |
| |
| |
==== 07: Mit Hilfe von Ansible einen Offloader auf Basis eines Raspberry 4B bauen ==== | ==== 07: Mit Hilfe von Ansible einen Offloader auf Basis eines Raspberry 4B bauen ==== |
In diesem Konfigurationsbeispiel wollen wir möglichst einfach und schnell einen Offloader für **[[https://ffmuc.net|Freifunk München]] auf Basis eines **[[https://www.raspberrypi.org/products/raspberry-pi-4-model-b/|Raspberry 4B]] befassen. Dabei gehen wir auf unterschiedliche Konfigurations-Optionen ein und wollen dennoch die Einstiegshürden für den ungeübteren Ansible und Linux-User möglichst tief ansetzen. | In diesem **[[centos:ansible:ffmuc-rpb4-ol|Konfigurationsbeispiel]]** wollen wir möglichst einfach und schnell einen Offloader für **[[https://ffmuc.net|Freifunk München]] auf Basis eines **[[https://www.raspberrypi.org/products/raspberry-pi-4-model-b/|Raspberry 4B]] befassen. Dabei gehen wir auf unterschiedliche Konfigurations-Optionen ein und wollen dennoch die Einstiegshürden für den ungeübteren Ansible und Linux-User möglichst tief ansetzen. |
| |
Das entsprechende **Howto** findet sich im Detail auf folgender Seite **[[centos:ansible:ffmuc-rpb4-ol|hier]]**. | |
| |
| Die detaillierte Beschreibung hierzu ist im Kapitel **[[centos:ansible:ffmuc-rpb4-ol|Bau eines Freifunk-Offloaders auf Basis eines Raspberry 4B]]** zu finden. |
====== Links ====== | ====== Links ====== |
* **[[centos:ansible:first|zurück zum Kapitel "Erste Schritte Rund um Ansible"]] <= ** | * **[[centos:ansible:first|zurück zum Kapitel "Erste Schritte Rund um Ansible"]] <= ** |