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

Module, Ausgaben und Validierung

Nach dieser Lektion: Ich kann ein Modul zweimal aufrufen und lesen, was jede Kopie zurückgibt.

Lektion, 60 Min.11 BefehleOpenTofu-Lab: Infrastructure as Code mit Plan, Apply und State auf einer VM

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

BegriffWas er bedeutetBeispiel
Modulein Ordner mit Dateien, den man wiederverwenden kann
Modulaufrufein Block, der ein Modul benutzt und ihm Werte gibtmodule "huegel"
Ausgabeein Wert, den ein Modul zurückgibtoutput
Validierungeine Regel, die eine falsche Eingabe ablehnt
Moduladresseder Pfad einer Ressource, der mit module beginntmodule.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

Befehl
mkdir -p ~/iac-demo/module/modules/laden && cd ~/iac-demo/module

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 Modul schreiben

Befehl
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.tf

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 Wurzel schreiben: zwei Aufrufe, eine Ausgabe

Befehl
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.tf

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 Ordner vorbereiten

Befehl
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

Befehl
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

Befehl
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

Befehl
tofu state list

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 Ausgabe der Wurzel lesen

Befehl
tofu output schilder

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, 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

Befehl
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.tf

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 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

Befehl
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

Befehl
sed -i 's/"Hu"/"Huegel"/' main.tf; tofu validate -no-color

Hier 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

Code: python
# 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?

Über dieses Lab und seinen Quellcode: OpenTofu-Lab: Infrastructure as Code mit Plan, Apply und State auf einer 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.