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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Idempotent | ein erneuter Lauf ändert nichts mehr | |
| Drift | die Wirklichkeit stimmt nicht mehr mit ihrer Beschreibung überein | |
| Check-Modus | ein Lauf, der Änderungen meldet, ohne sie zu machen | --check |
| Diff | die Zeilen, die sich ändern würden | --diff |
| Recap | die Summen am Ende eines Laufs | PLAY 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
mkdir -p ~/iac-demo/drift && cd ~/iac-demo/driftHier 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
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.ymlHier 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
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
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
echo "Die ganze Woche geschlossen" > schild.txt; cat schild.txtHier 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
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
cat schild.txtHier 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
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
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.ymlHier 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
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
# 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?