
Terraform a besoin de savoir ce qui existe déjà avant de décider quoi créer, modifier ou supprimer. Le state est le fichier qui lui sert de mémoire : sans lui, Terraform considère que rien n’existe et tente de tout recréer. Ce guide explique ce qu’est le state, ce qu’il contient, et pourquoi le protéger est essentiel.
Quand vous lancez terraform apply, Terraform compare votre code (ce que vous voulez) avec le state (ce qui existe). La différence entre les deux produit le plan — la liste des actions à effectuer. Si le state est perdu ou corrompu, ce calcul devient impossible : Terraform ne peut plus distinguer une création d’une modification.
Prérequis : avoir suivi Première infrastructure ou avoir créé au moins une ressource avec terraform apply.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Ce qu’est le state et pourquoi Terraform en a besoin
- Ce que contient le fichier
terraform.tfstate(structure JSON) - Comment le state évolue à chaque
apply(serial, backup automatique) - Ce qui se passe quand le state est perdu
- Les règles essentielles pour protéger votre state
Ce qu’est le state
Section intitulée « Ce qu’est le state »Le state est un fichier JSON nommé terraform.tfstate qui enregistre l’état réel de votre infrastructure. Chaque ressource créée par Terraform y est décrite avec ses attributs actuels : identifiant, nom, chemin, taille, configuration réseau…
En une phrase : le state fait le lien entre votre code HCL et les objets réels (VMs, disques, réseaux) qui existent sur l’hyperviseur ou le cloud.
Pourquoi Terraform a besoin du state
Section intitulée « Pourquoi Terraform a besoin du state »Terraform est déclaratif : vous décrivez l’état final souhaité, et il calcule les actions nécessaires. Pour ce calcul, il a besoin de trois informations :
| Information | Source | Exemple |
|---|---|---|
| Ce que vous voulez | Votre code HCL (.tf) | name = "ma-vm.qcow2" |
| Ce qui existe | Le fichier state | id = "/var/lib/libvirt/images/ma-vm.qcow2" |
| Ce qu’il faut faire | Le plan (calculé) | No changes ou 1 to add |
Sans le state, Terraform ne dispose que de votre code. Il ne peut pas savoir si la VM existe déjà ou non. Résultat : il essaie de tout recréer — et échoue souvent parce que les ressources existent déjà.
Créer un state — en pratique
Section intitulée « Créer un state — en pratique »Pour observer le state en action, créez un projet minimal avec un seul volume :
terraform { required_version = ">= 1.11.0" required_providers { libvirt = { source = "dmacvicar/libvirt" version = "~> 0.8" } }}
provider "libvirt" { uri = "qemu:///system"}resource "libvirt_volume" "disk" { name = "state-demo.qcow2" pool = "default" target = { format = { type = "qcow2" } } create = { content = { url = "/chemin/vers/ubuntu-24.04-cloudimg.img" } }}output "disk_path" { description = "Chemin du volume sur l'hôte" value = libvirt_volume.disk.path}
output "disk_name" { description = "Nom du volume" value = libvirt_volume.disk.name}Appliquez :
terraform initterraform apply -auto-approveRésultat :
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
disk_name = "state-demo.qcow2"disk_path = "/var/lib/libvirt/images/state-demo.qcow2"Un fichier terraform.tfstate est apparu dans le répertoire. C’est le state.
Ce que contient le state
Section intitulée « Ce que contient le state »Le state est un fichier JSON lisible. Voici sa structure simplifiée après la création du volume :
{ "version": 4, "terraform_version": "1.14.3", "serial": 2, "lineage": "cedddae6-a296-...", "outputs": { "disk_name": { "value": "state-demo.qcow2", "type": "string" }, "disk_path": { "value": "/var/lib/libvirt/images/state-demo.qcow2", "type": "string" } }, "resources": [ { "mode": "managed", "type": "libvirt_volume", "name": "disk", "provider": "provider[\"registry.terraform.io/dmacvicar/libvirt\"]", "instances": [ { "attributes": { "id": "/var/lib/libvirt/images/state-demo.qcow2", "name": "state-demo.qcow2", "pool": "default", "capacity": 3758096384 } } ] } ]}Anatomie des champs principaux
Section intitulée « Anatomie des champs principaux »| Champ | Rôle | Exemple |
|---|---|---|
version | Version du format du state | 4 (stable depuis Terraform 0.12) |
terraform_version | Version de Terraform utilisée | "1.14.3" |
serial | Compteur incrémenté à chaque modification | 2 → 3 → 4… |
lineage | Identifiant unique du state (UUID) | "cedddae6-a296-..." |
outputs | Valeurs des blocs output {} | disk_path, disk_name |
resources | Liste des ressources gérées avec leurs attributs réels | libvirt_volume.disk |
Comment le state évolue
Section intitulée « Comment le state évolue »Le state n’est pas figé. Il change à chaque apply qui modifie l’infrastructure ou les outputs.
-
Premier
apply: le state est créé avecserial: 1(ou2selon le provider). -
Apply suivant avec changement : Terraform écrit le nouveau state avec un
serialincrémenté. L’ancien state est sauvegardé dansterraform.tfstate.backup. -
Apply sans changement : le state ne change pas, le serial reste identique.
Vérifiez par vous-même :
# Après le premier applyls -lh terraform.tfstate terraform.tfstate.backup-rw-rw-r-- 1 bob bob 1,9K mars 31 13:33 terraform.tfstate-rw-rw-r-- 1 bob bob 1,9K mars 31 13:33 terraform.tfstate.backupLe backup contient l’état précédent. Si un apply corrompt le state, vous pouvez restaurer le backup.
Que se passe-t-il sans state ?
Section intitulée « Que se passe-t-il sans state ? »C’est la démonstration la plus parlante. Supprimez temporairement le state et lancez un plan :
mv terraform.tfstate terraform.tfstate.sauvegardeterraform planRésultat — Terraform veut tout recréer :
Terraform will perform the following actions:
# libvirt_volume.disk will be created + resource "libvirt_volume" "disk" { + name = "state-demo.qcow2" + pool = "default" ... }
Plan: 1 to add, 0 to change, 0 to destroy.Le volume existe toujours sur l’hyperviseur, mais Terraform ne le sait plus. Si vous appliquez ce plan, il tentera de créer un doublon — et échouera probablement.
Restaurez le state :
mv terraform.tfstate.sauvegarde terraform.tfstateterraform planNo changes. Your infrastructure matches the configuration.Terraform retrouve sa mémoire. Le plan est vide.
Lire le state avec les commandes Terraform
Section intitulée « Lire le state avec les commandes Terraform »Vous n’avez pas besoin d’ouvrir le fichier JSON directement. Terraform fournit des commandes dédiées :
# Lister toutes les ressources du stateterraform state listlibvirt_volume.disk# Voir les détails d'une ressourceterraform state show libvirt_volume.disk# libvirt_volume.disk:resource "libvirt_volume" "disk" { allocation = 629989376 capacity = 3758096384 id = "/var/lib/libvirt/images/state-demo.qcow2" name = "state-demo.qcow2" path = "/var/lib/libvirt/images/state-demo.qcow2" pool = "default" target = { format = { type = "qcow2" } path = "/var/lib/libvirt/images/state-demo.qcow2" }}Le state peut contenir des données sensibles
Section intitulée « Le state peut contenir des données sensibles »Le state enregistre tous les attributs des ressources — y compris les mots de passe, clés SSH et tokens que le provider renvoie. Un terraform.tfstate non protégé est un risque de sécurité.
| Donnée sensible | Comment elle se retrouve dans le state |
|---|---|
| Mot de passe base de données | Attribut password d’une ressource DB |
| Clé SSH privée | Attribut private_key d’un tls_private_key |
| Token API | Attribut token d’un random_password |
Règles de base :
- Ne jamais commiter
terraform.tfstatedans Git - Ajouter
*.tfstateet*.tfstate.backupdans.gitignore - Pour un vrai projet, utiliser un backend distant avec chiffrement
Le .gitignore recommandé
Section intitulée « Le .gitignore recommandé »Ajoutez ces entrées à votre .gitignore dès le premier terraform init :
# Terraform state — contient des données sensibles*.tfstate*.tfstate.backup*.tfstate.*.backup
# Répertoire de travail Terraform.terraform/
# Fichiers de variables sensibles*.tfvars!example.tfvarsDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
terraform plan veut tout recréer | State absent ou corrompu | Vérifier terraform.tfstate, restaurer le backup |
Error: resource already exists | State perdu mais ressource toujours présente | terraform import pour réassocier |
serial ne correspond pas | Deux apply simultanés | Utiliser un backend distant avec verrouillage |
| State très volumineux | Trop de ressources dans un seul projet | Découper en plusieurs projets/stacks |
À retenir
Section intitulée « À retenir »- Le state (
terraform.tfstate) est la mémoire de Terraform : il fait le lien entre votre code et l’infrastructure réelle - Sans state, Terraform considère que rien n’existe et tente de tout recréer
- Le serial s’incrémente à chaque modification — c’est un mécanisme de protection contre les modifications concurrentes
- Le backup (
terraform.tfstate.backup) contient l’état précédent — c’est votre filet de sécurité immédiat - Le state peut contenir des données sensibles : ne jamais le commiter dans Git
- Utilisez
terraform state listetterraform state showpour inspecter le state — pas l’éditeur de texte