# Terraform HCL: Syntax, Struktur & Configuration-Management
TL;DR / Management Summary HCL (HashiCorp Configuration Language) ist die Sprache, mit der wir in Terraform unsere Infrastruktur beschreiben. Sie ist für Menschen lesbar wie YAML, aber so mächtig wie eine Programmiersprache. Ein Senior Admin nutzt HCL, um komplexe Umgebungen modular aufzubauen. Wir trennen dabei strikt zwischen Providern (der API-Anschluss), Ressourcen (das eigentliche Objekt) und Variablen (die Parameter), um den Code wartbar und wiederverwendbar zu halten.
# 1. Die Anatomie einer .tf Datei
Die Grundbausteine.
Eine Terraform-Konfiguration besteht aus vier Haupt-Elementen:
- Provider: Welches System steuern wir? (z.B.
proxmox). - Resource: Was wollen wir erstellen? (z.B.
proxmox_vm_qemu). - Variable: Welche Werte ändern sich? (z.B.
vm_memory). - Output: Welche Informationen brauchen wir nach dem Lauf? (z.B. die
ip_address).
# 2. HCL Syntax in der Praxis
Schreiben statt Klicken.
# Beispiel: Eine einfache VM-Definition
resource "proxmox_vm_qemu" "my_server" {
name = "web-prod-01"
target_node = "pve01"
clone = "debian-template"
# Ressourcen-Zuweisung
cores = 2
memory = 2048
# Netzwerk-Block
network {
model = "virtio"
bridge = "vmbr0"
}
}
# 3. Deep Dive: Variablen & Datentypen
Den Code flexibel machen.
Vermeiden Sie fest kodierte Werte (Hardcoding).
- Variable Definition:
variable "instance_count" {
type = number
default = 3
description = "Anzahl der zu erstellenden Webserver"
}
- Nutzung:
count = var.instance_count. - Vorteil: Sie können das gleiche Skript für
Production(10 Instanzen) undDev(1 Instanz) nutzen, ohne den Code zu ändern.
# 4. Day-2 Operations: Interpolation & Functions
Logik im Code.
HCL bietet eingebaute Funktionen:
- Conditional:
memory = var.is_prod ? 8192 : 2048(Wähle RAM basierend auf Umgebung). - String Manipulation:
name = "pve-${lower(var.region)}-01". - Lookups: Suchen von Werten in Maps (Listen).
# 5. Troubleshooting & “War Stories”
Wenn die Syntax beißt.
# Top 3 Fehlerbilder
-
Symptom: “Missing required argument”.
- Ursache: Der Provider hat sich aktualisiert und erfordert nun ein neues Feld (z.B.
ipconfig0bei Cloud-Init). - Lösung: Dokumentation des Providers (z.B. Telmate/Proxmox) prüfen.
- Ursache: Der Provider hat sich aktualisiert und erfordert nun ein neues Feld (z.B.
-
Symptom: Variablen werden nicht gefunden.
- Ursache: Terraform liest nur Dateien mit der Endung
.tf. Variablen in.tfvarsmüssen explizit mit-var-filegeladen werden (außer sie heißenterraform.tfvars).
- Ursache: Terraform liest nur Dateien mit der Endung
-
Symptom: “Duplicate resource name”.
- Fix: Jede Ressource muss eine eindeutige Kombination aus Typ und lokalem Namen haben.
# “War Story”: Der “String-Integer” Wahnsinn
Ein Admin übergab die VM-ID als String ("100") statt als Zahl (100).
Das Ergebnis: Die Proxmox-API akzeptierte den Wert, aber Terraform konnte die VM beim nächsten Lauf nicht mehr im State (Artikel 789) zuordnen, da der Datentyp-Mismatch zu einer falschen Prüfsumme führte. Terraform versuchte daraufhin, die produktive VM zu löschen und neu zu erstellen.
Lehre: Seien Sie in HCL streng mit Datentypen. Nutzen Sie type = number oder type = bool in Ihren Variablen-Definitionen, um solche Seiteneffekte zu verhindern.
# 6. Monitoring & Reporting
Code-Qualität sichern.
# Terraform Validate & Format
Nutzen Sie die eingebauten Tools:
terraform fmt: Formatiert Ihren Code automatisch nach dem Standard (Einrückung, Abstände).terraform validate: Prüft die logische Konsistenz Ihres Codes, bevor Sie den Plan starten.
# 7. Fazit & Empfehlung
HCL ist die mächtigste Waffe im Arsenal des Cloud-Admins.
- Empfehlung: Nutzen Sie Visual Studio Code mit dem offiziellen Terraform Plugin. Es bietet Syntax-Highlighting und Auto-Completion für Proxmox-Parameter.
- Wichtig: Dokumentieren Sie komplexe Variablen-Strukturen (Objects/Lists) mit Kommentaren im Code.
# Anhang: Cheatsheet (HCL Basics)
| Begriff | Beispiel | Zweck |
|---|---|---|
| Block | resource "..." { ... } |
Definition einer Einheit |
| Argument | name = "value" |
Zuweisung eines Wertes |
| Attribute | self.ipv4_address |
Rückgabewert einer Ressource |
| Local | locals { env = "prod" } |
Interne Zwischenvariable |