Zwei Läden, ein Rezept
Eine Firma betreibt einen Laden an der Ecke und einen auf dem Hügel. Beide brauchen dieselbe Einrichtung. Dateien zu kopieren geht gut, bis etwas repariert werden muss: dann repariert man es zweimal.
Ein Modul ist das Rezept, einmal geschrieben. Jeder Laden ruft es mit seinen eigenen Werten auf.
Am Ende dieser Lektion
Notiz
Ich kann ein Modul zweimal aufrufen und lesen, was jede Kopie zurückgibt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Modul | ein Ordner mit Dateien, den man wiederverwenden kann | |
| Modulaufruf | ein Block, der ein Modul benutzt und ihm Werte gibt | module "huegel" |
| Ausgabe | ein Wert, den ein Modul zurückgibt | output |
| Validierung | eine Regel, die eine falsche Eingabe ablehnt | |
| Moduladresse | der Pfad einer Ressource, der mit module beginnt | module.huegel.terraform_data.schild |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Modul ist ein Ordner, den man aufruft
Ein Modul ist ein Ordner mit OpenTofu-Dateien. Das Projekt, das es benutzt, ist die Wurzel. Die Wurzel schreibt einen Modulaufruf, nennt den Ordner in source und gibt jeder Eingabe einen Wert.
Zwei Aufrufe machen zwei getrennte Kopien von allem im Ordner. Die Quelle ist hier ein lokaler Pfad, also wird nichts heruntergeladen.
Ordner anlegen und hineingehen
mkdir -p ~/iac-demo/module/modules/laden && cd ~/iac-demo/moduleHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Modul schreiben
printf '%s\n' 'variable "name" {' ' type = string' ' validation {' ' condition = length(var.name) >= 3 && length(var.name) <= 10' ' error_message = "Der Name muss 3 bis 10 Zeichen haben."' ' }' '}' '' 'resource "terraform_data" "schild" {' ' input = format("%s: offen", var.name)' '}' '' 'output "schild" {' ' value = terraform_data.schild.output' '}' > modules/laden/main.tfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Wurzel schreiben: zwei Aufrufe, eine Ausgabe
printf '%s\n' 'module "ecke" {' ' source = "./modules/laden"' ' name = "Ecke"' '}' '' 'module "huegel" {' ' source = "./modules/laden"' ' name = "Huegel"' '}' '' 'output "schilder" {' ' value = [module.ecke.schild, module.huegel.schild]' '}' > main.tfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Ordner vorbereiten
tofu init -no-color | grep -E "Initializing modules|ecke|huegel|successfully"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Planen und die Adressen ansehen
tofu plan -no-color | grep -E "will be created|^Plan"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 Modul gibt Ausgaben zurück
Eine Ressource in einem Modul hat eine längere Adresse, etwa module.huegel.terraform_data.schild. Die Wurzel kann sie nicht direkt lesen.
Nur eine Ausgabe kommt durch die Wand. Die Wurzel liest sie als module.huegel.schild: der Aufrufname, dann der Ausgabename.
Anwenden, damit der State beide Kopien enthält
tofu apply -auto-approve -no-color | grep "Apply complete"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 Adressen im State auflisten
tofu state listHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Ausgabe der Wurzel lesen
tofu output schilderHier 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, die Wurzel könne jede Ressource in einem Modul lesen. Das kann sie nicht. Ein Modul teilt nur, was seine Ausgaben nennen. Ein Wert, den man außen braucht, braucht einen output-Block.
Eine Ressource ohne Ausgabe lesen
printf '%s\n' 'output "schlecht" {' ' value = module.ecke.terraform_data.schild' '}' > schlecht.tf; tofu validate -no-color 2>&1 | grep -E "Error|Unsupported"; rm schlecht.tfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Validierung lehnt eine falsche Eingabe ab
Ein validation-Block enthält eine condition und eine error_message. Ist die Bedingung falsch, hält OpenTofu an, bevor irgendetwas geplant wird, und zeigt die Meldung.
Das Modul nimmt einen Namen mit 3 bis 10 Zeichen. Probieren Sie einen zu kurzen.
Dem Hügel einen zu kurzen Namen geben
sed -i 's/"Huegel"/"Hu"/' main.tf; tofu validate -no-color 2>&1 | grep -E "Error|muss 3"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 Namen zurücksetzen und prüfen
sed -i 's/"Hu"/"Huegel"/' main.tf; tofu validate -no-colorHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zwei Aufrufe in Python berechnet
# Die Adressen berechnen, die ein Modulaufruf erzeugt.
ressourcen = ["schild", "tuer"]
aufrufe = {"ecke": None, "huegel": None}
for aufruf in aufrufe:
for name in ressourcen:
print("module." + aufruf + ".terraform_data." + name)
# Ersetzen Sie "huegel": None durch "huegel": ["a", "b"] und schauen Sie noch einmal.
Jetzt im Lab
Die Runs haben ein Modul in einem Übungsordner gebaut. Das Lab hat dafür auch einen Ordner, ~/tofu-lab/shop, und Teil 7 seiner README (auf Englisch) sagt, was zu bauen ist. Es ist nicht dasselbe Modul: Sie müssen ändern, was Sie gesehen haben, nicht kopieren.
Wie es bewertet wird
Ihre Lehrperson bewertet es mit einer Prüfung auf Ihrem gespeicherten Lab. Die Prüfung wendet Ihr Projekt an und ruft Ihr Modul dann noch einmal mit Namen und einem Status auf, die Sie nie gesehen haben. Ein Modul mit eingetippten Antworten kann ihnen nicht folgen, und eines ohne Validierungsregel auch nicht.
Weiterführend: ein Aufruf mit count
Fügen Sie dem Aufruf huegel count = 2 hinzu und ersetzen Sie in der Ausgabe module.huegel.schild durch module.huegel[0].schild. Führen Sie tofu plan -no-color | grep -E "will be|^Plan" aus.
Welche Adressen zeigt der Plan jetzt, und warum musste die Ausgabezeile sich ändern?