
Pour paramétrer différents environnements sans modifier le code Terraform, créez un fichier .tfvars par environnement et sélectionnez-le avec terraform apply -var-file=envs/prod.tfvars. Le code reste identique, seules les valeurs changent. C’est la manière la plus simple de faire varier les paramètres d’un environnement à l’autre avec un seul répertoire Terraform, mais ce n’est pas une stratégie d’isolation du state à elle seule.
Prérequis : savoir utiliser les variables Terraform (variable, type, default). Avoir lu Organiser un dépôt Terraform pour comprendre la structuration des fichiers.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Créer des fichiers
.tfvarspour chaque environnement - Sélectionner le bon fichier avec
-var-file - Comprendre l’ordre de précédence des variables
- Surcharger une valeur ponctuellement avec
-var - Distinguer
terraform.tfvars(auto-chargé) des fichiers explicites
La structure cible
Section intitulée « La structure cible »mon-projet/├── versions.tf├── variables.tf ← Déclare les variables (sans valeurs par défaut)├── main.tf ← Utilise var.env_name, var.disk_size_gb, etc.├── outputs.tf└── envs/ ├── dev.tfvars ← env_name = "dev", disk_size_gb = 4 ├── staging.tfvars ← env_name = "staging", disk_size_gb = 4 └── prod.tfvars ← env_name = "prod", disk_size_gb = 8Le code est strictement le même pour tous les environnements. Seul le fichier .tfvars passé en argument change le comportement.
Déclarer des variables sans valeurs par défaut
Section intitulée « Déclarer des variables sans valeurs par défaut »La clé de cette approche : les variables dans variables.tf n’ont pas de default. Cela force à toujours fournir un fichier .tfvars :
variable "env_name" { description = "Nom de l'environnement" type = string}
variable "network_address" { description = "Adresse réseau (ex: 10.10.90.1)" type = string}
variable "disk_size_gb" { description = "Taille du volume en Go" type = number}Sans fichier de variables, Terraform refuse de planifier :
terraform plan -input=falseError: No value for required variable
on variables.tf line 1: 1: variable "env_name" {
The root module input variable "env_name" is not set, and has no defaultvalue. Use a -var or -var-file command line argument to provide a valuefor this variable.C’est un garde-fou volontaire : impossible de déployer sans préciser l’environnement.
Créer les fichiers .tfvars
Section intitulée « Créer les fichiers .tfvars »Chaque fichier .tfvars contient les valeurs adaptées à un environnement :
env_name = "dev"network_address = "10.10.90.1"dhcp_start = "10.10.90.10"dhcp_end = "10.10.90.100"disk_size_gb = 4base_image_path = "/chemin/vers/image.qcow2"env_name = "prod"network_address = "10.10.92.1"dhcp_start = "10.10.92.10"dhcp_end = "10.10.92.100"disk_size_gb = 8base_image_path = "/chemin/vers/image.qcow2"La syntaxe est simple : nom_variable = valeur, une par ligne, sans mot-clé variable.
Déployer avec -var-file
Section intitulée « Déployer avec -var-file »La commande -var-file indique à Terraform quel fichier de variables utiliser :
-
Déployer l’environnement dev
Fenêtre de terminal terraform apply -var-file=envs/dev.tfvars -auto-approvePlan: 2 to add, 0 to change, 0 to destroy.Apply complete! Resources: 2 added, 0 changed, 0 destroyed.Outputs:network_name = "dev-network"volume_name = "dev-disk.qcow2"disk_size = 4294967296Les ressources portent le préfixe
dev-, le volume fait 4 Go. -
Basculer vers la prod
Détruisez d’abord les ressources dev, puis déployez avec le fichier prod :
Fenêtre de terminal terraform destroy -var-file=envs/dev.tfvars -auto-approveterraform apply -var-file=envs/prod.tfvars -auto-approvePlan: 2 to add, 0 to change, 0 to destroy.Apply complete! Resources: 2 added, 0 changed, 0 destroyed.Outputs:network_name = "prod-network"volume_name = "prod-disk.qcow2"disk_size = 8589934592Le même code produit un réseau
prod-networkavec un volume de 8 Go.
Surcharger une variable avec -var
Section intitulée « Surcharger une variable avec -var »Le flag -var en ligne de commande surcharge toute autre source de la même variable :
terraform plan -var-file=envs/prod.tfvars -var='disk_size_gb=16' ~ capacity = 8589934592 -> 17179869184Le fichier prod.tfvars définit disk_size_gb = 8, mais -var='disk_size_gb=16' le surcharge à 16 Go. C’est utile pour un test ponctuel sans modifier le fichier.
L’ordre de précédence des variables
Section intitulée « L’ordre de précédence des variables »Terraform applique les variables dans un ordre strict. La dernière source gagne :
| Priorité | Source | Chargement |
|---|---|---|
| 1 (plus faible) | default dans variable {} | Automatique |
| 2 | terraform.tfvars | Automatique si présent |
| 3 | *.auto.tfvars (ordre alphabétique) | Automatique si présent |
| 4 | -var-file=... | Explicite |
| 5 (plus forte) | -var='...' | Explicite |
terraform.tfvars : le fichier auto-chargé
Section intitulée « terraform.tfvars : le fichier auto-chargé »Un fichier nommé exactement terraform.tfvars à la racine du projet est chargé automatiquement à chaque commande, sans -var-file :
# terraform.tfvars — chargé automatiquementenv_name = "auto"network_address = "10.10.99.1"disk_size_gb = 2terraform planLes valeurs de terraform.tfvars (auto, 2 Go, .99.x) sont utilisées.
Mais si vous ajoutez -var-file, celui-ci prend le dessus :
terraform plan -var-file=envs/prod.tfvarsNo changes. Your infrastructure matches the configuration.Les valeurs de prod.tfvars (prod, 8 Go, .92.x) remplacent celles de terraform.tfvars.
*.auto.tfvars : chargement par suffixe
Section intitulée « *.auto.tfvars : chargement par suffixe »Tout fichier se terminant par .auto.tfvars est aussi chargé automatiquement, par ordre alphabétique :
common.auto.tfvars ← chargé en premierregion.auto.tfvars ← chargé en second (surcharge si même variable)Ce mécanisme est utile pour des valeurs communes (comme base_image_path) partagées entre tous les environnements, combinées avec un -var-file pour les valeurs spécifiques.
Combiner tfvars et répertoires séparés
Section intitulée « Combiner tfvars et répertoires séparés »La combinaison la plus robuste pour un projet professionnel :
mon-projet/├── modules/│ └── infra/│ ├── ...├── envs/│ ├── dev/│ │ ├── main.tf│ │ ├── backend.tf ← Backend local ou distant propre à dev│ │ └── dev.tfvars ← Valeurs dev│ └── prod/│ ├── main.tf│ ├── backend.tf ← Backend local ou distant propre à prod│ └── prod.tfvars ← Valeurs prodChaque environnement a son propre répertoire et son propre .tfvars. En backend local, cela suffit pour séparer les fichiers de state. En backend distant, il faut aussi séparer la configuration de backend (backend.tf ou -backend-config) pour éviter de réutiliser la même key. La commande de déploiement devient :
cd envs/prodterraform apply -var-file=prod.tfvarsDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Error: No value for required variable | Pas de -var-file et pas de default | Ajouter -var-file=envs/xxx.tfvars à la commande |
| Variable a une valeur inattendue | Conflit entre terraform.tfvars et -var-file | Vérifier l’ordre de précédence, supprimer terraform.tfvars si non voulu |
Error: Invalid value for variable | Type incompatible dans le .tfvars | Vérifier que la valeur correspond au type déclaré (number vs string) |
-var-file ignoré | Chemin relatif incorrect | Vérifier le chemin depuis le répertoire courant |
| Variables sensibles visibles dans le plan | sensitive = true absent | Ajouter sensitive = true sur les variables contenant des secrets |
À retenir
Section intitulée « À retenir »- Un fichier
.tfvarspar environnement contient les valeurs spécifiques (noms, adresses, tailles) -var-file=envs/prod.tfvarssélectionne l’environnement au moment duplanou de l’apply- Sans
default, les variables obligent à fournir un.tfvars— c’est un garde-fou volontaire terraform.tfvarsest chargé automatiquement, mais-var-filele surcharge-var='...'en ligne de commande surcharge toute autre source — utile pour les tests ponctuels- Les fichiers
.tfvarschangent les valeurs, pas le state ; pour une vraie isolation, combinez-les avec des répertoires séparés et, si besoin, un backend distinct