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

Idempotenz und Drift

Nach dieser Lektion: Ich kann ein Playbook zweimal ausführen und sagen, was sich geändert hat und warum.

Lektion, 60 Min.10 BefehleAnsible-Lab: eine Maschine mit einem Playbook konfigurieren, im Browser

Der Server, der von Hand repariert wurde

Um zwei Uhr nachts steht auf dem Schild eines Ladens Offen, obwohl Geschlossen stehen müsste. Jemand hat die Datei auf dem Produktivserver geändert und es niemandem gesagt.

Beim nächsten Lauf des Playbooks sollte das auffallen, und die Datei sollte zurückgesetzt werden. Diese Lektion zeigt, wie, und wie man erst nachsieht, ohne etwas zu ändern.

Am Ende dieser Lektion

Notiz

Ich kann ein Playbook zweimal ausführen und sagen, was sich geändert hat und warum.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Idempotentein erneuter Lauf ändert nichts mehr
Driftdie Wirklichkeit stimmt nicht mehr mit ihrer Beschreibung überein
Check-Modusein Lauf, der Änderungen meldet, ohne sie zu machen--check
Diffdie Zeilen, die sich ändern würden--diff
Recapdie Summen am Ende eines LaufsPLAY RECAP

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

Ein Playbook beschreibt das Ziel, nicht die Schritte

Ein Task sagt, wie eine Datei sein soll, nicht was man tippt. Ist die Datei schon richtig, tut der Task nichts und meldet ok. Ist sie es nicht, korrigiert er sie und meldet changed.

Ein gutes Playbook ist also idempotent: Der zweite Lauf meldet keine Änderungen.

Einen Ordner anlegen und hineingehen

Befehl
mkdir -p ~/iac-demo/drift && cd ~/iac-demo/drift

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 mit einem Task schreiben

Befehl
printf '%s\n' '- hosts: localhost' '  connection: local' '  gather_facts: false' '  vars:' '    zeiten: "Offen 9 bis 17 Uhr"' '  tasks:' '    - name: schild schreiben' '      ansible.builtin.copy:' '        dest: ./schild.txt' '        content: "{{ zeiten }}\n"' '        mode: "0644"' > site.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.

Es zum ersten Mal ausführen

Befehl
ansible-playbook -i localhost, site.yml | grep -E "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.

Es noch einmal ausführen

Befehl
ansible-playbook -i localhost, site.yml | grep -E "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.

Drift ist eine Änderung, die niemand notiert hat

Drift heißt: Die Wirklichkeit stimmt nicht mehr mit der Beschreibung überein, oft weil jemand sie von Hand geändert hat. Idempotenz macht Drift leicht zu reparieren.

Führen Sie das Playbook zuerst im Check-Modus aus. Er meldet, was er ändern würde, --diff zeigt die Zeilen, aber nichts wird geschrieben.

Die Datei von Hand ändern

Befehl
echo "Die ganze Woche geschlossen" > schild.txt; cat schild.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.

Erst mit Check und Diff nachsehen

Befehl
ansible-playbook -i localhost, site.yml --check --diff | grep -E "^[-+][^-+]|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 Datei noch einmal lesen

Befehl
cat schild.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.

Es wirklich ausführen, dann noch einmal

Befehl
ansible-playbook -i localhost, site.yml | grep -E "changed="; cat schild.txt; ansible-playbook -i localhost, site.yml | grep -E "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.

Ein Shell-Task sieht keine Änderung

Das Modul copy vergleicht die Datei mit dem Soll. Das Modul shell führt nur einen Befehl aus und kann nicht wissen, ob sich etwas geändert hat. Es meldet jedes Mal changed.

Das Ansible-Lab lehnt ein Playbook aus reinen Shell-Befehlen aus diesem Grund ab.

Dieselbe Arbeit als Shell-Befehl schreiben

Befehl
printf '%s\n' '- hosts: localhost' '  connection: local' '  gather_facts: false' '  tasks:' '    - name: mit einer shell schreiben' '      ansible.builtin.shell: echo "Offen 9 bis 17 Uhr" > ./shell.txt' > shell.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.

Es zweimal ausführen

Befehl
ansible-playbook -i localhost, shell.yml | grep -E "changed="; ansible-playbook -i localhost, shell.yml | grep -E "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.

Ein häufiger Fehler

Warnung

Viele denken, changed=0 beim ersten Lauf heiße, das Playbook habe nichts Nützliches getan. Es heißt, die Maschine entsprach schon dem Soll. Ein Lauf, der immer changed sagt, verbirgt Drift, weil eine echte Änderung wie eine gewöhnliche aussieht.

OpenTofu findet Drift durch Auffrischen des States

Mit einem echten Provider fragt tofu plan zuerst den echten Dienst, was existiert, und zeigt den Unterschied zum State. So bemerkt es eine Änderung von Hand.

Das terraform_data des Labs hält einen Wert und nichts außerhalb von OpenTofu, also gibt es nichts von Hand zu ändern. Diese Lektion nimmt deshalb eine Datei.

Ein Angleichen in Python berechnet

Code: python
# Eine Maschine an den Soll-Zustand angleichen und zählen, was sich geändert hat.
soll = {"zeiten": "Offen 9 bis 17 Uhr", "telefon": "0100"}
maschine = {"zeiten": "Geschlossen", "extra": "lass mich"}
geaendert = 0
for name in soll:
    if name not in maschine or maschine[name] != soll[name]:
        maschine[name] = soll[name]
        geaendert = geaendert + 1
print("geaendert =", geaendert)
# Führen Sie die Schleife noch einmal aus und schauen Sie dann auf geaendert.

Weiterführend: den Soll-Zustand ändern

Führen Sie ansible-playbook -i localhost, site.yml -e '{"zeiten": "Offen 10 bis 16 Uhr"}' | grep -E "changed=" aus und dann cat schild.txt. Führen Sie denselben Befehl noch einmal aus.

Warum ändert der erste Lauf die Datei und der zweite nicht, und welche Variable hat gewonnen?

Über dieses Lab und seinen Quellcode: Ansible-Lab: eine Maschine mit einem Playbook konfigurieren, im Browser

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.