Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Fichiers tfvars : valeurs par environnement

9 min de lecture

logo terraform

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.

  • Comprendre le rôle des fichiers .tfvars par rapport aux variables
  • Utiliser terraform.tfvars chargé automatiquement par Terraform
  • Créer des fichiers par environnement : dev.tfvars, prod.tfvars
  • Charger un fichier avec -var-file au moment du plan/apply
  • Connaître la priorité de surcharge entre les sources de valeurs

Pensez à un application classique avec un fichier de configuration :

# app/config.py — la STRUCTURE (types, defaults)
DEBUG = False
DATABASE_URL = "localhost"
PORT = 8000
# config/dev.env — les VALEURS pour le dev (écrase les defaults)
DEBUG = True
DATABASE_URL = "dev-db"
PORT = 3000
# config/prod.env — les VALEURS pour la prod
DATABASE_URL = "prod-db"
PORT = 443

Terraform fait la même chose : variables.tf = structure, terraform.tfvars = valeurs pour l’env courant, prod.tfvars = autres valeurs pour prod.

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 = 512
vcpu = 1
image_path = "/home/bob/images/ubuntu-24.04-cloudimg.img"
pool = "default"

Résultat lors du terraform plan :

+ name = "lab02-vm"
+ memory = 512
+ vcpu = 1

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 :

# Scalaires
vm_name = "mon-serveur"
memory = 2048
actif = true
# Liste
dns_servers = ["1.1.1.1", "8.8.8.8"]
# Map
tags = {
env = "dev"
project = "mon-lab"
}

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.tfvars

Exemple :

dev.tfvars
vm_name = "dev-vm"
memory = 512
vcpu = 1
image_path = "/home/bob/images/ubuntu-24.04-cloudimg.img"
pool = "default"
prod.tfvars
vm_name = "prod-vm"
memory = 4096
vcpu = 4
image_path = "/data/images/ubuntu-24.04-cloudimg.img"
pool = "ssd-pool"

Pour utiliser un fichier autre que terraform.tfvars, passez -var-file :

Fenêtre de terminal
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 = 4

Plusieurs fichiers peuvent être cumulés (le dernier gagne en cas de conflit) :

Fenêtre de terminal
terraform apply \
-var-file="common.tfvars" \
-var-file="prod.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ésent
common.auto.tfvars ← chargé automatiquement
network.auto.tfvars ← chargé automatiquement après common

Quand plusieurs sources fournissent la même variable, c’est la source la plus prioritaire qui gagne :

default (bloc variable)
↓ écrasé par
TF_VAR_nom (variable d'environnement)
↓ écrasé par
terraform.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 -> 1024

Avant d’appliquer, terraform plan affiche toutes les valeurs résolues. Pour inspecter une variable spécifique dans les outputs :

Fenêtre de terminal
terraform plan -out=tfplan
terraform show -json tfplan | jq '.variables'
  1. terraform.tfvars est chargé automatiquement — pas besoin d’argument
  2. Les fichiers *.auto.tfvars sont aussi auto-chargés, dans l’ordre alphabétique
  3. -var-file="prod.tfvars" charge un fichier explicite pour un environnement
  4. La priorité réelle : defaultTF_VAR_terraform.tfvars*.auto.tfvars → options CLI
  5. Ne jamais committer les fichiers tfvars contenant des secrets
  6. Un fichier .tfvars ne contient que des assignations, pas de déclarations

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn