Der Spickzettel zur zweiten Hälfte des Seminars Terraform und OpenTofu in der
Praxis: wo Geheimnisse trotz sensitive landen, wie Umgebungen getrennt
werden, wie Bestand übernommen und Drift behandelt wird, welche Prüfung welchen
Fehler findet, woran ein gespeicherter Plan gebunden ist — und worin sich die
beiden Werkzeuge inzwischen unterscheiden. Sprache, Ressourcen, Module und State
stehen auf dem ersten Blatt:
Terraform und OpenTofu: Kern.
Maßgeblich für Argumente, Flags und Versionsstände ist die Originaldoku —
developer.hashicorp.com/terraform
und opentofu.org/docs. Dieses Blatt trifft eine
Auswahl, Stand Terraform 1.16 und OpenTofu 1.13 (Ende September 2026); die
Befehle gelten mit tofu statt terraform gleich.
Zugänge trennen und wo Geheimnisse landen
Ein Lauf braucht drei verschiedene Zugänge: zum Backend mit dem State, zum Zielsystem des Providers und die Identität der Umgebung, in der er läuft.
| Zugang | Wer | Mindestumfang |
|---|---|---|
| Backend (State-Datenbank) | Plan und Apply | nur die State-Datenbank, Verbindung über PG_CONN_STR |
| Docker-Host test | Team und Pipeline | SSH als Deploy-Benutzer |
| Docker-Host prod | nur die Pipeline | SSH als Deploy-Benutzer |
| Registry | Pull des Anwendungs-Images | nur lesen, eigener Zugang je Umgebung |
| Secret Store | der Lauf selbst | nur die eigenen Pfade, kurzlebige Tokens |
Wer den Docker-Daemon steuern darf, hat faktisch Root-Rechte auf dem Host — der kritischste Zugang.
sensitive = true wirkt nur auf die Anzeige. Ein normales Argument wie
env speichert der Provider vollständig im State:
| Ort | Was dort steht | Schutz |
|---|---|---|
| State im Backend | Attribute wie env als JSON | Zugriff auf den State eng fassen |
Plan-Datei aus plan -out | geplante Attribute und Variablenwerte | kurzlebig, nie ins Repository |
output -json und -raw | sensible Outputs im Klartext | nie ins Pipeline-Log schreiben |
| CI-Artefakte | gespeicherte Pläne zwischen Jobs | kurze Aufbewahrung, wenige Leser |
| Lokaler State | terraform.tfstate als Klartext-Datei | gar nicht erst lokal arbeiten |
Modul: Secrets und sensible Daten
Ephemeral Values, Write-only und State-Verschlüsselung
Ephemeral Values existieren nur während eines Laufs und landen weder im State
noch in der Plan-Datei: Variablen und Outputs mit ephemeral = true und
Ephemeral Resources aus einem ephemeral-Block. In eine verwaltete Ressource
gelangen sie nur über Write-only Arguments — und die muss der Provider
anbieten, etwa password_wo samt password_wo_version einer Cloud-Datenbank.
Rotiert wird über eine höhere _wo_version; ohne sie plant das Werkzeug keine
Änderung.
Der Docker-Provider 4.6 hat kein Argument mit der Endung _wo; ephemere Werte
gehen dort nur in den Provider-Block (etwa registry_auth). Der Ausweg ist eine
Datei, deren Pfad allein im State steht:
resource "docker_container" "db" {
env = ["POSTGRES_PASSWORD_FILE=/geheim/db"]
volumes {
host_path = "/srv/saatplan/geheim"
container_path = "/geheim"
read_only = true
}
}
OpenTofu verschlüsselt seit 1.7 State und Plan-Dateien selbst — im
encryption-Block innerhalb von terraform oder über TF_ENCRYPTION. Terraform
kennt keinen solchen Block; dort verschlüsselt allenfalls das Backend.
encryption {
key_provider "pbkdf2" "saatplan" {
passphrase = var.state_passphrase # mindestens 16 Zeichen
}
method "aes_gcm" "saatplan" {
keys = key_provider.pbkdf2.saatplan
}
state { method = method.aes_gcm.saatplan }
plan { method = method.aes_gcm.saatplan }
}
Statt pbkdf2 gehen Schlüssel aus AWS KMS, GCP KMS, Azure Key Vault oder
OpenBao. Beim Umstellen und Rotieren steht die alte Methode als fallback, bis
jeder State neu geschrieben ist; danach enforced = true. Was Verschlüsselung
nicht leistet: Sie schützt nicht vor Datenverlust (ohne Schlüssel ist der State
verloren), verhindert keinen Replay mit einem älteren State und ersetzt keine
Berechtigungen — wer tofu ausführt, sieht die Geheimnisse weiterhin. Key
Provider und Methoden nie umbenennen, ihre Namen stehen im State.
Modul: Secrets und sensible Daten
Umgebungen: Workspaces oder getrennte Root Modules
Test und Produktion dürfen sich keinen State teilen.
| CLI-Workspaces | Getrennte Root Modules | |
|---|---|---|
| Aufbau | eine Konfiguration, mehrere States | je Umgebung ein eigenes Verzeichnis |
| Backend und Zugänge | dasselbe Backend, dieselben Zugänge | eigenes Backend, eigene Zugänge |
| Wechsel | terraform workspace select | durch das Verzeichnis |
| Gut für | kurzlebige Kopien je Feature-Branch | test und prod mit eigenem Risiko |
Unterschiede gehören in Variablenwerte, nicht in Bedingungen im Modul:
terraform.tfvars wird automatisch geladen, weitere Dateien per -var-file.
Dann steht der Unterschied zwischen test und prod im Diff. Beim pg-Backend
braucht jede Umgebung ein eigenes schema_name — sonst teilen sich beide die
Zeile default und damit den State.
Mehrere Ziele in einer Konfiguration laufen über alias; an ein Modul geht die
Konfiguration mit providers = { docker = docker.prod } im module-Block.
| AWS | Azure | Google Cloud | |
|---|---|---|---|
| Ziel statt Docker-Host | Account und Region | Subscription | Projekt und Region |
| Im Provider-Block | region, assume_role | subscription_id | project, region |
| Mehrere Ziele | alias je Account oder Region | alias je Subscription | alias je Projekt |
Zwischen Teams wird per Datenquelle nach Namen übergeben, nicht per Schreibzugriff.
| Terraform Stacks | Terragrunt | |
|---|---|---|
| Wo es läuft | in HCP Terraform | lokal und in jeder Pipeline |
| Einheit | component in .tfcomponent.hcl | Unit mit terragrunt.hcl |
| Umgebungen | deployment in .tfdeploy.hcl | Verzeichnisse oder terragrunt.stack.hcl |
| Abhängigkeiten | Stacks reichen Outputs weiter | dependency-Blöcke, run --all |
| Engine | Terraform | OpenTofu oder Terraform |
terragrunt run --all arbeitet die Units in der Reihenfolge ihrer
dependency-Blöcke ab. Das Werkzeug ordnet nur, was schon geschnitten ist — die
State-Grenzen kommen zuerst.
Modul: Umgebungen und größere Strukturen
Bestand übernehmen: import, moved, removed
terraform import | import-Block | |
|---|---|---|
| Ablauf | sofort in den State | erst im Plan, dann beim Apply |
| Vorschau | keine | Plan zeigt jeden Import |
| Konfiguration | von Hand schreiben | mit -generate-config-out erzeugbar |
| Mehrere Objekte | ein Aufruf je Objekt | for_each über Map oder Set |
| Im Review | unsichtbar | steht im Pull Request |
Die Doku empfiehlt den Block. Die ID muss beim Plan bekannt sein; die Zieldatei
von -generate-config-out darf noch nicht existieren, und die Generierung gilt
in beiden Werkzeugen als experimentell. Ziel ist ein Plan mit 1 to import und
sonst nur Nullen.
import {
to = docker_container.db
id = var.db_container_id
}
moved {
from = docker_container.db
to = module.saatplan_db.docker_container.db
}
removed {
from = docker_volume.daten
lifecycle {
destroy = false
}
}
moved hält eine neue Adresse fest (in geteilten Modulen stehen lassen — ihr
Entfernen bricht ältere Aufrufer); er wandelt keine verwaltete Ressource in eine
Data Source um. removed ohne destroy = false löscht das Objekt, als wäre die
Ressource aus dem Code entfernt worden.
Modul: Bestand übernehmen und refaktorieren
Drift erkennen und behandeln
terraform plan -refresh-only # nur lesen: was hat sich draußen geändert?
terraform apply -refresh-only # Abweichung bewusst in den State übernehmen
terraform plan -detailed-exitcode # 0 = keine Änderung, 1 = Fehler, 2 = Drift
terraform refresh ist veraltet — es übernimmt Abweichungen ohne Rückfrage.
| Drift übernehmen | Drift zurückführen | |
|---|---|---|
| Wann | Änderung war richtig und bleibt | Änderung war ein Versehen |
| Mittel | apply -refresh-only aktualisiert den State | normales apply stellt den Code-Stand her |
| Code | im selben Zug nachziehen | bleibt unverändert |
| Sonst | das nächste apply dreht sie zurück | sie kommt wieder — Ursache klären |
Beim Docker-Provider zeigt sich Drift so: Ein gestoppter Container gilt als
Änderung (must_run), docker update --restart erscheint bei restart, ein
gelöschter und neu gestarteter Container hat eine neue ID und gilt als
verschwunden.
Module: Bestand übernehmen und refaktorieren · Betrieb, Fehler und Upgrades
Welche Prüfung welchen Fehler findet
| Prüfung | findet | braucht |
|---|---|---|
fmt -check | uneinheitliche Formatierung | nur die Dateien |
validate | Tippfehler, falsche Typen, tote Referenzen | init, kein Backend |
| TFLint | ungenutzte Variablen, fehlende Versionen | Plugins per --init |
| Checkov | riskante Einstellungen laut Regelwerk | Code oder Plan als JSON |
test mit Mock | falsche Logik, verletzte Bedingungen | keinen Docker-Host |
test mit apply | Fehler im Zusammenspiel mit Docker | einen echten Docker-Host |
validate läuft auch nach init -backend=false — so prüft die Pipeline, ohne
den Remote State anzufassen. Ehrlich zur Abdeckung: Für kreuzwerker/docker
pflegt TFLint keinen Regelsatz (nur AWS, Azure, Google Cloud), und Checkov hat
keine Regel für docker_container, docker_image oder docker_network — ein
grünes Ergebnis heißt dort: nichts geprüft.
# *.tftest.hcl — run-Block führt plan oder apply aus (Standard: apply)
mock_provider "docker" {}
run "web_port_unter_1024_abgelehnt" {
command = plan
variables { ports = { web = 80 } }
expect_failures = [var.ports]
}
run "db_port_bleibt_intern" {
command = plan
assert {
condition = length(docker_container.db.ports) == 0
error_message = "saatplan-db veröffentlicht Ports"
}
}
In expect_failures stehen nur eigene Bedingungen: Validierungen, Pre- und
Postconditions, check-Blöcke. Eine reale Umgebung braucht ein Test, wenn Port-Bindung, Netzanschluss
oder Volume-Mount die Frage sind oder ein Dienst antworten muss. Am Ende jeder
Datei wird in umgekehrter run-Reihenfolge zerstört — auch nach roten
Assertions.
Modul: Automatisierte Tests und Qualitätsprüfungen
Pipeline: Stufen und gespeicherter Plan
| Stufe | Frage | Befehl |
|---|---|---|
| Format | Ist der Code einheitlich formatiert? | terraform fmt -check |
| Validierung | Ist die Konfiguration in sich stimmig? | terraform validate |
| Tests | Verhalten Module sich wie zugesagt? | terraform test |
| Security Scan | Verstößt etwas gegen Regeln? | Checkov, conftest |
| Plan | Was genau würde sich ändern? | terraform plan -out=… |
Mit -input=false bricht ein Schritt ab, statt zu warten. Ausgeführt wird der
geprüfte Plan, nicht ein neuer — dafür laut Doku das Arbeitsverzeichnis samt
.terraform archivieren und am selben absoluten Pfad auspacken.
| Bindung | Wer prüft | Meldung oder Mittel |
|---|---|---|
| CLI-Version | Terraform und OpenTofu | plan files cannot be transferred |
| Provider | Abgleich mit dem Lock File | Inconsistent dependency lock file |
| State | Lineage im Plan | Saved plan does not match the given state |
| Stand des State | Serial im Plan | Saved plan is stale |
| Commit | die Pipeline selbst | SHA im Artefaktnamen, gleicher Lauf |
| Zugangsdaten | niemand | Umgebung fest an den Job binden |
Betriebssystem und Architektur müssen bei Plan und Apply gleich sein.
-auto-approve beim Apply eines gespeicherten Plans wirkt nicht. Ein Lauf je
State, keiner wird abgebrochen:
concurrency:
group: saatplan-infra-prod
cancel-in-progress: false
queue: max # bis zu 100 wartende Läufe statt verwerfen
Der State-Lock des Backends bleibt die letzte Absicherung. Schon ein Plan führt
Provider-Code aus und braucht Zugang zum Ziel — Pull Requests aus Forks bekommen
deshalb nur fmt, validate und Tests mit Mocks.
| Werkzeug | Läuft wo | Entscheidung |
|---|---|---|
| Sentinel | HCP Terraform, Enterprise | advisory, soft- oder hard-mandatory |
| OPA | HCP Terraform, Enterprise | advisory oder mandatory |
| conftest | eigene Pipeline, Rego | deny bricht ab, warn meldet |
| Checkov | eigene Pipeline | fehlgeschlagene Prüfung bricht ab |
Policies lesen den Plan als JSON (terraform show -json). Zur Regel gehört ein
Ausnahmeprozess — conftest kennt exception-Regeln, Checkov den Kommentar
checkov:skip samt Begründung; jede Ausnahme bekommt ein Ablaufdatum.
Modul: Pipelines und freigegebene Änderungen
Fehlgeschlagene Läufe und Wiederherstellung
Bricht apply ab, sind die bis dahin ausgeführten Änderungen real; zurückgerollt
wird nicht automatisch, ein halb erzeugtes Objekt ist in der Regel tainted.
| Fehlerbild | Was passiert ist | Erster Blick |
|---|---|---|
| Healthcheck-Timeout | Container angelegt, wait_timeout abgelaufen | tainted im nächsten Plan |
| SSH bricht ab | Docker-Host mitten im Lauf weg | Teil des Laufs im State |
| Keine Rechte | Deploy-Benutzer darf den Docker-Socket nicht | Rechte am Ziel prüfen |
| Lock belegt | anderer Lauf hält den State | Error acquiring the state lock |
| State nicht gespeichert | Backend nicht erreichbar | errored.tfstate im Arbeitsordner |
| Schaden | Weg | Werkzeug |
|---|---|---|
| Objekt halb erzeugt | ersetzen lassen | -replace, tainted |
| Objekt da, State weiß nichts | übernehmen | import-Block |
| State nicht gespeichert | errored.tfstate zurückspielen | terraform state push |
| State beschädigt | Sicherung der State-Datenbank einspielen | pg_dump, state push |
| Ziel-Host verloren | neu aufbauen, Daten zurückspielen | apply, Datensicherung |
Ein erneutes apply vor dem state push erzeugt einen geforkten State. In der
Pipeline das Arbeitsverzeichnis als Artefakt sichern, bevor der Runner es
wegräumt. Das pg-Backend führt keine State-Historie und nutzt Advisory Locks,
die mit der Sitzung fallen — force-unlock gibt es dort nicht.
| HCP Terraform, Enterprise | Eigene Pipeline | |
|---|---|---|
| Ausführung | Remote Runs auf eigenen Workern | Runner, etwa in GitHub Actions |
| State | je Workspace, mit Versionen | eigenes Backend |
| Serialisierung | Warteschlange je Workspace | concurrency plus State-Lock |
| Zugriff | Teams und Rechte je Workspace | Environments, Branch-Schutz |
| Policies | Sentinel, OPA | conftest, Checkov |
| Drift | Health Assessments ab Standard | geplanter Lauf |
| Interne Ziele | über HCP Terraform Agents | Runner im eigenen Netz |
HCP Terraform läuft bei HashiCorp, Terraform Enterprise beim Kunden — beide führen nur Terraform aus.
Modul: Betrieb, Fehler und Upgrades
Terraform und OpenTofu im Vergleich
OpenTofu will mit Terraform-Konfigurationen kompatibel bleiben, und die meisten laufen ohne Änderung. Seit der Abspaltung entwickeln sich beide aber getrennt weiter. Stand: Terraform 1.16, OpenTofu 1.13.
| Funktion | Terraform | OpenTofu |
|---|---|---|
| Verschlüsselung von State und Plan | nein, allenfalls das Backend | ja, seit 1.7 (encryption, TF_ENCRYPTION) |
for_each in provider-Blöcken | nein | ja, alias ist Pflicht |
enabled im lifecycle-Block | nein | ja |
plan und apply mit -exclude | nein | ja |
assume…-Funktionen und convert | nein | ja, neu in 1.13 |
action-Blöcke und terraform query | ja | nicht dokumentiert |
Symbol Libraries, eingebautes -lint | nein | experimentell |
| Ephemeral Variables, Outputs, Resources | ab 1.10 | ab 1.11 |
| Write-only Arguments | ab 1.11 | ab 1.11 |
| Eigene Dateiendungen | .tf, .tftest.hcl | zusätzlich .tofu, .tofutest.hcl mit Vorrang |
| Test-Funktion | terraform test | tofu test |
|---|---|---|
mock_provider, mock_resource, mock_data | ja | ja |
override_resource, _data, _module | ja | ja |
Mock-Daten in eigenen .tfmock.hcl | ja | nicht dokumentiert |
override_during plan oder apply | ja | nicht dokumentiert |
Overrides für einzelne Instanzen und [*] | nicht dokumentiert | ja |
mock_provider mit for_each | nicht dokumentiert | ja, mit alias |
state_key und parallel im run-Block | ja | nicht dokumentiert |
| Umfeld | Terraform | OpenTofu |
|---|---|---|
| Provider-Registry | registry.terraform.io | registry.opentofu.org |
| Orchestrierung vieler Root Modules | Stacks in HCP Terraform; Terragrunt | kein Stacks-Gegenstück; Terragrunt |
| Ausführungsplattformen | HCP Terraform, Terraform Enterprise | u. a. Spacelift, env0, Scalr, Harness; Atlantis mit terraform_distribution: opentofu |
| Policies auf der Plattform | Sentinel, OPA in HCP Terraform | je Plattform eigene — prüfen, nicht voraussetzen |
| MCP Server | hashicorp/terraform-mcp-server | https://mcp.opentofu.org/mcp |
Wer beide Werkzeuge bedient, bleibt bei der gemeinsamen Teilmenge. Experimentelle Funktionen können sich in jedem Release ändern.
Module: Terraform und OpenTofu vergleichen und migrieren · Secrets und sensible Daten · Automatisierte Tests und Qualitätsprüfungen · Umgebungen und größere Strukturen · Betrieb, Fehler und Upgrades · KI-gestützte IaC-Entwicklung
Migration nach OpenTofu: Prüffragen und Rückweg
| Baustein | Prüffrage |
|---|---|
| Provider | Liegt jeder Provider in der Registry des Zielwerkzeugs, in der benötigten Version? |
| Module | Nutzen eingebundene Module Funktionen, die nur eines der beiden Werkzeuge kennt? |
| Backend | Unterstützt das Zielwerkzeug das Backend? |
| Ausführung | Führt die Pipeline oder Plattform das Zielwerkzeug überhaupt aus? |
| Werkzeuge | Kennen Linter, Scanner und Editor-Plug-ins die Eigenheiten des Zielwerkzeugs? |
Auf HCP Terraform und Terraform Enterprise entscheidet die Plattform. Der erste
Nachweis ist ein tofu plan ohne Änderungen; er zeigt nur, dass OpenTofu den
State richtig liest. Erst eine angewendete kleine Änderung beweist, dass es die
Umgebung auch verwaltet. tofu init ergänzt die Lock-Datei um die neuen
Provider-Adressen — sie gehört in den Commit.
| Abhängige Konfigurationen | Von unten nach oben | Von oben nach unten |
|---|---|---|
| Reihenfolge | erst die Konsumenten migrieren | erst die Quelle migrieren |
| Wer liest wessen State | OpenTofu liest Terraform-State | Terraform liest OpenTofu-State |
| Zusicherung | zuverlässig | nicht zuverlässig |
| Rückweg betrifft | wenige | alle Leser |
Wann der Rückweg zugeht: Solange nur Gemeinsames genutzt wird, führen
terraform init und plan zurück. Verschlüsselter State ist für Terraform nicht
mehr lesbar — dann ist die Entscheidung endgültig. Jede nur in OpenTofu
verfügbare Funktion macht den Rückweg zur Umbauarbeit; wer ihn offenhalten will,
bündelt Eigenes in .tofu-Dateien, die Terraform nicht liest.
| Version | Änderung |
|---|---|
| OpenTofu 1.12 | Provisioner-Verbindungen mit type = "winrm" erzeugen Warnungen |
| OpenTofu 1.13 | WinRM für Provisioner entfällt ganz, SSH ist der Ersatz |
| OpenTofu 1.13 | base64gzip liefert andere Bytes — Ressourcen können ersetzt werden |
| OpenTofu 1.13 | macOS erst ab Version 13 Ventura |
| OpenTofu 1.13 | letzte Reihe mit offiziellen 32-Bit-Builds |
Modul: Terraform und OpenTofu vergleichen und migrieren
KI-Werkzeuge und MCP Server
| sieht | tut | |
|---|---|---|
| Chat-Assistent | nur, was hineinkopiert wird | schlägt Text vor |
| IDE-Assistent | offene Dateien, Projektkontext | ergänzt und ändert im Editor |
| Coding Agent | Repository, Terminal, angebundene Server | führt Befehle aus, ändert mehrere Dateien |
Wer plan aufrufen darf, kann auch apply aufrufen — die Rechte legt das Team
fest, nicht das Modell. Im Kontext gehören Werkzeug und Version (OpenTofu 1.13
oder Terraform 1.16), Provider-Version, Modulschnittstelle und
Sicherheitsvorgaben; ohne Provider-Version erfindet das Modell Argumente aus
älteren Releases. Prüfgrundlagen statt Vertrauen:
tofu version # CLI und Provider-Versionen
tofu providers schema -json > schema.json # welche Argumente es wirklich gibt
tofu validate
tofu plan -out=vorschlag.tfplan
tofu show -json vorschlag.tfplan > plan.json
| Toolset (Terraform MCP Server) | Inhalt | braucht |
|---|---|---|
registry | Standard: öffentliche Provider, Module und Policies | nichts |
registry-private | private Module und Provider | TFE_TOKEN |
terraform | Organisationen, Workspaces, Runs, Variablen, State-Versionen | TFE_TOKEN |
| schreibende Tools | create_workspace, update_workspace, delete_workspace_safely, action_run | dazu ENABLE_TF_OPERATIONS=true |
Statt --toolsets gehen einzelne Werkzeuge mit --tools — nie beide zugleich.
Der Server kennt nur Terraform; für OpenTofu-Code sind opentofu.org und der
OpenTofu MCP Server die Quelle.
| Annehmen, wenn … | Zurückweisen, wenn … |
|---|---|
| der Plan genau die beabsichtigte Änderung zeigt | der Plan Ersetzungen enthält, die niemand erklären kann |
| jedes Argument im Provider-Schema steht | Argumente oder Funktionen nicht belegbar sind |
| Tests und Pipeline unverändert grün sind | Tests angepasst wurden, damit sie bestehen |
| Annahmen benannt und bestätigt sind | Secrets im Code oder neue offene Ports auftauchen |
Modul: KI-gestützte IaC-Entwicklung
Typische Fallen
- Ein Admin-Zugang für alles. Wer den State liest, kann dann auch produktiv ausrollen.
- Passwort im
backend-Block. Die Verbindungszeichenfolge steht damit im Repository. - Secret Store angebunden, Wert trotzdem im State. Er wurde über ein normales Argument weitergereicht.
- Ephemere Variable an
env. Normale Argumente lehnen ephemere Werte mit einem Fehler ab. - prod aus test kopiert. Bald sind es zwei Konfigurationen, und ein Fix landet nur in einer.
- States lesen sich gegenseitig über
terraform_remote_state— ein Neuaufbau wird unmöglich. generated.tfungeprüft übernommen. Darin stehen Standardwerte, berechnete Werte und Umgebungsvariablen im Klartext, samt Passwort.- Fehlende Zugangsdaten für Drift gehalten. Sie sehen aus wie gelöschte Objekte — erst den Plan lesen.
- Test-Container nach hartem Abbruch. Sie bleiben stehen — per
labelsmarkieren; Tests mit apply nie neben prod. Saved plan is stalemit neuem Plan umgangen. Ausgeführt wird dann etwas ohne Freigabe; ebenso ein abgelehnter Plan, dessen Artefakt noch herumliegt.-lock=falseals Rettung. Öffnet die Tür für zwei gleichzeitige Applies.- Kompatibilität aus dem gemeinsamen Ursprung gefolgert statt per Plan geprüft.
- Terraform und OpenTofu abwechselnd gegen dieselbe Umgebung — oder die
Pipeline ruft weiter
terraformauf, obwohl längsttofugilt. - State, Plan-Ausgabe oder Passwort im Prompt. Sensible Werte fließen so ins KI-Werkzeug ab.
- Freigabe, weil die Pipeline grün ist — nicht, weil der Plan verstanden wurde.
Dieses Thema als Schulung für Ihr Team
Dieser Beitrag erklärt das Thema. Damit Ihr Team es danach auch anwendet, gibt es Terraform und OpenTofu in der Praxis als Schulung — an Ihrem eigenen Code, mit den Fragen, die ein Text nicht beantwortet. Sie wählen die Module, wir bauen daraus ein Programm.
5 Tage·ab 900 EUR netto pro Tag (bis 3 Teilnehmende) ·Termin nach Vereinbarung
Als Team-Schulung anfragenZum Seminar Terraform und OpenTofu in der Praxis →