Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Variablen, count und for_each in OpenTofu

Nach dieser Lektion: Ich kann aus einer Variable mehrere gleiche Ressourcen machen.

Lektion, 60 Min.15 BefehleOpenTofu-Lab: Infrastructure as Code mit Plan, Apply und State auf einer VM

Mehrere gleiche Dinge aus einer Beschreibung

Mit Variablen, count und for_each macht OpenTofu aus einer einzigen Beschreibung mehrere gleiche Dinge. Sie schreiben den Bauplan einmal und sagen nur, wie viele oder welche es sein sollen.

Ein Informatikgebäude hat Labore und in jedem Labor PCs. Niemand schreibt dreißig fast gleiche Blöcke ab. Sie ändern eine Zahl, und der Plan zeigt, was dazukommt.

Am Ende dieser Lektion

Notiz

Ich kann aus einer Variable mehrere gleiche Ressourcen machen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Variableein Name für einen Wert, den man von außen ändern kannvar.anzahl_pcs
Outputein Wert, den OpenTofu am Ende ausgibt
countmacht so viele Ressourcen, wie eine Zahl sagtcount = 3
for_eachmacht eine Ressource für jeden Namen in einer Mengeeach.key
Indexdie Platznummer einer Ressource bei count, sie beginnt bei 0
Adresseder volle Name einer Ressource im Planterraform_data.pc[0]

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Variable macht die Datei flexibel

Eine Variable steht in einem Block variable. Sie hat einen Namen, einen Typ und meist einen Standardwert. In der Datei lesen Sie sie mit var.name.

Der Typ schützt Sie. number nimmt nur Zahlen, string einen Text und set(string) eine Menge von Texten. Ein Output gibt am Ende einen Wert aus, damit Sie ihn nicht im State suchen müssen.

Einen eigenen Ordner anlegen

Befehl
mkdir -p ~/iac-demo/mehrfach

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

In den Ordner wechseln

Befehl
cd ~/iac-demo/mehrfach

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Zwei Variablen schreiben

Befehl
printf '%s\n' 'variable "anzahl_pcs" {' '  type    = number' '  default = 2' '}' '' 'variable "labore" {' '  type    = set(string)' '  default = ["physik", "chemie"]' '}' > variables.tf

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ressourcen und Output schreiben

Befehl
printf '%s\n' 'resource "terraform_data" "pc" {' '  count = var.anzahl_pcs' '  input = format("PC-%02d", count.index)' '}' '' 'resource "terraform_data" "labor" {' '  for_each = var.labore' '  input    = upper(each.key)' '}' '' 'output "pc_namen" {' '  value = terraform_data.pc[*].output' '}' > main.tf

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

count nummeriert, for_each benennt

count macht so viele Kopien, wie die Zahl sagt. Jede Kopie hat einen Index, der bei 0 beginnt. In der Kopie ist er count.index.

for_each nimmt eine Menge von Namen und macht eine Kopie je Name. In der Kopie ist der Name each.key. Die Adresse trägt dann den Namen in eckigen Klammern. Eine Menge kennt keine Doppelten, also gibt es jeden Namen einmal.

Den Ordner vorbereiten

Befehl
tofu init -no-color | grep initialized

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Plan lesen

Befehl
tofu plan -no-color | grep -E "will be|Plan:"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Plan anwenden

Befehl
tofu apply -auto-approve -no-color | grep "Apply complete"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Output lesen

Befehl
tofu output

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Beispiel: die vier Adressen und ihre Werte

Adresse im StateGemacht mitinput
terraform_data.pc[0]count, Index 0PC-00
terraform_data.pc[1]count, Index 1PC-01
terraform_data.labor["chemie"]for_each, Name chemieCHEMIE
terraform_data.labor["physik"]for_each, Name physikPHYSIK

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Mit -var testen Sie einen anderen Wert

Die Option -var name=wert setzt eine Variable für genau einen Lauf. Die Datei bleibt, wie sie ist. So fragen Sie den Plan: Was wäre, wenn es drei PCs wären?

Bei count kommt ein neuer Platz hinten dazu. Wird die Zahl kleiner, fällt der letzte Platz weg.

Was wäre bei drei PCs?

Befehl
tofu plan -no-color -var anzahl_pcs=3 | grep -E "will be|Plan:"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Warum count mit einer Liste Ärger macht

Nun dieselben drei Kurse, einmal mit count über eine Liste und einmal mit for_each. Danach nehmen wir den Kurs aus der Mitte heraus.

Bei count hängt jede Ressource an ihrer Platznummer. Rutscht ein Name nach vorn, ändert sich die Ressource auf seinem alten Platz. Bei for_each hängt sie am Namen. Es verschwindet genau die eine.

Einen zweiten Ordner anlegen

Befehl
mkdir -p ~/iac-demo/liste

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

In den zweiten Ordner wechseln

Befehl
cd ~/iac-demo/liste

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Dieselben Kurse zweimal beschreiben

Befehl
printf '%s\n' 'variable "kurse" {' '  type    = list(string)' '  default = ["netze", "datenbanken", "sicherheit"]' '}' '' 'resource "terraform_data" "nach_zahl" {' '  count = length(var.kurse)' '  input = var.kurse[count.index]' '}' '' 'resource "terraform_data" "nach_name" {' '  for_each = toset(var.kurse)' '  input    = each.key' '}' > main.tf

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den zweiten Ordner vorbereiten

Befehl
tofu init -no-color | grep initialized

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Sechs Ressourcen anlegen

Befehl
tofu apply -auto-approve -no-color | grep "Apply complete"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Kurs aus der Mitte entfernen

Befehl
tofu plan -no-color -var 'kurse=["netze","sicherheit"]' | grep -E "will be|Plan:"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele nehmen für eine Liste von Namen count, weil es kürzer aussieht. Fällt dann ein Name aus der Mitte weg, ändert sich der Platz dahinter, und die letzte Ressource wird gelöscht. Bei echten Servern wäre das ein Neustart. Für Dinge mit eigenem Namen nehmen Sie for_each.

Weiterführend

Ändern Sie den Standardwert von anzahl_pcs in variables.tf und lesen Sie den Plan ohne -var. Probieren Sie tofu console, aber nur zum Ausprobieren von Funktionen.

Ein Beispiel für die Eingabe über eine Pipe: echo 'format("PC-%02d", 7)' | tofu console gibt "PC-07" aus. Räumen Sie am Ende mit tofu destroy -auto-approve in beiden Ordnern auf.

Über dieses Lab und seinen Quellcode: OpenTofu-Lab: Infrastructure as Code mit Plan, Apply und State auf einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.