Einführung
Stellen Sie sich vor, Sie bestellen einen Kaffee. Wenn auf der Speisekarte nur „Kaffee“ steht, bekommen Sie vielleicht jedes Mal schwarzen Kaffee. Gibt es jedoch Optionen wie „Größe“ oder „Milchsorte“, können Sie Ihre Bestellung anpassen, ohne dass der Barista für jede einzelne Kombination ein neues Rezept lernen muss.
In Terraform machen Variablen Konfigurationen wiederverwendbar. Eingabewerte können geändert werden, ohne die gesamte Datei neu schreiben zu müssen.
Mit Ausgaben kann Terraform wichtige Ergebniswerte wie IDs, Namen oder Adressen anzeigen. Zusammen machen Variablen und Ausgaben Terraform-Konfigurationen modularer und praktischer.
Am Ende dieses Labs verfügen Sie über eine flexible Terraform-Konfiguration, mit der Sie bei Bedarf Container mit unterschiedlichen Namen erstellen können.
Variablen trennen die Konfigurationslogik von umgebungsspezifischen Daten. Ausgaben gehen in die umgekehrte Richtung: Sie stellen nützliche Ergebniswerte für Benutzer oder nachfolgende Automatisierungsschritte bereit.
Variablendatei erstellen
Gute Köche organisieren ihre Zutaten, bevor sie mit dem Kochen beginnen. In Terraform ist es eine bewährte Praxis, angepasste Optionen (Variablen) getrennt vom eigentlichen Rezept aufzubewahren.
Der Standardname für diese Datei lautet variables.tf. Das Erstellen dieser Datei ändert nicht die Funktionsweise von Terraform: Terraform liest alle .tf-Dateien im Ordner so ein, als wären sie ein einziges großes Buch. Die Dateien bleiben dadurch jedoch übersichtlich organisiert.
Dieses Organisationsprinzip ist bei IaC wichtig, weil reale Konfigurationen schnell wachsen. Eine klare Trennung von Variablen, Ressourcen und Ausgaben erleichtert die spätere Wartung erheblich.
Wechseln Sie in unseren Projektordner und erstellen Sie die Datei:
cd ~/project
touch variables.tf
Nun gibt es eine leere Datei, in der wir unsere Definitionen ablegen können. Im nächsten Schritt fügen wir den Inhalt hinzu.
Eine Variable definieren
Jetzt müssen wir festlegen, welche Optionen verfügbar sind. Das entspricht dem Hinzufügen eines Feldes „Name“ zu einem Bestellformular.
Öffnen Sie variables.tf mit nano:
nano variables.tf
Fügen Sie diesen Block ein. Er teilt Terraform Folgendes mit: Es gibt eine Option namens container_name, sie akzeptiert Text (string), und wenn der Benutzer keinen Wert angibt, soll der Name ExampleNginxContainer verwendet werden.
variable "container_name" {
description = "Value of the name for the Docker container"
type = string
default = "ExampleNginxContainer"
}
Speichern Sie die Datei und beenden Sie nano mit Ctrl+O, Enter und Ctrl+X.
Nachdem das Formularfeld vorhanden ist, müssen wir es in unserem Rezept verwenden. Dazu erstellen wir eine Datei main.tf, die diese Variable verwendet.
Erstellen Sie main.tf:
nano main.tf
Fügen Sie den folgenden Code ein. Achten Sie besonders auf name = var.container_name. Damit binden wir die Variable in die Konfiguration ein.
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.1"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
name = var.container_name
ports {
internal = 80
external = 8000
}
}
Speichern Sie die Datei und beenden Sie nano.
Mit var.container_name sagen wir Terraform: „Trage keinen festen Namen ein. Suche den Wert der Variablen container_name und verwende ihn.“
Ausgaben definieren
Wenn Sie etwas kaufen, erhalten Sie eine Quittung. In Terraform funktionieren Ausgaben ähnlich: Sie zeigen wichtige Details zu dem an, was gerade erstellt wurde.
Das ist besonders nützlich für Informationen, die vor der Erstellung der Ressource noch nicht bekannt sein können, etwa eine vom System vergebene zufällige ID oder eine öffentliche IP-Adresse.
Ausgaben sind besonders hilfreich, wenn ein Teil der Infrastruktur Informationen an einen menschlichen Operator, ein anderes Terraform-Modul oder einen späteren Automatisierungsschritt weitergeben muss.
Erstellen Sie die Datei outputs.tf, um diese Rückgabewerte übersichtlich zu verwalten. Öffnen Sie sie mit nano:
nano outputs.tf
Fügen Sie diesen Block ein. Er teilt Terraform mit: „Gib nach Abschluss die ID des nginx-Containers aus.“
output "container_id" {
description = "ID of the Docker container"
value = docker_container.nginx.id
}
Speichern Sie die Datei und beenden Sie nano.
Führen Sie nun unseren Code aus.
Initialisieren Sie zuerst das Projekt. Dabei wird der Docker-Provider heruntergeladen:
terraform init
Wenden Sie anschließend die Konfiguration an. Wir geben keinen Containernamen an, daher wird der Standardwert (ExampleNginxContainer) verwendet. Mit -auto-approve überspringen wir die Bestätigungsabfrage „yes“ und sparen Zeit.
terraform apply -auto-approve
Sehen Sie sich den untersten Teil der Ausgabe an. Dort sollte Outputs: und anschließend der Wert container_id erscheinen.
Variablen überschreiben
Die eigentliche Stärke von Variablen besteht darin, dass Sie ihre Werte ändern können, ohne den Code neu zu schreiben. Angenommen, Sie möchten einen zweiten Container mit einem anderen Namen starten. Sie müssen main.tf dafür nicht bearbeiten.
Teilen Sie Terraform stattdessen mit dem Flag -var mit, dass der Standardwert überschrieben werden soll. Das ist so, als würden Sie dem Barista sagen: „Machen Sie den Kaffee doch in Größe Large.“
Führen Sie diesen Befehl aus:
terraform apply -var="container_name=MyDynamicContainer" -auto-approve
Beobachten Sie die Ausgabe aufmerksam. Terraform meldet: docker_container.nginx must be replaced.
Warum? Bei Docker lässt sich der Name eines laufenden Containers nicht einfach ändern. Um den Namen zu ändern, entscheidet Terraform, dass der alte Container zerstört (-) und ein neuer Container (+) mit dem neuen Namen erstellt werden muss. Das ist ein grundlegendes Prinzip unveränderlicher Infrastruktur: Wir ersetzen Ressourcen, statt sie nachträglich zu ändern.
Überprüfen Sie, ob der neue Container ausgeführt wird:
docker ps --format "{{.Names}}"
In der Ausgabe sollte MyDynamicContainer erscheinen.
Zusammenfassung
Glückwunsch! Sie haben Ihren Terraform-Code erfolgreich dynamisch gestaltet.
In diesem Lab haben Sie gelernt:
- Variablen: Wie Sie mit
variables.tfflexible „Formularfelder“ für Ihren Code erstellen. - Referenzierung: Wie Sie
var.variable_nameverwenden, um diese Werte in Ihre Hauptkonfiguration einzufügen. - Ausgaben: Wie Sie mit
outputs.tfnach einer Ausführung wichtige Daten – die „Quittung“ – anzeigen. - Überschreibungen: Wie Sie über die Befehlszeile mit
-varneue Werte eingeben und denselben Code für unterschiedliche Situationen wiederverwenden.



