Lesson 0004 · groupdir-infra

Terraform lokal

Öffentliches DNS ohne Pipeline: Generate → Validate → Plan → Apply mit nativen tofu-Befehlen.

Einleitung

Nach Lesson 0003 kennst du IaC-Modell und OpenTofu als Drop-in. Für scope = "public" oder "both" muss daraus noch öffentliches DNS bei Hetzner werden. Das macht der Terraform-Stack unter tofu/dns.

Heute lernst du die nativen tofu-Befehle. Das justfile ist nur eine Kurzschreibweise derselben Kommandos. Live-Apply gegen Hetzner ist fürs Selbststudium nicht nötig.

Der Terraform-Kern

Terraform vergleicht drei Dinge: deine Config, den State (was es zuletzt verwaltet hat) und oft die Reality bei der API. Daraus entsteht ein Plan (eine Vorschau). Erst Apply führt die Änderungen aus.

Primärquelle zum Vokabular: OpenTofu Getting started (Write → Plan → Apply).

DNS-Pfad in groupdir-infra

Merksatz: Nix-Liste editieren → generieren → Terraform validate/plan/(apply). Die generierte JSON ist Ableitung, keine Quelle. Details: tofu/dns/README.md.

-chdir=tofu/dns sagt der CLI, im Stack-Ordner zu arbeiten (statt dorthin zu cden). Das ist normales Terraform/OpenTofu.

Die Befehle im Detail

Vom Repo-Root aus (nach nix develop, damit tofu und nix da sind):

# 1) Config aus der Nix-DNS-Liste ableiten
nix eval --json --file tofu/dns/records.tf.json.nix \
  > tofu/dns/generated-records.tf.json

# 2) Syntax/Provider prüfen, ohne State-Backend
tofu -chdir=tofu/dns init -backend=false
tofu -chdir=tofu/dns validate

# 3) Für echten Plan/Apply: Backend + Provider wie in CI
tofu -chdir=tofu/dns init
tofu -chdir=tofu/dns plan -out=tfplan
tofu -chdir=tofu/dns apply tfplan
  • init -backend=false: Provider herunterladen, aber kein Remote-State. Gut zum Validate ohne Token/Backend.
  • init (ohne Flag): verbindet das konfigurierte Backend (in CI: GitLab-State groupdir-dns).
  • plan -out=tfplan: speichert den Plan; Apply nimmt genau diese Datei.

Auth für Plan/Apply gegen Hetzner: Token HETZNER_DNS_TOKEN oder lokale secrets.auto.tfvars (nicht committen); siehe DNS-README.

Was just nur abkürzt

Die Targets tofu-dns-* im justfile rufen genau diese Befehle auf. Ein Extra bei tofu-dns-validate: just legt ein temporäres TF_DATA_DIR an, damit lokale .terraform/-Daten den Validate-Lauf nicht vermüllen. Inhaltlich bleibt es init -backend=false plus validate.

Wenn du die Mechanismen verstehst, kannst du just als Shortcut nutzen.

Ohne Pipeline üben

  1. tofu/dns/README.md und das justfile lesen: jedes Target auf den nativen Befehl abbilden
  2. Optional: nix eval … (Generate) und die Diff in generated-records.tf.json anschauen
  3. Optional: tofu -chdir=tofu/dns init -backend=false und validate (ohne Hetzner-Token)
Apply bleibt bewusst draußen. Du sollst den Befehl und die Reihenfolge kennen. Produktives Apply läuft oft über CI (manual Job) oder lokal mit Token und Vorsicht am State. Wo der State liegt und wie CI/autoUpgrade zusammenspielen: Lesson 0008.

Üben: Reihenfolge und Grenzen

Retrieval

Du hast net/dns/groupdir.de.nix geändert. Was kommt vor dem Plan?

Wo trägst du öffentliche Records nicht von Hand ein?

Was leistet tofu -chdir=tofu/dns validate (nach init -backend=false)?

Primärquelle

Konzept: OpenTofu Getting started und CLI: plan.

Repo: tofu/dns/README.md. Zum Abgleich der Kurzformen: justfile.

Kompakt: Referenz: Terraform-Workflow.