Terraform hat im Moment die größte Verbreitung bei den IaC tools. Trotz der kleineren Probleme bei der Benutzung ist es immer noch flexibel genug, um beinahe alle Anforderungen, die man an ein IaC Tool haben kann, abzudecken.
Ziele
- Du kennst die grundsätzlichen Terraform Aktionen
init
,plan
,apply
unddestroy
und kannst erklären was diese machen - Du kennst HCL und die Limitierungen die mit der "Sprache" einhergehen
- Du weißt, was der Terraform
State
ist und kannst beschreiben wie dieser funktioniert - Warum braucht man den
State
? Kannst du dir eine Alternative Lösung vorstellen? - Du weißt, wie existierende Ressourcen in den Terraform
State
importiert werden können- Was ist nach dem Import noch erforderlich damit die Ressource gemanaged wird?
- Was passiert, wenn es keine zugehörige Ressource zu einem Objekt im state gibt und ein
terraform plan
erstellt wird?
- Wie kann ich sicherstellen, dass genau der Plan angewendet wird, der bei
terraform plan
ausgegeben wurde? - Du kannst erklären was ein
Provider
ist - Wie kann man einen eigenen
Provider
erstellen? - Du kannst erklären was ein
Modul
ist - Du kennst die data types, die in Terraform zur Verfügung stehen, und kannst diese aufzählen
- Wie kann eine
resource
in Terraform abhängig vom Wert einerbool
Variable erstellt werden? - Wie kann ich Terraform Resourcen in einem Loop generieren (z.B. auf Basis einer
map
)? - Gibt es auch
loops
, die nicht direkt etwas mit dem Erstellen von Ressourcen zu tun haben? - Du kennst
Dynamic Blocks
- Du kennst den Unterschied zwischen
variables
undlocals
- Du weißt, was
outputs
sind und für was man diese verwendet - Was ist eine
data source
und für was kannst du diese einsetzen? - Manchmal müssen Ressourcen ersetzt (
replaced
) werden- Du kannst erklären, warum das notwendig ist
- Du weißt, ob das immer problemfrei ist
Inhalte
Wie immer gilt: Du musst nicht alle Inhalte lesen/durcharbeiten. Entscheidend ist, dass du am Ende Terraform verwenden kannst und verstehst, wie es funktioniert. Dein Mentor hilft dir dabei, das zu überprüfen.
- Terraform Get Started - AWS Show archive.org snapshot
- Terraform Get Started - Docker Show archive.org snapshot
- Terraform CLI Show archive.org snapshot
- Terraform Configuration Language Show archive.org snapshot
- Terraform State Show archive.org snapshot
Nachdem du die Grundlagen abgedeckt hast, möchtest du vielleicht einen Blick auf die Blogpost-Serie von Gruntwork werfen. Diese Serie ist sehr ausführlich, gibt aber weitere gute Einblicke in die Praxis.
Weitere gute Anhaltspunkte in der Hashicorp-Dokumentation sind folgende Seiten:
- Terraform Modules Show archive.org snapshot
- Terraform Types and Values Show archive.org snapshot
- Terraform Dynamic Blocks Show archive.org snapshot
Wir pflegen einen Style Guide, damit nicht jeder neu recherchieren muss, wie Dateien in einem Terraform-Projekt sinnvoll benannt werden. Sei dir momentan nur bewusst, dass es den Style Guide gibt. Die Empfehlungen können übernommen werden, aber das ist keine Pflicht.
Aufgaben
Am besten erstellst du dir ein Git Repository und jeweils einen Merge Request für jede Aufgabe. Verwende den Docker Provider Show archive.org snapshot für diese Aufgaben.
-
Erstelle ein Terraform Modul, das bei dir lokal Nginx Show archive.org snapshot container startet. Das Modul soll eine input variable mit Namen
containers
vom typenumber
haben. Abhängig vom konfigurierten Wert werden entsprechend viele Container gestartet. -
Erstelle eine weitere input variable
port_mapping
. Der Typ sollobject
sein und die Konfiguration der Portmappings für die Container zu deinem Hostsystem ermöglichen. Verwende die Variable und prüfe, ob du über dein Portmapping mit den Nginx Containern kommunizieren kannst. -
Entferne die variable
port_mappings
und konfigurierecontainers
als typemap(object)
. Das Objekt soll die Konfiguration folgender Parameter erlauben:- Imagename
- Portmapping
- privileged
Weise passende Variabeltypen zu. Anschließend erstellst du für jedes Objekt in dieser
map
einen Container. Als Name wird derkey
des elements in dermap
verwendet. -
Erstelle einen
output
der einemap
enthält. Die map soll folgendermaßen aussehen:<container_a_id> = { ip = <ip_of_container_a> } <container_b_id> = { ip = <ip_of_container_b> }