
Vous avez une configuration Terraform qui marche en dev — mais en prod
vous avez besoin d’une VM plus grosse, d’un réseau différent, d’une image
différente. Si vous modifiez les default dans variables.tf, vous perdez
les valeurs de dev. Si vous dupliquez les fichiers .tf, vous maintenez
deux bases de code quasi identiques.
Les fichiers tfvars sont la solution : au lieu de modifier le code,
vous créez un fichier de valeurs par environnement — dev.tfvars,
prod.tfvars. Terraform charge terraform.tfvars automatiquement,
peut aussi charger des fichiers *.auto.tfvars, et vous pouvez encore
ajouter des valeurs via -var-file, -var ou TF_VAR_. Le code HCL
reste identique, seules les valeurs changent. C’est le mécanisme standard
pour gérer la promotion d’environnements : passer de dev à prod sans
toucher une ligne de main.tf. La priorité réelle entre ces sources doit
être claire pour éviter les faux diagnostics pendant un plan.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre le rôle des fichiers
.tfvarspar rapport aux variables - Utiliser
terraform.tfvarschargé automatiquement par Terraform - Créer des fichiers par environnement :
dev.tfvars,prod.tfvars - Charger un fichier avec
-var-fileau moment du plan/apply - Connaître la priorité de surcharge entre les sources de valeurs
Prérequis
Section intitulée « Prérequis »- Terraform ≥ 1.11 installé (installer Terraform)
- Connaître les variables (variables Terraform)
L’idée derrière les fichiers tfvars
Section intitulée « L’idée derrière les fichiers tfvars »Pensez à un application classique avec un fichier de configuration :
# app/config.py — la STRUCTURE (types, defaults)DEBUG = FalseDATABASE_URL = "localhost"PORT = 8000
# config/dev.env — les VALEURS pour le dev (écrase les defaults)DEBUG = TrueDATABASE_URL = "dev-db"PORT = 3000
# config/prod.env — les VALEURS pour la prodDATABASE_URL = "prod-db"PORT = 443Terraform fait la même chose : variables.tf = structure, terraform.tfvars = valeurs pour l’env courant, prod.tfvars = autres valeurs pour prod.
Rôle d’un fichier tfvars
Section intitulée « Rôle d’un fichier tfvars »Un fichier .tfvars contient uniquement des assignations de valeurs
à des variables déclarées dans variables.tf. Il ne déclare pas de nouvelles
variables, il ne crée pas de ressources.
variables.tf ← déclarations (noms, types, defaults)terraform.tfvars ← valeurs concrètes (chargé automatiquement)Voici un exemple concret avec cette structure :
# terraform.tfvars — valeurs par défaut pour le lab local
vm_name = "lab02-vm"memory = 512vcpu = 1image_path = "/home/bob/images/ubuntu-24.04-cloudimg.img"pool = "default"Résultat lors du terraform plan :
+ name = "lab02-vm" + memory = 512 + vcpu = 1Le fichier terraform.tfvars
Section intitulée « Le fichier terraform.tfvars »Terraform charge automatiquement tout fichier nommé exactement
terraform.tfvars ou terraform.tfvars.json à la racine du répertoire de
travail. Aucun argument supplémentaire n’est nécessaire.
Structure d’une assignation :
# Scalairesvm_name = "mon-serveur"memory = 2048actif = true
# Listedns_servers = ["1.1.1.1", "8.8.8.8"]
# Maptags = { env = "dev" project = "mon-lab"}Fichiers par environnement
Section intitulée « Fichiers par environnement »Pour distinguer dev, staging et prod, créez un fichier par environnement :
projet/├── main.tf├── variables.tf├── outputs.tf├── terraform.tfvars ← valeurs locales/dev (chargé automatiquement)├── dev.tfvars ← si dev ≠ terraform.tfvars├── staging.tfvars└── prod.tfvarsExemple :
vm_name = "dev-vm"memory = 512vcpu = 1image_path = "/home/bob/images/ubuntu-24.04-cloudimg.img"pool = "default"vm_name = "prod-vm"memory = 4096vcpu = 4image_path = "/data/images/ubuntu-24.04-cloudimg.img"pool = "ssd-pool"Charger un fichier avec -var-file
Section intitulée « Charger un fichier avec -var-file »Pour utiliser un fichier autre que terraform.tfvars, passez -var-file :
terraform plan -var-file="prod.tfvars"terraform apply -var-file="prod.tfvars"Le plan montre alors les valeurs de prod :
+ name = "prod-vm" + memory = 4096 + vcpu = 4Plusieurs fichiers peuvent être cumulés (le dernier gagne en cas de conflit) :
terraform apply \ -var-file="common.tfvars" \ -var-file="prod.tfvars"Les fichiers *.auto.tfvars
Section intitulée « Les fichiers *.auto.tfvars »Tout fichier dont le nom se termine par .auto.tfvars (ou .auto.tfvars.json)
est chargé automatiquement, dans l’ordre alphabétique. Il s’ajoute aux
fichiers conventionnels terraform.tfvars et terraform.tfvars.json, eux aussi
chargés automatiquement.
terraform.tfvars ← chargé automatiquement si présentcommon.auto.tfvars ← chargé automatiquementnetwork.auto.tfvars ← chargé automatiquement après commonPriorité de surcharge
Section intitulée « Priorité de surcharge »Quand plusieurs sources fournissent la même variable, c’est la source la plus prioritaire qui gagne :
default (bloc variable) ↓ écrasé parTF_VAR_nom (variable d'environnement) ↓ écrasé parterraform.tfvars et terraform.tfvars.json ↓ écrasé par*.auto.tfvars et *.auto.tfvars.json (ordre alphabétique) ↓ écrasé par-var-file et -var (dans l'ordre des arguments, le dernier gagnant)Exemple pratique : si terraform.tfvars contient memory = 512 et qu’on
passe -var="memory=1024", le plan affiche :
~ memory = 512 -> 1024Fichiers tfvars et secrets
Section intitulée « Fichiers tfvars et secrets »Vérifier quelles valeurs seront utilisées
Section intitulée « Vérifier quelles valeurs seront utilisées »Avant d’appliquer, terraform plan affiche toutes les valeurs résolues.
Pour inspecter une variable spécifique dans les outputs :
terraform plan -out=tfplanterraform show -json tfplan | jq '.variables'À retenir
Section intitulée « À retenir »terraform.tfvarsest chargé automatiquement — pas besoin d’argument- Les fichiers
*.auto.tfvarssont aussi auto-chargés, dans l’ordre alphabétique -var-file="prod.tfvars"charge un fichier explicite pour un environnement- La priorité réelle :
default→TF_VAR_→terraform.tfvars→*.auto.tfvars→ options CLI - Ne jamais committer les fichiers tfvars contenant des secrets
- Un fichier
.tfvarsne contient que des assignations, pas de déclarations