linux:ansible:playbook_example_11

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_11 [24.09.2022 14:18. ] – [Systemweite Host/Playbook-Definition : site.yml] djangolinux:ansible:playbook_example_11 [27.09.2022 15:54. ] (aktuell) – [Rollen (Beispiele)] link eingefügt django
Zeile 2: Zeile 2:
 {{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\ {{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\
  
- +===== Grundlagen =====
-===== Roles: Grundlagen =====+
 Bevor wir nun in die Welt der **roles** bei Ansible eintauchen, werfen wir kurz noch einen Blick auf zwei gängige Szenarien: Bevor wir nun in die Welt der **roles** bei Ansible eintauchen, werfen wir kurz noch einen Blick auf zwei gängige Szenarien:
-  * **Bsp. 1**: \\ Hat man nur eine Aufgabe, wie z.B. den **[[linux:ansible:ffmuc-rpb4-ol|automatisierten Bau eines Freifunk-Offloaders auf Basis eines Raspberry 4B]]** zu bewältigen, liegt es natürlich nahe, ein Playbook anzulegen, in dem alle Schritte nacheinander aufgeführt werden, die zum Erledigen der Aufgabe nötig sind. Ehe man sich versieht hat man am Ende ein **[[linux:ansible:ffmuc-rpb4-ol#kopieren_des_ansible-playbooks|Playbook]]** vor Augen welches **//390//** Zeilen umfasst. So was kann natürlich alsbald doch sehr umfangreich und vor allem pflegeintensiv werden!+  * **Bsp. 1**: \\ Hat man nur eine Aufgabe, wie z.B. den **[[ffmuc-rpb4-ol|automatisierten Bau eines Freifunk-Offloaders auf Basis eines Raspberry 4B]]** zu bewältigen, liegt es natürlich nahe, ein Playbook anzulegen, in dem alle Schritte nacheinander aufgeführt werden, die zum Erledigen der Aufgabe nötig sind. Ehe man sich versieht hat man am Ende ein **[[ffmuc-rpb4-ol#kopieren_des_ansible-playbooks|Playbook]]** vor Augen welches **//390//** Zeilen umfasst. So was kann natürlich alsbald doch sehr umfangreich und vor allem pflegeintensiv werden!
  
   * **Bsp. 2**: \\ In ambitionierteren Umgebungen hat man es meist mit einer Vielzahl unterschiedlicher Systeme, wie z.B. Web-, Datenbank-, Mail-, Infrastrukturserver und/oder Loadbalancer-Systeme zu tun. In Ihren Aufgabestellungen unterscheiden sich diese doch erheblich, haben aber jedoch in aller Regel eine grundlegende Basisinstallation und Konfiguration. Die sind z.B. Definitionen zu Admin-Acounts, NTP-Client-Definitionen oder z.B. beim MTA-Relayhost. Nun könnte man natürlich auch hier pragmatisch vorgehend und ein Playbook mit diesen grundlegenden Einzelaufgaben wie z.B. **[[   * **Bsp. 2**: \\ In ambitionierteren Umgebungen hat man es meist mit einer Vielzahl unterschiedlicher Systeme, wie z.B. Web-, Datenbank-, Mail-, Infrastrukturserver und/oder Loadbalancer-Systeme zu tun. In Ihren Aufgabestellungen unterscheiden sich diese doch erheblich, haben aber jedoch in aller Regel eine grundlegende Basisinstallation und Konfiguration. Die sind z.B. Definitionen zu Admin-Acounts, NTP-Client-Definitionen oder z.B. beim MTA-Relayhost. Nun könnte man natürlich auch hier pragmatisch vorgehend und ein Playbook mit diesen grundlegenden Einzelaufgaben wie z.B. **[[
   * **[[playbook_example_03|Userkontenanlage]]** oder **[[playbook_example_05|NTP-Clientinstallation und -konfiguration]]** als Vorlage erstellen wollen. So eine Vorlage könnte man dann entsprechend vervielfältigen und mit den Hostspezifischen Installations- und Konfigurationsanweisung anreichern. \\ \\ Aus folgenden Gründen ist so ein Vorgehen aber nicht zu empfehlen:   * **[[playbook_example_03|Userkontenanlage]]** oder **[[playbook_example_05|NTP-Clientinstallation und -konfiguration]]** als Vorlage erstellen wollen. So eine Vorlage könnte man dann entsprechend vervielfältigen und mit den Hostspezifischen Installations- und Konfigurationsanweisung anreichern. \\ \\ Aus folgenden Gründen ist so ein Vorgehen aber nicht zu empfehlen:
     - Bei Änderungen an grundlegenden gemeinsamen Punkte, wie z.B. neuer Mitarbeiter, müsste man später jedes einzelne Playbook anfassen und anpassen.     - Bei Änderungen an grundlegenden gemeinsamen Punkte, wie z.B. neuer Mitarbeiter, müsste man später jedes einzelne Playbook anfassen und anpassen.
-    - Je nach Freunde am Umgang mit Ansible, kann im Arbeitsverzeichnis des Ansible-Nutzers es durch die vielen playbooks und/oder includierten Konfigurationsdateien sehr schnell unübersichtlich werden. +    - Je nach Freunde am Umgang mit Ansible, kann im Arbeitsverzeichnis des Ansible-Nutzers es durch die vielen Playbooks und/oder inkludierten Konfigurationsdateien sehr schnell unübersichtlich werden. 
     - Daten wie Aufgaben (tasks), Variablen (vars) oder "Spezielle Aufgaben" (handlers) sind so mehrfach definiert und vorhanden, was eine fortlaufende Pflege mehr als erschwert.     - Daten wie Aufgaben (tasks), Variablen (vars) oder "Spezielle Aufgaben" (handlers) sind so mehrfach definiert und vorhanden, was eine fortlaufende Pflege mehr als erschwert.
     - Da es keine Trennung zwischen variablen Daten und den Aufgaben (tasks  und handlers) gibt, ist es sehr schwierig unser spezielles Ansible-Playbook oder auch Teile daraus wiederzuverwenden oder mit anderen zu teilen bzw. weiterzugeben. In aller Regel sind nämlich die Daten eines Playbook organisations- und firmenspezifisch, der dazu verwendete Code natürlich allgemeingültig und allgemein an- und verwendbar. Sind die Daten und der Code nun in einer großen Datei (Playbook) zusammengefasst, ist es damit nicht mehr möglich Inhalte zu teilen oder wiederzuverwenden!     - Da es keine Trennung zwischen variablen Daten und den Aufgaben (tasks  und handlers) gibt, ist es sehr schwierig unser spezielles Ansible-Playbook oder auch Teile daraus wiederzuverwenden oder mit anderen zu teilen bzw. weiterzugeben. In aller Regel sind nämlich die Daten eines Playbook organisations- und firmenspezifisch, der dazu verwendete Code natürlich allgemeingültig und allgemein an- und verwendbar. Sind die Daten und der Code nun in einer großen Datei (Playbook) zusammengefasst, ist es damit nicht mehr möglich Inhalte zu teilen oder wiederzuverwenden!
Zeile 86: Zeile 85:
  
 === Systemweite Host/Playbook-Definition : site.yml === === Systemweite Host/Playbook-Definition : site.yml ===
-Zunächst befüllen/editieren wir die Konfigurationsdatei **''site.yml''**, die wir automatisiert bei der Grundkonfiguration von **[[first#ansibledirectory_layout|Ansibles Directory Layout]]** erzeugt hatten. Diese Datei wird später alle Definitionen unserer Systemumgebung enthalten, also nicht nur die für den Apache-Webserver, sondern auch für den Datenbank-, Mail- und sonstige Server. Die spezifischen Playbooks werden dann hier nur noch inkludiert bzw. importiert. +Zunächst erstellen und befüllen wir der Playbook-Konfigurationsdatei **''site_generation.yml''**. Diese Datei wird später alle Definitionen unserer Systemumgebung enthalten, also nicht nur die für den Apache-Webserver, sondern auch für den Datenbank-, Mail- und sonstige Server. Die spezifischen Playbooks werden dann hier nur noch inkludiert bzw. importiert. 
-   $ vim ~/ansible/site.yml +   $ vim ~/ansible/playbooks/site_generation.yml 
  
-<file c++ ~/ansible/site.yml>--- # Start des systemweiten Playbooks site.yml+<file c++ ~/ansible/playbooks/site_generation.yml>--- # Start des systemweiten Playbooks site_generation.yml
 - import_playbook: web.yml # Playbook zum Konfigurieren unseres Webservers einbinden - import_playbook: web.yml # Playbook zum Konfigurieren unseres Webservers einbinden
  
Zeile 97: Zeile 96:
 ---- ----
  
-== Webserver Host/Playbook-Definition : web.yml == +=== Webserver Host/Playbook-Definition : web_server.yml === 
-Für die Konfiguration des Webservers an sich verwenden wir dann die Konfigurationsdatei **''web.yml''**; die wir in der zuvor angelegten systemweiten Konfigurationsdatei **''site.yml''** includiert hatten. Da die Konfiguration auf allen WEB-Hosts erfolgen soll, geben wir beim Parametewr **''hosts''** den Namen der Hostgruppe aus unserer Inventory-Definition an. Bei der Definition der Rollen geben wir die drei **''roles''** an, die wir in unseren zuvor angestellten Überlegungen gewählt hatten. +Für die Konfiguration des Webservers an sich verwenden wir dann die Konfigurationsdatei **''web_server.yml''**; die wir in der zuvor angelegten systemweiten Konfigurationsdatei **''site_generation.yml''** inkludiert hatten. Da die Konfiguration auf allen WEB-Hosts erfolgen soll, geben wir beim Parameter **''hosts''** den Namen der Hostgruppe aus unserer Inventory-Definition an. Bei der Definition der Rollen geben wir die drei **''roles''** an, die wir in unseren zuvor angestellten Überlegungen gewählt hatten. 
-   $ vim ~/ansible/web.yml +   $ vim ~/ansible/playbooks/web.yml 
  
-<file yml web.yml>--- # Start des Playbooks für den Web-Server+<file c++ web_server.yml>--- # Start des Playbooks für den Web-Server
 - hosts: www - hosts: www
  
Zeile 116: Zeile 115:
    $ cp -avr common/ base/    $ cp -avr common/ base/
  
-Unser **[[centos:ansible:playbooks1#benutzer_anlegen|Playbook-Beispiel 01]]** passen wir nun an und speichern dieses im Verzeichnis **''~/ansible/roles/base/tasks/''** unter den Namen **''main.yml''**+Unser **[[playbook_example_01|Playbook-Beispiel 01]]** passen wir nun an und speichern dieses im Verzeichnis **''~/ansible/roles/base/tasks/''** unter den Namen **''main.yml''**
    $ vim ~/ansible/roles/base/tasks/main.yml    $ vim ~/ansible/roles/base/tasks/main.yml
  
-<file yml ~/ansible/roles/base/tasks/main.yml>--- # Grundlegende Konfiguration für alle Hosts+<file c++ ~/ansible/roles/base/tasks/main.yml>--- # Grundlegende Konfiguration für alle Hosts
   - name: "***base*** : Gruppe für (WEB-Entwickler) '{{ createuser }}' erstellen"   - name: "***base*** : Gruppe für (WEB-Entwickler) '{{ createuser }}' erstellen"
-    group: # https://docs.ansible.com/ansible/latest/modules/group_module.html+    ansible.builtin.group: # https://docs.ansible.com/ansible/latest/modules/group_module.html
       name: '{{ createuser }}'       name: '{{ createuser }}'
       gid: '{{ createguid }}'       gid: '{{ createguid }}'
Zeile 127: Zeile 126:
  
   - name: "***base*** : WEB-Admin Nutzerkonto für den User '{{ createuser }}' mit frn zugehörigen UID '{{ createguid }}' anlegen un der Gruppe '{{ createuser }}' zuordnen."   - name: "***base*** : WEB-Admin Nutzerkonto für den User '{{ createuser }}' mit frn zugehörigen UID '{{ createguid }}' anlegen un der Gruppe '{{ createuser }}' zuordnen."
-    user: # https://docs.ansible.com/ansible/latest/modules/user_module.html+    ansible.builtin.user: # https://docs.ansible.com/ansible/latest/modules/user_module.html
       name: '{{ createuser }}'       name: '{{ createuser }}'
       comment: '{{ createusername }}'       comment: '{{ createusername }}'
Zeile 135: Zeile 134:
  
   - name: "***base*** : Initiales Passwort für den WEB-Admin '{{ createuser }}' hinterlegen"   - name: "***base*** : Initiales Passwort für den WEB-Admin '{{ createuser }}' hinterlegen"
-    shell: # https://docs.ansible.com/ansible/latest/modules/shell_module.html+    ansible.builtin.shell: # https://docs.ansible.com/ansible/latest/modules/shell_module.html
       cmd: usermod -p $(echo '{{ createpassword }}' | openssl passwd -1 -stdin) {{ createuser }}       cmd: usermod -p $(echo '{{ createpassword }}' | openssl passwd -1 -stdin) {{ createuser }}
 </file> </file>
  
-Wie wir sehen, beinhaltet diese Datei nur noch die Definition der **tasks** aber keine Sitespezifischen Variablen, da wir diese in eine separate Date auslagern werden. Wir könnten als jederzeit diese Date auf andere Installationsumgebungen portieren oder an interessierte Adminkollegen weitergeben!+Wie wir sehen, beinhaltet diese Datei nur noch die Definition der **tasks** aber keine Sitespezifischen Variablen, da wir diese in eine separate Date auslagern werden. Wir könnten als jederzeit diese Datei auf andere Installationsumgebungen portieren oder an interessierte Adminkollegen weitergeben!
  
-Natürlich benötigen wir nun die Definition der Rolenspezifischen Variablen, die je Rolle hier **''~/ansible/roles/base/vars/main.yml''** abzulegen sind.+Natürlich benötigen wir nun die Definition der Rollenspezifischen Variablen, die je Rolle hier **''~/ansible/roles/base/vars/main.yml''** abzulegen sind.
  
    $ vim ~/ansible/roles/base/vars/main.yml    $ vim ~/ansible/roles/base/vars/main.yml
-<file yml ~/ansible/roles/base/vars/main.yml>--- # Definition der rollenspezifische Variablen+<file c++ ~/ansible/roles/base/vars/main.yml>--- # Definition der rollenspezifische Variablen
 createguid    : '1010'                        # GID/UID des Benutzers00 createguid    : '1010'                        # GID/UID des Benutzers00
 createuser    : 'ruben'                       # Username createuser    : 'ruben'                       # Username
Zeile 150: Zeile 149:
 createpassword: 'M31nP4p4157d3r4113r83573!'   # Initialpasswort (ungecrypted!) createpassword: 'M31nP4p4157d3r4113r83573!'   # Initialpasswort (ungecrypted!)
 </file> </file>
 +
 +Da wir dort ein Passwort vorhalten, werden wir Dank unserer **[[playbook_example_07|Ansible-Vault]]**-Konfiguration diese Datei nun verschlüsseln.
 +   $ ansyble-vault encrypt ~/ansible/roles/base/vars/main.yml
  
 Die nächste Rolle, die wir konfigurieren müssen, ist die für den NTP-Daemon **''chrony''**. Auch hier kopieren wir zunächst das Default-role-template **common**. Die nächste Rolle, die wir konfigurieren müssen, ist die für den NTP-Daemon **''chrony''**. Auch hier kopieren wir zunächst das Default-role-template **common**.
Zeile 155: Zeile 157:
    $ cp -avr common/ chrony/    $ cp -avr common/ chrony/
  
-Auch hier greifen wir wieder auf das bereits bekannte **[[centos:ansible:playbooks1#ntp-daemon_chrony_installieren_und_konfigurieren|Playbook-Beispiel 05]]** zurück, passen dieses an und speichern es im Verzeichnis **''~/ansible/roles/chrony/tasks/''** unter den Namen **''main.yml''**. Bei diesem Konfigurationsbeispiel besteht das playbook aber lediglich aus vier **tasks**, die wir als eigenständige Dateien auslagern und hier nur includieren werden.+Auch hier greifen wir wieder auf das bereits bekannte **[[playbook_example_05|Playbook-Beispiel 05]]** zurück, passen dieses an und speichern es im Verzeichnis **''~/ansible/roles/chrony/tasks/''** unter den Namen **''main.yml''**. Bei diesem Konfigurationsbeispiel besteht das Playbook aber lediglich aus vier **tasks**, die wir als eigenständige Dateien auslagern und hier nur inkludieren werden.
    $ vim ~/ansible/roles/chrony/tasks/main.yml    $ vim ~/ansible/roles/chrony/tasks/main.yml
  
-<file yml ~/ansible/roles/chrony/tasks/main.yml>--- # Hauptinstallations-/Konfigurationsdatei für den Dienst chrony+<file c++ ~/ansible/roles/chrony/tasks/main.yml>--- # Hauptinstallations-/Konfigurationsdatei für den Dienst chrony
 - include: install.yml       # Installation - include: install.yml       # Installation
 - include: config-backup.yml # original-Konfig sichern - include: config-backup.yml # original-Konfig sichern
Zeile 165: Zeile 167:
 </file> </file>
  
-Die vier **tasks** hinterlegen wire dann anschließend in der zugehörigen YML-Datei.+Die vier **tasks** hinterlegen wir dann anschließend in der zugehörigen YML-Datei.
    $ vim ~/ansible/roles/chrony/tasks/install.yml    $ vim ~/ansible/roles/chrony/tasks/install.yml
-<file yml ~/ansible/roles/chrony/tasks/install.yml>---+<file c++ ~/ansible/roles/chrony/tasks/install.yml>---
   - name: "***chrony*** : Installation des Deamon '{{ daemon_name }}' (in der aktuellsten Version)"   - name: "***chrony*** : Installation des Deamon '{{ daemon_name }}' (in der aktuellsten Version)"
-    dnf: +    ansible.builtin.dnf: 
     #https://docs.ansible.com/ansible/latest/modules/dnf_module.html     #https://docs.ansible.com/ansible/latest/modules/dnf_module.html
       name: '{{ daemon_name }}'       name: '{{ daemon_name }}'
Zeile 176: Zeile 178:
  
    $ vim ~/ansible/roles/chrony/tasks/config-backup.yml    $ vim ~/ansible/roles/chrony/tasks/config-backup.yml
-<file yml ~/ansible/roles/chrony/tasks/config-backup.yml>---+<file c++ ~/ansible/roles/chrony/tasks/config-backup.yml>---
   - name: "***chrony*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '{{ config_file }}' bereits existiert"   - name: "***chrony*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '{{ config_file }}' bereits existiert"
-    stat: # https://docs.ansible.com/ansible/latest/modules/stat_module.html +    ansible.builtin.stat: # https://docs.ansible.com/ansible/latest/modules/stat_module.html 
       path: /etc/chrony.conf.orig       path: /etc/chrony.conf.orig
     register: stat_result     register: stat_result
  
   - name: "***chrony*** : 2) Von der bestehenden originalen Konfigurationsdatei '{{ config_file }}' ein Backup '{{ config_file }}'.orig erstellen"   - name: "***chrony*** : 2) Von der bestehenden originalen Konfigurationsdatei '{{ config_file }}' ein Backup '{{ config_file }}'.orig erstellen"
-    copy: # https://docs.ansible.com/ansible/latest/modules/copy_module.html+    ansible.builtin.copy: # https://docs.ansible.com/ansible/latest/modules/copy_module.html
       remote_src: yes       remote_src: yes
       src: '{{ config_file }}'       src: '{{ config_file }}'
Zeile 193: Zeile 195:
 <file yml ~/ansible/roles/chrony/tasks/configure.yml>--- <file yml ~/ansible/roles/chrony/tasks/configure.yml>---
   - name: "***chrony*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen"   - name: "***chrony*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen"
-    template: # https://docs.ansible.com/ansible/latest/modules/template_module.html +    ansible.builtin.template: # https://docs.ansible.com/ansible/latest/modules/template_module.html 
       src: templates/chrony-client.conf.j2        src: templates/chrony-client.conf.j2 
       dest: "{{ config_file }}"       dest: "{{ config_file }}"
Zeile 201: Zeile 203:
    $ vim ~/ansible/roles/chrony/templates/chrony-client.conf.j2    $ vim ~/ansible/roles/chrony/templates/chrony-client.conf.j2
  
-<file yml ~/ansible/roles/chrony/templates/chrony-client.conf.j2># Use public servers from the pool.ntp.org project.+<file c++ ~/ansible/roles/chrony/templates/chrony-client.conf.j2># Use public servers from the pool.ntp.org project.
 # Please consider joining the pool (http://www.pool.ntp.org/join.html). # Please consider joining the pool (http://www.pool.ntp.org/join.html).
 {{ chrony_pool }} {{ chrony_pool }}
Zeile 250: Zeile 252:
 Der **task** zum Starten des Daemon legen wir im Verzeichnis **''task''** ab. Der **task** zum Starten des Daemon legen wir im Verzeichnis **''task''** ab.
    $ vim ~/ansible/roles/chrony/tasks/service.yml    $ vim ~/ansible/roles/chrony/tasks/service.yml
-<file yml ~/ansible/roles/chrony/tasks/service.yml>---+<file c++ ~/ansible/roles/chrony/tasks/service.yml>---
   - name: "***chrony*** : Sicherstellen dass der  Daemon '{{ daemon_name }}' (beim Systemstart) gestartet wird und läuft"   - name: "***chrony*** : Sicherstellen dass der  Daemon '{{ daemon_name }}' (beim Systemstart) gestartet wird und läuft"
-    service: # https://docs.ansible.com/ansible/latest/modules/service_module.html +    ansible.builtin.service: # https://docs.ansible.com/ansible/latest/modules/service_module.html 
       name: chronyd        name: chronyd 
       state: started        state: started 
Zeile 260: Zeile 262:
 Zu guter letzt benötigen wir auch hier eine zur Rolle gehörige Parameter-Datei mit den Definitionen der Variablen. Zu guter letzt benötigen wir auch hier eine zur Rolle gehörige Parameter-Datei mit den Definitionen der Variablen.
    $ vim ~/ansible/roles/chrony/vars/main.yml    $ vim ~/ansible/roles/chrony/vars/main.yml
-<file yml ~/ansible/roles/chrony/vars/main.yml>--- # Definition der rollenspezifische Variablen zum Dienst chrony+<file c++ ~/ansible/roles/chrony/vars/main.yml>--- # Definition der rollenspezifische Variablen zum Dienst chrony
 daemon_name         : chrony daemon_name         : chrony
 config_file         : /etc/chrony.conf config_file         : /etc/chrony.conf
Zeile 278: Zeile 280:
    $ vim ~/ansible/roles/www/tasks/main.yml    $ vim ~/ansible/roles/www/tasks/main.yml
  
-<file yml ~/ansible/roles/www/tasks/main.yml>--- # Hauptinstallations-/Konfigurationsdatei für den Apache-Webserver+<file c++ ~/ansible/roles/www/tasks/main.yml>--- # Hauptinstallations-/Konfigurationsdatei für den Apache-Webserver
 - include: install.yml       # Installation - include: install.yml       # Installation
 - include: config-backup.yml # original-Konfig sichern - include: config-backup.yml # original-Konfig sichern
Zeile 290: Zeile 292:
    $ vim ~/ansible/roles/www/tasks/install.yml    $ vim ~/ansible/roles/www/tasks/install.yml
  
-<file yml ~/ansible/roles/www/tasks/install.yml>---+<file c++ ~/ansible/roles/www/tasks/install.yml>---
   - name: "***www*** : Installation des Deamon '{{ daemon_name }}' (in der aktuellsten Version)"   - name: "***www*** : Installation des Deamon '{{ daemon_name }}' (in der aktuellsten Version)"
-    dnf:+    ansible.builtin.dnf:
     #https://docs.ansible.com/ansible/latest/modules/dnf_module.html     #https://docs.ansible.com/ansible/latest/modules/dnf_module.html
       name: '{{ daemon_name }}'       name: '{{ daemon_name }}'
Zeile 301: Zeile 303:
    $ cp ~/ansible/roles/chrony/tasks/config-backup.yml ~/ansible/roles/www/tasks/config-backup.yml    $ cp ~/ansible/roles/chrony/tasks/config-backup.yml ~/ansible/roles/www/tasks/config-backup.yml
    $ vim ~/ansible/roles/www/tasks/config-backup.yml    $ vim ~/ansible/roles/www/tasks/config-backup.yml
-<file yml ~/ansible/roles/www/tasks/config-backup.yml>---+<file c++ ~/ansible/roles/www/tasks/config-backup.yml>---
   - name: "***www*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '{{ config_file }}' bereits existiert"   - name: "***www*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '{{ config_file }}' bereits existiert"
-    stat: # https://docs.ansible.com/ansible/latest/modules/stat_module.html +    ansible.builtin.stat: # https://docs.ansible.com/ansible/latest/modules/stat_module.html 
       path: '{{ backup_file }}'       path: '{{ backup_file }}'
     register: stat_result     register: stat_result
Zeile 317: Zeile 319:
    $ cp ~/ansible/roles/chrony/tasks/configure.yml ~/ansible/roles/www/tasks/configure.yml    $ cp ~/ansible/roles/chrony/tasks/configure.yml ~/ansible/roles/www/tasks/configure.yml
    $ vim ~/ansible/roles/www/tasks/configure.yml    $ vim ~/ansible/roles/www/tasks/configure.yml
-<file yml ~/ansible/roles/www/tasks/configure.yml>---+<file c++ ~/ansible/roles/www/tasks/configure.yml>---
   - name: "***www*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen"   - name: "***www*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen"
-    template: # https://docs.ansible.com/ansible/latest/modules/template_module.html +    ansible.builtin.template: # https://docs.ansible.com/ansible/latest/modules/template_module.html 
       src: templates/httpd-server.conf.j2       src: templates/httpd-server.conf.j2
       dest: "{{ config_file }}"       dest: "{{ config_file }}"
Zeile 326: Zeile 328:
 Auch hier benötigen wir eine Datei, in der die Variablen für den Task **www** vorgehalten werden. Auch hier benötigen wir eine Datei, in der die Variablen für den Task **www** vorgehalten werden.
    $ vim ~/ansible/roles/www/vars/main.yml    $ vim ~/ansible/roles/www/vars/main.yml
-<file yml ~/ansible/roles/www/vars/main.yml>--- # Definition der rollenspezifische Variablen zum Apache-Webserver httpd+<file c++ ~/ansible/roles/www/vars/main.yml>--- # Definition der rollenspezifische Variablen zum Apache-Webserver httpd
 daemon_name                : httpd daemon_name                : httpd
 config_file                : /etc/httpd/conf/httpd.conf config_file                : /etc/httpd/conf/httpd.conf
Zeile 340: Zeile 342:
    $ cp ~/ansible/roles/chrony/tasks/service.yml ~/ansible/roles/www/tasks/service.yml    $ cp ~/ansible/roles/chrony/tasks/service.yml ~/ansible/roles/www/tasks/service.yml
    $ vim ~/ansible/roles/www/tasks/service.yml    $ vim ~/ansible/roles/www/tasks/service.yml
-<file yml ~/ansible/roles/www/tasks/service.yml>---+<file c++ ~/ansible/roles/www/tasks/service.yml>---
   - name: "***www*** : Sicherstellen dass der  Daemon '{{ daemon_name }}' (beim Systemstart) gestartet wird und läuft"   - name: "***www*** : Sicherstellen dass der  Daemon '{{ daemon_name }}' (beim Systemstart) gestartet wird und läuft"
-    service: # https://docs.ansible.com/ansible/latest/modules/service_module.html +    ansible.builtin.service: # https://docs.ansible.com/ansible/latest/modules/service_module.html 
       name: httpd       name: httpd
       state: started       state: started
Zeile 348: Zeile 350:
  
   - name: "***www*** : Paketfilter anpassen und Port 80 (HTTP) öffnen"   - name: "***www*** : Paketfilter anpassen und Port 80 (HTTP) öffnen"
-    firewalld: # https://docs.ansible.com/ansible/latest/modules/firewalld_module.html+    ansible.builtin.firewalld: # https://docs.ansible.com/ansible/latest/modules/firewalld_module.html
       service: http       service: http
       permanent: yes       permanent: yes
Zeile 457: Zeile 459:
 └── web.yml</code> └── web.yml</code>
  
-<WRAP center round tip 80%> 
-Abschließend kann man sich nun berechtigter Weise die Frage stellen, warum man nun mehrere Dateien erstellt haben,um den Code und die Variablen dazu, der die Pakete installiert und die Dienste verwaltet, separat zu speichern? Wir sind so sehr leicht in der Lage zum, Beispiel Dienste in mehreren Phasen bereitstellen. In einer ersten Phase können wir so Anwendungen lediglich installieren und konfigurieren und erst in der zweiten Phase dann die Dienste dann starten.  
-Natürlich haben es wir so auch leichter Teiel des Codes wiederzu verwenden, als wenn man eine große Datei vernweden würde in der alle Einzelschritte selektiv aufgeführt sind! 
-</WRAP> 
  
----- 
 === Script ausführen === === Script ausführen ===
 Zum Schluss rufen wir unser erstes **role**-based Playbook auf uns installieren und konfigurieren unseren Webserver. Zum Schluss rufen wir unser erstes **role**-based Playbook auf uns installieren und konfigurieren unseren Webserver.
Zeile 470: Zeile 467:
 <font style="color: rgb(0, 0, 0)">BECOME password:  <font style="color: rgb(0, 0, 0)">BECOME password: 
  
-PLAY [demo] *************************************************************************************************************************+PLAY [demo] *****************************************************************************************************************************************************
  
-TASK [Gathering Facts] **************************************************************************************************************</font>+TASK [Gathering Facts] ******************************************************************************************************************************************</font>
 <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br> <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***base*** : Gruppe für (WEB-Entwickler) 'ruben' erstellen] *******************************************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***base*** : Gruppe für (WEB-Entwickler) 'ruben' erstellen] ***********************************************************************************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***base*** : WEB-Admin Nutzerkonto für den User 'ruben' mit frn zugehörigen UID '1010' anlegen un der Gruppe 'ruben' zuordnen.] </font>+<font style="color: rgb(0, 0, 0)">TASK [***base*** : WEB-Admin Nutzerkonto für den User 'ruben' mit frn zugehörigen UID '1010' anlegen un der Gruppe 'ruben' zuordnen.] ***************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***base*** : Initiales Passwort für den WEB-Admin 'ruben' hinterlegen] ********************************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***base*** : Initiales Passwort für den WEB-Admin 'ruben' hinterlegen] ************************************************************************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : Installation des Deamon 'chrony' (in der aktuellsten Version)] *************************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : Installation des Deamon 'chrony' (in der aktuellsten Version)] *****************************************************************************</font>
 <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br> <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '/etc/chrony.conf' bereits existiert] **********************</font>+<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '/etc/chrony.conf' bereits existiert] **************************************************</font>
 <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br> <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : 2) Von der bestehenden originalen Konfigurationsdatei '/etc/chrony.conf' ein Backup '/etc/chrony.conf'.orig erstellen] *****************************************************************************************************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : 2) Von der bestehenden originalen Konfigurationsdatei '/etc/chrony.conf' ein Backup '/etc/chrony.conf'.orig erstellen] *********************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen] **********************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen] **************************************************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : Sicherstellen dass der  Daemon 'chrony' (beim Systemstart) gestartet wird und läuft] ***************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***chrony*** : Sicherstellen dass der  Daemon 'chrony' (beim Systemstart) gestartet wird und läuft] *******************************************************</font>
 <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br> <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***www*** : Installation des Deamon 'httpd' (in der aktuellsten Version)] *****************************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***www*** : Installation des Deamon 'httpd' (in der aktuellsten Version)] *********************************************************************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***www*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '/etc/httpd/conf/httpd.conf' bereits existiert] ***************</font>+<font style="color: rgb(0, 0, 0)">TASK [***www*** : 1) Überprüfen ob das Backup der Konfigurationsdatei '/etc/httpd/conf/httpd.conf' bereits existiert] *******************************************</font>
 <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br> <font style="color: rgb(25, 100, 5)">ok: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***www*** : 2) Von der bestehenden originalen Konfigurationsdatei '/etc/httpd/conf/httpd.conf' ein Backup '/etc/httpd/conf/httpd.conf.orig' erstellen] *************************************************************************************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***www*** : 2) Von der bestehenden originalen Konfigurationsdatei '/etc/httpd/conf/httpd.conf' ein Backup '/etc/httpd/conf/httpd.conf.orig' erstellen] ****</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***www*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen] *************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***www*** : Template Konfigurationsdatei an Ort und Stelle kopieren und Variablen setzen] *****************************************************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***www*** : default-Homepage an Ort und Stelle kopieren] **********************************************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***www*** : default-Homepage an Ort und Stelle kopieren] **************************************************************************************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***www*** : Sicherstellen dass der  Daemon 'httpd' (beim Systemstart) gestartet wird und läuft] *******************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***www*** : Sicherstellen dass der  Daemon 'httpd' (beim Systemstart) gestartet wird und läuft] ***********************************************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">TASK [***www*** : Paketfilter anpassen und Port 80 (HTTP) öffnen] *******************************************************************</font>+<font style="color: rgb(0, 0, 0)">TASK [***www*** : Paketfilter anpassen und Port 80 (HTTP) öffnen] ***********************************************************************************************</font>
 <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br> <font style="color: rgb(196, 160, 0)">changed: [demo]</font><br>
-<font style="color: rgb(0, 0, 0)">PLAY RECAP *************************************************************************************************************************************</font>+<font style="color: rgb(0, 0, 0)">PLAY RECAP ******************************************************************************************************************************************************</font>
 <font style="color: rgb(196, 160, 0)">demo        </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=16    </font><font style="color: rgb(196, 160, 0)">changed=11    </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font><br></pre> <font style="color: rgb(196, 160, 0)">demo        </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=16    </font><font style="color: rgb(196, 160, 0)">changed=11    </font><font style="color: rgb(0, 0, 0)">unreachable=0    failed=0    skipped=0    rescued=0    ignored=0</font><br></pre>
 </html> </html>
  
-==== Rollen (Beispiele) ====+===== Rollen (Beispiele) =====
   * **[[centos:rsynd_c8#automatisierter_weg_mit_hilfe_von_ansible|rsync]]**//-Server unter CentOS 8.x einrichten//   * **[[centos:rsynd_c8#automatisierter_weg_mit_hilfe_von_ansible|rsync]]**//-Server unter CentOS 8.x einrichten//
   * **[[centos:pxe_c8:tftp#automatisierter_weg_mit_hilfe_von_ansible|tftp]]**//-Server unter CentOS 8.x einrichten//   * **[[centos:pxe_c8:tftp#automatisierter_weg_mit_hilfe_von_ansible|tftp]]**//-Server unter CentOS 8.x einrichten//
 +  * **[[ffmuc-rpb4-ol#aufbau_des_ansible-playbooks_-_inhalte|Bau eines Freifunk-Offloaders auf Basis eines Raspberry 4B]]**
  
  
-:KRIT: FIXME :KRIT: +===== Fazit  und Ausblick =====
  
 +<WRAP center round info 80%>
 +Abschließend kann man sich nun berechtigter Weise die Frage stellen, warum man nun mehrere Dateien erstellt haben,um den Code und die Variablen dazu, der die Pakete installiert und die Dienste verwaltet, separat zu speichern? Wir sind so sehr leicht in der Lage zum, Beispiel Dienste in mehreren Phasen bereitstellen. In einer ersten Phase können wir so Anwendungen lediglich installieren und konfigurieren und erst in der zweiten Phase dann die Dienste dann starten. 
 +Natürlich haben es wir so auch leichter Teile des Codes wieder zu verwenden, als wenn man eine große Datei verwenden würde in der alle Einzelschritte selektiv aufgeführt sind!
 +</WRAP>
  
  
-===== lorem ipsum dolor sit amet =====+====== Links ====== 
 +  * **[[detail|zurück zum Kapitel "Ansible - Erweiterte Konfigurationsbeispiele"]] <= ** 
 +  * **=> [[playbook_example_12|weiter zum Kapitel "Ansible-Lint: Die "Ansible-Fusselbürste"]]** 
 +  * **[[start|Zurück zur "Ansible"-Übersicht]]** 
 +  * **[[wiki:start|Zurück zu >>Projekte und Themenkapitel<<]]** 
 +  * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**
  
-:KRIT: FIXME :KRIT: 
  
  
  • linux/ansible/playbook_example_11.1664029118.txt.gz
  • Zuletzt geändert: 24.09.2022 14:18.
  • von django