Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Jinja2-Vorlagen und Handler in Ansible

Nach dieser Lektion: Ich kann eine Vorlage aus Variablen füllen und einen Handler genau einmal ausführen.

Lektion, 60 Min.16 BefehleLab für Ansible-Rollen: eine Rolle, Handler und Vault in einer Ubuntu-VM

Was sind Ansible-Vorlagen und Handler?

Eine Vorlage (englisch Template) ist eine Datei mit Lücken, die Ansible aus Variablen füllt. Ein Handler ist eine Aufgabe, die nur läuft, wenn eine andere etwas verändert hat.

Zusammen lösen sie ein alltägliches Problem. Eine Konfigurationsdatei soll aus Daten entstehen. Der Dienst soll nur neu laden, wenn sich wirklich etwas geändert hat.

Am Ende dieser Lektion

Notiz

Ich kann eine Vorlage aus Variablen füllen und einen Handler genau einmal ausführen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Vorlageeine Datei mit Lücken, die Ansible aus Variablen fülltliste.j2
Jinja2die Sprache, in der die Lücken einer Vorlage geschrieben sind
Schleifeein Block, der für jeden Eintrag einer Liste wiederholt wirdfor
Bedingungein Block, der nur bei wahrem Wert erscheintif
Handlereine Aufgabe, die nur auf Zuruf läuft
notifyder Zuruf, mit dem eine Aufgabe einen Handler anmeldet

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Einen eigenen Ordner anlegen

Befehl
mkdir -p ~/rolle-demo

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

In den Ordner wechseln

Befehl
cd ~/rolle-demo

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Inventar mit einem Rechner schreiben

Befehl
printf '%s\n' '[web]' 'web1 ansible_connection=local' > inventory.ini

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine neue Rolle anlegen

Befehl
ansible-galaxy role init --init-path ~/rolle-demo/roles laborliste

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine Vorlage hat Lücken und Anweisungen

In einer Jinja2-Vorlage steht ein Wert in doppelten geschweiften Klammern, etwa {{ labor }}. Ansible ersetzt ihn durch den Inhalt der Variable.

Eine Schleife läuft von {% for ... %} bis {% endfor %} und wiederholt ihren Inhalt je Eintrag. Eine Bedingung läuft von {% if ... %} bis {% endif %} und erscheint nur, wenn der Wert wahr ist.

Die Daten der Rolle schreiben

Befehl
printf '%s\n' 'labore:' '  - physik' '  - chemie' '  - informatik' 'wartung: false' 'zielordner: /tmp/laborliste' > roles/laborliste/defaults/main.yml

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Vorlage schreiben

Befehl
printf '%s\n' 'Labore der Hochschule:' '{% for labor in labore %}' '- {{ labor }}' '{% endfor %}' '{% if wartung %}' 'Achtung: Wartungsfenster aktiv' '{% endif %}' > roles/laborliste/templates/liste.j2

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Handler läuft einmal, auch bei mehreren Meldungen

Zwei Aufgaben der Rolle tragen notify: Bericht schreiben. Das meldet den Handler an. Er läuft erst am Ende des Plays und nur einmal, egal wie viele Aufgaben ihn gemeldet haben.

Er läuft nur, wenn mindestens eine meldende Aufgabe etwas verändert hat. Hat nichts gewechselt, bleibt er aus.

Drei Aufgaben schreiben, zwei melden

Befehl
printf '%s\n' '- name: Ordner anlegen' '  ansible.builtin.file:' '    path: "{{ zielordner }}"' '    state: directory' '    mode: "0755"' '- name: Liste schreiben' '  ansible.builtin.template:' '    src: liste.j2' '    dest: "{{ zielordner }}/labore.txt"' '    mode: "0644"' '  notify: Bericht schreiben' '- name: Marke schreiben' '  ansible.builtin.copy:' '    content: "v1\n"' '    dest: "{{ zielordner }}/marke.txt"' '    mode: "0644"' '  notify: Bericht schreiben' > roles/laborliste/tasks/main.yml

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Handler schreiben

Befehl
printf '%s\n' '- name: Bericht schreiben' '  ansible.builtin.copy:' '    content: "Die Liste wurde neu geschrieben\n"' '    dest: "{{ zielordner }}/bericht.txt"' '    mode: "0644"' > roles/laborliste/handlers/main.yml

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Playbook für die Rolle schreiben

Befehl
printf '%s\n' '- hosts: web1' '  gather_facts: false' '  roles:' '    - laborliste' > laborliste.yml

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Playbook zum ersten Mal ausführen

Befehl
ansible-playbook -i inventory.ini laborliste.yml | grep -E "RUNNING HANDLER|changed="

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die fertige Liste lesen

Befehl
cat /tmp/laborliste/labore.txt

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Handler beim zweiten Lauf zählen

Befehl
ansible-playbook -i inventory.ini laborliste.yml | grep -c "RUNNING HANDLER"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Beispiel: was in welchem Lauf geschieht

LaufWas sich ändertHandler läuft
ErsterOrdner, Liste, Marke und Bericht sind neuEinmal, am Ende
Zweiter, gleiche DatenNichtsNie
Mit wartung=trueDie Liste bekommt eine Zeile mehrEinmal, denn die Liste änderte sich

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die Bedingung mit wartung=true auslösen

Befehl
ansible-playbook -i inventory.ini laborliste.yml -e wartung=true | grep -c "RUNNING HANDLER"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Liste noch einmal lesen

Befehl
cat /tmp/laborliste/labore.txt

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Warum -e wartung=false die Bedingung nicht abschaltet

Auf der Kommandozeile ist jeder Wert zuerst ein Text. Der Text false ist nicht leer, und Jinja2 hält einen nicht leeren Text für wahr.

Wollen Sie einen echten Wahrheitswert, übergeben Sie JSON: -e '{"wartung": false}'. Dann ist false ein Wahrheitswert und die Bedingung fällt weg.

wartung=false als Text übergeben

Befehl
ansible-playbook -i inventory.ini laborliste.yml -e wartung=false | grep -c "RUNNING HANDLER"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

wartung als Wahrheitswert übergeben

Befehl
ansible-playbook -i inventory.ini laborliste.yml -e '{"wartung": false}' | grep -c "RUNNING HANDLER"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele schreiben -e wartung=false und wundern sich, dass die Zeile bleibt. Auf der Kommandozeile ist false ein Text, und jeder nicht leere Text ist wahr. Nehmen Sie -e mit JSON, wenn ein Wahrheitswert gemeint ist.

Weiterführend

Ändern Sie in defaults/main.yml die Liste der Labore und führen Sie das Playbook aus. Die Liste und der Bericht ändern sich, die Marke bleibt, wie sie ist.

Ihr Ordner ~/rolle-demo und /tmp/laborliste gehören Ihnen. Das Projekt roles-lab des Labs bleibt unberührt.

Über dieses Lab und seinen Quellcode: Lab für Ansible-Rollen: eine Rolle, Handler und Vault in einer Ubuntu-VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.