402 OpenTofu Basics [2 PT]

Updated . Posted . Visible to the public.

Note

Wir nutzen OpenTofu Show archive.org snapshot , die Open Source Fork von Terraform. Wenn du im Curriculum oder unseren Cards Referenzen zu Terraform findest, ist in der Regel OpenTofu gemeint. OpenTofu funktioniert weitestgehend als Drop-In Replacement von Terraform, bietet aber neue Features, die nicht in Terraform verfügbar sind.

OpenTofu 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 OpenTofu Aktionen init, plan, apply und destroy und kannst erklären was diese machen
  • Du kennst OpenTofu language und die Limitierungen die mit der "Sprache" einhergehen
  • Du weißt, was der OpenTofu 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 OpenTofu 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 tofu plan erstellt wird?
  • Wie kann ich sicherstellen, dass genau der Plan angewendet wird, der bei tofu 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 OpenTofu zur Verfügung stehen, und kannst diese aufzählen
  • Wie kann eine resource in OpenTofu abhängig vom Wert einer bool Variable erstellt werden?
  • Wie kann ich OpenTofu 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 und locals
  • 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 OpenTofu verwenden kannst und verstehst, wie es funktioniert. Dein Mentor hilft dir dabei, das zu überprüfen.

Terraform stellt einige vorgefertigte Tutorials bereit, die im Folgenden verlinkt sind. Nutze OpenTofu anstatt Terraform, falls du sie bearbeitest.

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:

Wir pflegen einen Style Guide, damit nicht jeder neu recherchieren muss, wie Dateien in einem OpenTofu-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.

  1. Erstelle ein OpenTofu Modul, das bei dir lokal Nginx Show archive.org snapshot Container startet. Das Modul soll eine input variable mit Namen containers vom type number haben. Abhängig vom konfigurierten Wert werden entsprechend viele Container gestartet.

  2. Erstelle eine weitere input variable port_mapping. Der Typ soll object 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.

  3. Entferne die variable port_mappings und konfiguriere containers als type map(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 der key des elements in der map verwendet.

  4. Erstelle einen output der eine map enthält. Die map soll folgendermaßen aussehen:

    <container_a_id> = {
      ip = <ip_of_container_a>
    }
    <container_b_id> = {
      ip = <ip_of_container_b>
    }
    
Profile picture of Claus-Theodor Riegg
Claus-Theodor Riegg
Last edit
Matthias Bruhse
License
Source code in this card is licensed under the MIT License.
Posted by Claus-Theodor Riegg to DevOps Curriculum (2022-11-18 10:23)