Gestion de l'État Terraform

LinuxBeginner
Pratiquer maintenant

Introduction

Terraform utilise un fichier d'état (state file) pour stocker des informations sur l'infrastructure qu'il gère. Ce fichier d'état est crucial car il mappe les ressources définies dans vos fichiers de configuration aux ressources du monde réel. En maintenant cet état, Terraform peut déterminer quelles ressources créer, mettre à jour ou détruire.

Dans ce laboratoire, vous acquerrez une expérience pratique de la gestion de l'état de Terraform. Vous apprendrez à utiliser diverses sous-commandes de terraform state pour inspecter l'état actuel, lister les ressources gérées, renommer une ressource au sein de l'état, et rafraîchir l'état pour l'aligner sur l'infrastructure réelle. Ce sont des compétences fondamentales pour tout utilisateur de Terraform.

Visualiser l'état actuel avec terraform show

Dans cette étape, vous apprendrez à visualiser l'état actuel à l'aide de la commande terraform show. Cette commande fournit une sortie lisible par l'homme des ressources actuellement gérées par Terraform, telles qu'enregistrées dans le fichier d'état. C'est une manière sûre et en lecture seule d'inspecter l'état de votre infrastructure.

Le script de configuration pour ce laboratoire a déjà initialisé Terraform et créé une ressource, générant un fichier terraform.tfstate. Inspectons-le.

Exécutez la commande suivante dans votre terminal :

terraform show

Vous verrez une sortie détaillée décrivant la ressource local_file que Terraform gère.

## 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"
}

Cette sortie confirme que Terraform est conscient d'une ressource, local_file.example, et liste tous ses attributs.

Inspecter le fichier d'état terraform.tfstate

Dans cette étape, vous allez inspecter le fichier d'état brut, terraform.tfstate. Bien que terraform show fournisse une vue conviviale, examiner le fichier JSON brut vous aide à comprendre comment Terraform stocke les données.

Avertissement : Vous ne devriez presque jamais modifier le fichier terraform.tfstate manuellement. Des modifications incorrectes peuvent corrompre votre état et entraîner des problèmes sérieux. Nous ne faisons que le visualiser à des fins éducatives.

Utilisez la commande cat pour afficher le contenu du fichier d'état :

cat terraform.tfstate

Le résultat sera un objet JSON. Il contient des métadonnées telles que la version de Terraform et, plus important encore, un tableau de 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
}

Ces données brutes sont ce que Terraform utilise pour créer des plans d'exécution (execution plans).

Exécuter terraform state list pour lister les ressources

Dans cette étape, vous utiliserez terraform state list pour obtenir une liste concise de toutes les ressources dans l'état (state). Lorsque votre infrastructure grandit et que vous avez des dizaines ou des centaines de ressources, terraform show peut être trop verbeux. La commande state list fournit une liste simple, séparée par des sauts de ligne, des adresses des ressources.

Exécutez la commande dans votre terminal :

terraform state list

La sortie sera très simple, n'affichant que l'adresse de la ressource que nous avons créée.

local_file.example

Cette commande est extrêmement utile pour le scripting ou pour identifier rapidement l'adresse d'une ressource spécifique lorsque vous devez la cibler avec d'autres commandes.

Utiliser terraform state mv pour renommer une ressource

Dans cette étape, vous apprendrez comment renommer une ressource dans le fichier d'état en utilisant terraform state mv. C'est une tâche courante lors de la refactorisation de votre code Terraform. Si vous renommez un bloc de ressource dans votre fichier .tf, Terraform pensera que vous souhaitez détruire l'ancienne ressource et en créer une nouvelle. La commande state mv vous permet de mettre à jour le fichier d'état pour qu'il corresponde aux modifications de votre code, évitant ainsi une destruction et une création inutiles.

Tout d'abord, renommons la ressource dans notre fichier de configuration. Ouvrez main.tf avec l'éditeur nano :

nano main.tf

Changez le nom de la ressource de example à example_renamed. Le fichier devrait ressembler à ceci :

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

Appuyez sur Ctrl+X, puis Y, et Enter pour sauvegarder et quitter.

Maintenant, exécutez terraform plan pour voir ce que Terraform a l'intention de faire :

terraform plan

Le plan montrera que Terraform veut détruire local_file.example et créer local_file.example_renamed, ce qui n'est pas ce que nous voulons.

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.

Pour corriger cela, nous allons indiquer à Terraform que nous avons simplement déplacé la ressource. Exécutez la commande terraform state mv avec l'ancienne adresse et la nouvelle adresse :

terraform state mv local_file.example local_file.example_renamed

Vous verrez un message de confirmation :

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

Maintenant, exécutez à nouveau terraform plan :

terraform plan

Cette fois, Terraform signale qu'aucune modification n'est nécessaire car l'état correspond maintenant à la configuration.

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.

Exécuter terraform refresh pour mettre à jour l'état

Dans cette étape, vous utiliserez terraform refresh pour réconcilier le fichier d'état avec l'infrastructure réelle. Parfois, des modifications sont apportées à votre infrastructure en dehors du contrôle de Terraform. C'est ce qu'on appelle la "dérive" (drift). La commande refresh met à jour le fichier d'état pour refléter ces changements.

Simulons une dérive en supprimant manuellement le fichier que Terraform a créé.

rm example.txt

Maintenant, si vous exécutez un plan, Terraform détectera que le fichier est manquant et doit être recréé.

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.

Cependant, la commande terraform refresh peut également être utilisée pour rafraîchir explicitement l'état. Cette commande vérifie les ressources réelles et met à jour le fichier d'état en conséquence.

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

Exécutez maintenant terraform plan à nouveau pour confirmer que l'état est à jour.

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.

Vous avez réussi à utiliser terraform refresh pour corriger la dérive de l'état.

Résumé

Félicitations pour avoir terminé ce laboratoire sur la gestion de l'état Terraform (Terraform State Management) !

Dans ce laboratoire, vous avez acquis une expérience pratique avec les sous-commandes essentielles de terraform state. Vous avez appris à :

  • Utiliser terraform show pour visualiser une représentation lisible par l'homme de l'état de votre infrastructure.
  • Inspecter le fichier JSON brut terraform.tfstate pour comprendre sa structure.
  • Obtenir une liste claire de toutes les ressources gérées avec terraform state list.
  • Renommer en toute sécurité une ressource dans votre configuration et mettre à jour l'état en conséquence en utilisant terraform state mv.
  • Réconcilier votre fichier d'état avec l'infrastructure réelle et corriger la dérive (drift) en utilisant terraform refresh.

La maîtrise de ces commandes est fondamentale pour gérer votre infrastructure de manière efficace et confiante avec Terraform.