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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Variable | ein Name für einen Wert, den man von außen ändern kann | var.anzahl_pcs |
| Output | ein Wert, den OpenTofu am Ende ausgibt | |
| count | macht so viele Ressourcen, wie eine Zahl sagt | count = 3 |
| for_each | macht eine Ressource für jeden Namen in einer Menge | each.key |
| Index | die Platznummer einer Ressource bei count, sie beginnt bei 0 | |
| Adresse | der volle Name einer Ressource im Plan | terraform_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
mkdir -p ~/iac-demo/mehrfachHier 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
cd ~/iac-demo/mehrfachHier 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
printf '%s\n' 'variable "anzahl_pcs" {' ' type = number' ' default = 2' '}' '' 'variable "labore" {' ' type = set(string)' ' default = ["physik", "chemie"]' '}' > variables.tfHier 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
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.tfHier 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
tofu init -no-color | grep initializedHier 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
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
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
tofu outputHier 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 State | Gemacht mit | input |
|---|---|---|
| terraform_data.pc[0] | count, Index 0 | PC-00 |
| terraform_data.pc[1] | count, Index 1 | PC-01 |
| terraform_data.labor["chemie"] | for_each, Name chemie | CHEMIE |
| terraform_data.labor["physik"] | for_each, Name physik | PHYSIK |
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?
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
mkdir -p ~/iac-demo/listeHier 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
cd ~/iac-demo/listeHier 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
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.tfHier 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
tofu init -no-color | grep initializedHier 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
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
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.