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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Vorlage | eine Datei mit Lücken, die Ansible aus Variablen füllt | liste.j2 |
| Jinja2 | die Sprache, in der die Lücken einer Vorlage geschrieben sind | |
| Schleife | ein Block, der für jeden Eintrag einer Liste wiederholt wird | for |
| Bedingung | ein Block, der nur bei wahrem Wert erscheint | if |
| Handler | eine Aufgabe, die nur auf Zuruf läuft | |
| notify | der Zuruf, mit dem eine Aufgabe einen Handler anmeldet |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Einen eigenen Ordner anlegen
mkdir -p ~/rolle-demoHier 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
cd ~/rolle-demoHier 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
printf '%s\n' '[web]' 'web1 ansible_connection=local' > inventory.iniHier 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
ansible-galaxy role init --init-path ~/rolle-demo/roles laborlisteHier 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
printf '%s\n' 'labore:' ' - physik' ' - chemie' ' - informatik' 'wartung: false' 'zielordner: /tmp/laborliste' > roles/laborliste/defaults/main.ymlHier 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
printf '%s\n' 'Labore der Hochschule:' '{% for labor in labore %}' '- {{ labor }}' '{% endfor %}' '{% if wartung %}' 'Achtung: Wartungsfenster aktiv' '{% endif %}' > roles/laborliste/templates/liste.j2Hier 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
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.ymlHier 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
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.ymlHier 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
printf '%s\n' '- hosts: web1' ' gather_facts: false' ' roles:' ' - laborliste' > laborliste.ymlHier 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
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
cat /tmp/laborliste/labore.txtHier 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
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
| Lauf | Was sich ändert | Handler läuft |
|---|---|---|
| Erster | Ordner, Liste, Marke und Bericht sind neu | Einmal, am Ende |
| Zweiter, gleiche Daten | Nichts | Nie |
| Mit wartung=true | Die Liste bekommt eine Zeile mehr | Einmal, denn die Liste änderte sich |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Bedingung mit wartung=true auslösen
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
cat /tmp/laborliste/labore.txtHier 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
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
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.