Terraform State Management (Zustandsverwaltung)

LinuxBeginner
Jetzt üben

Einführung

Terraform verwendet eine Zustandsdatei (State File), um Informationen über die von ihm verwaltete Infrastruktur zu speichern. Diese Zustandsdatei ist entscheidend, da sie die in Ihren Konfigurationsdateien definierten Ressourcen mit den realen Ressourcen abbildet. Durch die Pflege dieses Zustands kann Terraform bestimmen, welche Ressourcen erstellt, aktualisiert oder zerstört werden müssen.

In diesem Lab sammeln Sie praktische Erfahrungen im Umgang mit dem Terraform-Zustand (State). Sie lernen, wie Sie verschiedene Unterbefehle von terraform state verwenden, um den aktuellen Zustand zu überprüfen, verwaltete Ressourcen aufzulisten, eine Ressource innerhalb des Zustands umzubenennen und den Zustand zu aktualisieren (refresh), um ihn mit der tatsächlichen Infrastruktur abzugleichen. Dies sind grundlegende Fähigkeiten für jeden Terraform-Benutzer.

Aktuellen Zustand mit terraform show anzeigen

In diesem Schritt lernen Sie, wie Sie den aktuellen Zustand mithilfe des Befehls terraform show anzeigen können. Dieser Befehl liefert eine menschenlesbare Ausgabe der Ressourcen, die Terraform derzeit verwaltet, wie sie in der Zustandsdatei (State File) gespeichert sind. Es ist eine sichere, schreibgeschützte Methode, um den Zustand Ihrer Infrastruktur zu überprüfen.

Das Setup-Skript für dieses Lab hat Terraform bereits initialisiert und eine Ressource erstellt, wodurch eine terraform.tfstate-Datei generiert wurde. Lassen Sie uns diese überprüfen.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

terraform show

Sie sehen eine detaillierte Ausgabe, die die von Terraform verwaltete Ressource local_file beschreibt.

## local_file.example:
resource "local_file" "example" {
    content              = "This is an example file managed by Terraform."
    content_base64sha256 = "F5EYZhFNzSXdE4CUftwQoDVqvdiufZpVyiLMqyZVOcQ="
    content_base64sha512 = "m1hvaxMuc/EhaKintyI54NSTTJ5yXpqHPCBNoHubF0rvF3JAj36lMj20aPcv21+3/OK+SqkiTlnT/LdvLCwqDA=="
    content_md5          = "a43bdd236c2f0f4d87452ba2ef0867e4"
    content_sha1         = "ec3adcab998872def2df6200fb03992ac6f237a4"
    content_sha256       = "17911866114dcd25dd1380947edc10a0356abdd8ae7d9a55ca22ccab265539c4"
    content_sha512       = "9b586f6b132e73f12168a8a7b72239e0d4934c9e725e9a873c204da07b9b174aef1772408f7ea5323db468f72fdb5fb7fce2be4aa9224e59d3fcb76f2c2c2a0c"
    directory_permission = "0777"
    file_permission      = "0777"
    filename             = "./example.txt"
    id                   = "ec3adcab998872def2df6200fb03992ac6f237a4"
}

Diese Ausgabe bestätigt, dass Terraform eine Ressource, local_file.example, kennt und alle ihre Attribute auflistet.

State-Datei terraform.tfstate inspizieren

In diesem Schritt inspizieren Sie die rohe Zustandsdatei, terraform.tfstate. Während terraform show eine benutzerfreundliche Ansicht bietet, hilft Ihnen der Blick in die rohe JSON-Datei zu verstehen, wie Terraform Daten speichert.

Warnung: Sie sollten die Datei terraform.tfstate fast niemals manuell bearbeiten. Falsche Änderungen können Ihren Zustand beschädigen und zu ernsthaften Problemen führen. Wir betrachten sie hier nur zu Schulungszwecken.

Verwenden Sie den Befehl cat, um den Inhalt der Zustandsdatei anzuzeigen:

cat terraform.tfstate

Die Ausgabe ist ein JSON-Objekt. Es enthält Metadaten wie die Terraform-Version und, was am wichtigsten ist, ein Array von resources.

{
  "version": 4,
  "terraform_version": "1.13.3",
  "serial": 1,
  "lineage": "2a568739-a81d-ced7-dee1-7a92a1666022",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "local_file",
      "name": "example",
      "provider": "provider[\"registry.terraform.io/hashicorp/local\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "content": "This is an example file managed by Terraform.",
            "content_base64sha256": "...",
            "content_base64sha512": "...",
            "content_md5": "...",
            "content_sha1": "...",
            "content_sha256": "...",
            "content_sha512": "...",
            "directory_permission": "0777",
            "file_permission": "0777",
            "filename": "./example.txt",
            "id": "ec3adcab998872def2df6200fb03992ac6f237a4",
            "sensitive_content": null,
            "source": null
          },
          "sensitive_attributes": [
            [
              {
                "type": "get_attr",
                "value": "sensitive_content"
              }
            ]
          ],
          "identity_schema_version": 0
        }
      ]
    }
  ],
  "check_results": null
}

Diese Rohdaten sind das, was Terraform zur Erstellung von Ausführungsplänen (Execution Plans) verwendet.

terraform state list ausführen, um Ressourcen aufzulisten

In diesem Schritt verwenden Sie terraform state list, um eine prägnante Liste aller Ressourcen im Zustand (State) zu erhalten. Wenn Ihre Infrastruktur wächst und Sie Dutzende oder Hunderte von Ressourcen haben, kann terraform show zu ausführlich sein. Der Befehl state list liefert eine einfache, durch Zeilenumbrüche getrennte Liste von Ressourcenadressen.

Führen Sie den Befehl in Ihrem Terminal aus:

terraform state list

Die Ausgabe wird sehr einfach sein und nur die Adresse der von uns erstellten Ressource anzeigen.

local_file.example

Dieser Befehl ist äußerst nützlich für Skripte oder um schnell die Adresse einer bestimmten Ressource zu identifizieren, wenn Sie diese mit anderen Befehlen ansprechen müssen.

terraform state mv verwenden, um die Ressource umzubenennen

In diesem Schritt lernen Sie, wie Sie eine Ressource in der Zustandsdatei mithilfe von terraform state mv umbenennen. Dies ist eine häufige Aufgabe beim Refactoring Ihres Terraform-Codes. Wenn Sie einen Ressourcenblock in Ihrer .tf-Datei umbenennen, geht Terraform davon aus, dass Sie die alte Ressource zerstören und eine neue erstellen möchten. Der Befehl state mv ermöglicht es Ihnen, die Zustandsdatei an die Änderungen in Ihrem Code anzupassen und so unnötige Zerstörung und Neuerstellung zu verhindern.

Zuerst benennen wir die Ressource in unserer Konfigurationsdatei um. Öffnen Sie main.tf mit dem Editor nano:

nano main.tf

Ändern Sie den Ressourcennamen von example zu example_renamed. Die Datei sollte wie folgt aussehen:

resource "local_file" "example_renamed" {
  content  = "This is an example file managed by Terraform."
  filename = "${path.module}/example.txt"
}

Drücken Sie Ctrl+X, dann Y und Enter, um zu speichern und zu beenden.

Führen Sie nun terraform plan aus, um zu sehen, was Terraform tun möchte:

terraform plan

Der Plan zeigt, dass Terraform local_file.example zerstören und local_file.example_renamed erstellen möchte, was nicht das ist, was wir wollen.

local_file.example: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:

  ## local_file.example will be destroyed
  ## (because local_file.example is not in configuration)
  - resource "local_file" "example" {
      - content              = "This is an example file managed by Terraform." -> null
      - content_base64sha256 = "F5EYZhFNzSXdE4CUftwQoDVqvdiufZpVyiLMqyZVOcQ=" -> null
      - content_base64sha512 = "m1hvaxMuc/EhaKintyI54NSTTJ5yXpqHPCBNoHubF0rvF3JAj36lMj20aPcv21+3/OK+SqkiTlnT/LdvLCwqDA==" -> null
      - content_md5          = "a43bdd236c2f0f4d87452ba2ef0867e4" -> null
      - content_sha1         = "ec3adcab998872def2df6200fb03992ac6f237a4" -> null
      - content_sha256       = "17911866114dcd25dd1380947edc10a0356abdd8ae7d9a55ca22ccab265539c4" -> null
      - content_sha512       = "9b586f6b132e73f12168a8a7b72239e0d4934c9e725e9a873c204da07b9b174aef1772408f7ea5323db468f72fdb5fb7fce2be4aa9224e59d3fcb76f2c2c2a0c" -> null
      - directory_permission = "0777" -> null
      - file_permission      = "0777" -> null
      - filename             = "./example.txt" -> null
      - id                   = "ec3adcab998872def2df6200fb03992ac6f237a4" -> null
    }

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Um dies zu beheben, teilen wir Terraform mit, dass wir die Ressource lediglich verschoben haben. Führen Sie den Befehl terraform state mv mit der alten Adresse und der neuen Adresse aus:

terraform state mv local_file.example local_file.example_renamed

Sie erhalten eine Bestätigungsnachricht:

Move "local_file.example" to "local_file.example_renamed"
Successfully moved 1 object(s).

Führen Sie nun erneut terraform plan aus:

terraform plan

Dieses Mal meldet Terraform, dass keine Änderungen erforderlich sind, da der Zustand nun mit der Konfiguration übereinstimmt.

local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

terraform refresh ausführen, um den State zu aktualisieren

In diesem Schritt verwenden Sie terraform refresh, um die Zustandsdatei mit der realen Infrastruktur abzugleichen. Manchmal werden Änderungen an Ihrer Infrastruktur außerhalb der Kontrolle von Terraform vorgenommen. Dies wird als "Drift" (Abweichung) bezeichnet. Der Befehl refresh aktualisiert die Zustandsdatei, um diese Änderungen widerzuspiegeln.

Simulieren wir Drift, indem wir die von Terraform erstellte Datei manuell löschen.

rm example.txt

Wenn Sie nun einen Plan ausführen, erkennt Terraform, dass die Datei fehlt und neu erstellt werden muss.

terraform plan
local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Allerdings kann der Befehl terraform refresh auch verwendet werden, um den Zustand explizit zu aktualisieren. Dieser Befehl überprüft die tatsächlichen Ressourcen und aktualisiert die Zustandsdatei entsprechend.

terraform refresh
local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Führen Sie nun erneut terraform plan aus, um zu bestätigen, dass der Zustand aktuell ist.

terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Sie haben terraform refresh erfolgreich verwendet, um die Zustandsabweichung (State Drift) zu korrigieren.

Zusammenfassung

Herzlichen Glückwunsch zum Abschluss dieses Labs zum Thema Terraform State Management!

In diesem Lab haben Sie praktische Erfahrungen mit wichtigen terraform state Unterbefehlen gesammelt. Sie haben gelernt, wie Sie:

  • terraform show verwenden, um eine menschenlesbare Darstellung des Zustands Ihrer Infrastruktur anzuzeigen.
  • Die rohe terraform.tfstate JSON-Datei inspizieren, um deren Struktur zu verstehen.
  • Mit terraform state list eine saubere Liste aller verwalteten Ressourcen erhalten.
  • Eine Ressource in Ihrer Konfiguration sicher umbenennen und den Zustand entsprechend mit terraform state mv aktualisieren.
  • Ihre Zustandsdatei mit der realen Infrastruktur abgleichen und Drift mit terraform refresh korrigieren.

Die Beherrschung dieser Befehle ist grundlegend für die effektive und sichere Verwaltung Ihrer Infrastruktur mit Terraform.