Ressourcen definieren

LinuxBeginner
Jetzt üben

Einführung

Im vorherigen Lab haben wir unsere Küche eingerichtet, also Terraform installiert. Jetzt ist es Zeit, die Speisekarte zu schreiben.

In Terraform beschreiben Sie normalerweise nicht jeden einzelnen technischen Schritt von Hand. Stattdessen beschreiben Sie die gewünschten Infrastrukturobjekte. Jedes verwaltete Objekt wird durch eine Ressource dargestellt.

Ressourcen sind die wichtigsten Einheiten, die Terraform verwaltet. Sie bilden die Verbindung zwischen dem Code in Ihren .tf-Dateien und den tatsächlichen Objekten auf der Zielplattform.

Stellen Sie sich vor, Sie bestellen in einem Restaurant. Sie sagen dem Koch nicht: „Schneide eine Zwiebel, brate sie an, schlage zwei Eier auf …“, sondern einfach: „Ich möchte ein Omelett.“ Terraform ist der Kellner, der Ihre Bestellung (die Konfiguration) entgegennimmt und sicherstellt, dass die Küche (Docker) genau das zubereitet, was Sie bestellt haben.

Das ist der zentrale Terraform-Workflow: Ressourcen definieren, die geplanten Änderungen anzeigen und sie anschließend anwenden.

Das Image definieren

Zuerst legen wir fest, welche Zutaten wir benötigen. In der Docker-Welt brauchen Sie ein Image, bevor Sie einen Container starten können. Ein Image ist vergleichbar mit einem unveränderlichen Softwarepaket.

Wechseln Sie zunächst in unseren Projektordner und erstellen Sie dort unser Bestellformular, die Datei main.tf.

cd ~/project
touch main.tf

Öffnen Sie main.tf mit dem Texteditor nano.

nano main.tf

Zu Beginn teilen wir Terraform immer mit, wer die Arbeit ausführt – den Provider. Kopieren Sie diesen Standardblock an den Anfang Ihrer Datei, um den Docker-Provider einzurichten:

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

Fügen Sie nun unsere erste Bestellung hinzu: das Nginx-Image. Ergänzen Sie diesen Code in Ihrer main.tf unterhalb des Provider-Blocks. Verwenden Sie die Pfeiltasten, um nach unten zu gelangen:

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

Speichern Sie Ihre Änderungen nach dem Einfügen des Codes. Drücken Sie Ctrl + O, bestätigen Sie mit Enter und drücken Sie anschließend Ctrl + X, um den Editor zu verlassen.

Sehen wir uns diese Sprache genauer an:

  • resource: Dieses Wort teilt Terraform mit: „Ich möchte etwas bestellen.“
  • "docker_image": Das ist der Typ des bestellten Objekts. Wenn Sie beispielsweise AWS integrieren, könnte der Typ aws_instance lauten.
  • "nginx": Das ist der Name, den wir diesem Objekt in unserem Notizbuch geben, damit wir später darauf verweisen können. Dieser Name ändert nichts an der realen Umgebung.
  • name = "nginx:latest": Dies ist der konkrete Parameter, der an Docker übergeben wird. Er gibt Docker genau an, welches Image heruntergeladen werden soll.

Ihr Entwurf enthält jetzt einen Provider und eine Ressourcenbeschreibung.

Den Container definieren

Ein Image liegt auf der Festplatte, aber ein Container ist die laufende Anwendung. Das entspricht dem Unterschied zwischen einem Rezept und dem fertigen Gericht auf dem Teller.

Fügen Sie nun eine zweite Ressource zu Ihrer Datei main.tf hinzu. Diese neue Ressource hängt von der ersten Ressource ab.

Öffnen Sie main.tf erneut mit nano:

nano main.tf

Gehen Sie mit den Pfeiltasten zum Ende der Datei und fügen Sie diesen Block dort ein:

resource "docker_container" "web" {
  image = docker_image.nginx.image_id
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

Beachten Sie die besondere Funktion der Zeile image = docker_image.nginx.image_id.

Diese Referenz ist mehr als eine praktische Abkürzung. Sie ermöglicht Terraform, einen Abhängigkeitsgraphen zu erstellen und dadurch die Reihenfolge der Erstellung automatisch zu bestimmen.

Anstatt erneut "nginx:latest" einzugeben, verweisen wir auf die zuvor definierte Ressource (docker_image.nginx). Damit teilen Sie Terraform mit: „Versuche erst dann, diesen Container zu erstellen, wenn das Image vollständig vorbereitet ist.“ So erstellen wir Abhängigkeiten.

Außerdem haben wir einen ports-Block hinzugefügt. Er öffnet ein Fenster von Ihrem Computer (Port 8000) in den Container (Port 80), sodass Sie die Website aufrufen können.

Initialisieren und planen

Bevor Terraform Änderungen vornehmen darf, müssen wir das Projekt initialisieren, also die benötigten Werkzeuge herunterladen, und anschließend den Plan in der Vorschau anzeigen.

Führen Sie zuerst init aus, um die Plug-ins für den Docker-Provider zu installieren:

terraform init

Stellen Sie sich vor, der Kellner würde Ihnen das Essen sofort bringen, ohne die Bestellung zu bestätigen. Das wäre riskant! Terraform bietet deshalb eine Sicherheitsfunktion namens Plan. Sie vergleicht Ihre Anforderungen mit den bereits vorhandenen Objekten und berechnet die Unterschiede.

Führen Sie den Plan-Befehl aus:

terraform plan

Sehen Sie sich die Ausgabe genau an. Neben den Ressourcen werden grüne +-Zeichen angezeigt. Diese Symbole bedeuten: „Ich werde dieses Objekt erstellen.“

Die Planungsphase gehört zu den wertvollsten Sicherheitsfunktionen von Terraform. Sie können die geplanten Änderungen prüfen, bevor tatsächlich etwas geändert wird.

Wichtiger Tipp: Lesen Sie den Plan immer vollständig. Dies ist Ihre letzte Gelegenheit, Fehler zu erkennen, bevor daraus reale Infrastruktur wird.

Änderungen anwenden

Der Plan sieht gut aus. Jetzt teilen wir dem Kellner mit: „Setzen Sie ihn um!“

Der Befehl apply führt den Plan aus.

terraform apply

Terraform arbeitet sehr sorgfältig. Der Plan wird noch einmal angezeigt, und Terraform fordert Sie zur abschließenden Bestätigung auf. Geben Sie yes ein, um fortzufahren.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Sobald Sie yes eingegeben und Enter gedrückt haben, verbindet sich Terraform mit Docker, lädt das Image herunter und startet den Container.

Prüfen wir, ob alles funktioniert hat! Mit einem standardmäßigen Docker-Befehl können Sie überprüfen, ob der Container läuft:

docker ps

Sie können außerdem die gerade bereitgestellte Website testen. Da wir Port 8000 zugeordnet haben, können Sie sie mit curl aufrufen:

curl localhost:8000

Wenn Sie den HTML-Code für „Welcome to nginx!“ sehen, haben Sie Ihre erste Infrastruktur erfolgreich als Code bereitgestellt!

Zusammenfassung

Herzlichen Glückwunsch! Sie haben den grundlegenden Terraform-Workflow abgeschlossen.

In diesem Lab haben Sie Folgendes gelernt:

  • Ressourcen definieren: Wie Sie in main.tf festlegen, was Sie benötigen (Images und Container).
  • Referenzen: Wie Sie Ressourcen miteinander verknüpfen, zum Beispiel indem Sie einem Container das zu verwendende Image zuweisen.
  • Plan: Wie Sie die geplanten Änderungen vor der Ausführung anzeigen.
  • Apply: Wie Sie die tatsächliche Infrastruktur erstellen.

Dieser Zyklus aus Schreiben → Planen → Anwenden entspricht genau der Vorgehensweise, mit der Profis umfangreiche Cloud-Infrastrukturen verwalten. Sie haben gerade Ihren ersten Schritt auf dem Weg zum DevOps Engineer gemacht.