
Votre terraform apply échoue avec un message en rouge. Le fichier, la ligne et le type de problème sont indiqués — encore faut-il savoir les lire. Une fois cette compétence acquise, vous trouvez la cause en quelques secondes.
Terraform signale ses erreurs avec précision : fichier, ligne, type de problème, et souvent une suggestion de correction. Les erreurs se répartissent en 4 catégories prévisibles, chacune avec son reflexe de correction. Ce guide les présente avec les messages exacts produits en lab.
Ce que vous allez apprendre :
- Lire la structure d’un message d’erreur Terraform
- Diagnostiquer par catégorie : attribut inconnu, référence manquante, type incorrect, erreur runtime
- Appliquer le workflow
validate→plan→applypour économiser du temps - Provoquer et corriger une erreur réelle dans un lab
Prérequis : avoir suivi le guide Première infrastructure.
Lire un message d’erreur Terraform
Section intitulée « Lire un message d’erreur Terraform »Avant de catégoriser les erreurs, voici la structure d’un message d’erreur Terraform :
Error: Unsupported argument││ on bad.tf line 4, in resource "libvirt_volume" "bad":│ 4: format = "qcow2"││ An argument named "format" is not expected here.Chaque message comporte :
- Le type d’erreur en gras (
Unsupported argument) - La localisation exacte : fichier + numéro de ligne + bloc concerné
- L’extrait de code fautif
- L’explication en langage naturel
Commencez toujours par lire la dernière ligne du message — c’est là que se trouve la réponse.
Workflow de débogage
Section intitulée « Workflow de débogage »terraform validate # 1. Syntaxe et schématerraform plan # 2. Logique et dépendancesterraform apply # 3. RuntimeCatégorie 1 : attribut inconnu ou mal placé
Section intitulée « Catégorie 1 : attribut inconnu ou mal placé »C’est l’erreur la plus courante quand on migre d’une ancienne version du provider à une nouvelle, ou quand on copie-colle du code sans vérifier le schéma.
Erreur réelle capturée en lab :
# bad.tf — erreur volontaireresource "libvirt_volume" "bad" { name = "bad.qcow2" pool = "default" format = "qcow2" # ← attribut au mauvais endroit}terraform validateError: Unsupported argument││ on bad.tf line 4, in resource "libvirt_volume" "bad":│ 4: format = "qcow2"││ An argument named "format" is not expected here.Cause : Dans libvirt provider v0.9.7, le format d’un volume se déclare dans target.format.type, pas directement à la racine de la ressource.
Correction :
resource "libvirt_volume" "bad" { name = "bad.qcow2" pool = "default" target = { format = { type = "qcow2" } # ← emplacement correct }}Réflexe : quand le message dit “not expected here”, consultez le schéma du provider dans la documentation ou avec terraform providers schema.
terraform providers schema -json | python3 -m json.tool | grep -A5 '"libvirt_volume"'Catégorie 2 : référence à une ressource inexistante
Section intitulée « Catégorie 2 : référence à une ressource inexistante »Terraform résout les références entre ressources lors du validate. Si la ressource référencée n’existe pas, l’erreur est immédiate.
Erreur :
resource "libvirt_domain" "bad" { devices = { disks = [{ source = { file = { file = libvirt_volume.missing.path } } # ↑ "missing" n'est pas déclaré }] }}Error: Reference to undeclared resource││ on bad.tf line 4, in resource "libvirt_domain" "bad":│ 4: source = { file = { file = libvirt_volume.missing.path } }││ A managed resource "libvirt_volume" "missing" has not been declared│ in the root module.Causes fréquentes :
- Faute de frappe dans le nom (
libvirt_volume.diskvslibvirt_volume.dsk) - La ressource est dans un autre fichier qui n’a pas encore été créé
- Le nom a changé lors d’un refactoring
Correction : Vérifiez les noms avec terraform state list si les ressources existent déjà, ou cherchez la déclaration dans vos fichiers .tf.
Catégorie 3 : type de valeur incorrect
Section intitulée « Catégorie 3 : type de valeur incorrect »Terraform est typé. Si une variable attend un number et reçoit une string, l’erreur est détectée à la validation.
Erreur :
resource "libvirt_domain" "bad" { memory = "512" # ← string au lieu de number}Error: Incorrect attribute value type││ on bad.tf line 3, in resource "libvirt_domain" "bad":│ 3: memory = "512"││ Inappropriate value for attribute "memory": a number is required.Correction : memory = 512 (sans guillemets).
Catégorie 4 : erreurs runtime (après validate et plan)
Section intitulée « Catégorie 4 : erreurs runtime (après validate et plan) »Certaines erreurs n’apparaissent qu’à terraform apply, quand Terraform interagit réellement avec le provider :
Ressource déjà existante :
Error: Error creating libvirt network: Domain already exists lab14-netCela arrive quand la ressource existe dans libvirt mais pas dans le state Terraform (par exemple, après un crash pendant un apply précédent).
Solutions selon la situation :
| Situation | Solution |
|---|---|
| La ressource a été créée manuellement | terraform import pour l’adopter |
| Le state a été perdu | Recréer le state avec terraform import |
| Doublon involontaire | Supprimer la ressource manuellement, puis apply |
Permission refusée :
Error: virError(Code=1, Domain=10, Message='authentication failed')Vérifiez que l’utilisateur a accès à qemu:///system :
groups $USER | grep -q libvirt || sudo usermod -aG libvirt $USERImage de base absente :
Error: error creating libvirt volume: internal error: ...Cannot access storage file '/chemin/vers/ubuntu-24.04-cloudimg.img'L’image de base n’existe pas au chemin indiqué. Vérifiez :
ls -lh ~/images/ubuntu-24.04-cloudimg.imgLab : provoquer et corriger une erreur
Section intitulée « Lab : provoquer et corriger une erreur »-
Créez un répertoire de test :
Fenêtre de terminal mkdir -p ~/terraform-debug-applycd ~/terraform-debug-apply -
Créez
versions.tf(correct) puisbad.tfavec une erreur volontaire :Fenêtre de terminal cat > bad.tf << 'EOF'resource "libvirt_volume" "bad" {name = "bad.qcow2"pool = "default"format = "qcow2"}EOF -
Lancez le validate pour voir l’erreur :
Fenêtre de terminal terraform initterraform validateError: Unsupported argument│ on bad.tf line 4, in resource "libvirt_volume" "bad":│ 4: format = "qcow2"│ An argument named "format" is not expected here. -
Corrigez le fichier :
Fenêtre de terminal cat > bad.tf << 'EOF'resource "libvirt_volume" "bad" {name = "bad.qcow2"pool = "default"target = { format = { type = "qcow2" } }create = { content = { url = pathexpand("~/images/ubuntu-24.04-cloudimg.img") } }}EOFterraform validate# → Success! The configuration is valid. -
Supprimez le fichier de test et nettoyez :
Fenêtre de terminal rm bad.tf
Outils de diagnostic utiles
Section intitulée « Outils de diagnostic utiles »| Commande | Utilité |
|---|---|
terraform validate | Vérifie syntaxe et schéma (rapide, sans accès provider) |
terraform plan | Montre ce qui sera créé/modifié/détruit |
terraform show | Affiche l’état actuel des ressources |
terraform state list | Liste toutes les ressources dans le state |
TF_LOG=DEBUG terraform apply | Active les logs détaillés pour les erreurs obscures |
terraform providers schema -json | Affiche le schéma complet de tous les providers |
Pour les erreurs difficiles à diagnostiquer, TF_LOG=DEBUG affiche toutes les requêtes API envoyées au provider :
TF_LOG=DEBUG terraform apply 2>&1 | grep -i errorÀ retenir
Section intitulée « À retenir »- Lisez toujours la dernière ligne d’un message d’erreur Terraform — c’est là que se trouve l’explication.
- L’ordre de diagnostic :
validate→plan→apply. Unsupported argument: l’attribut n’existe pas ou est mal placé dans la hiérarchie.Reference to undeclared resource: faute de frappe ou ressource manquante.Incorrect attribute value type: guillemets en trop ou manquants.- Les erreurs runtime apparaissent à
applyet concernent l’état réel de l’infrastructure.