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

Variables Terraform : paramétrer vos configurations

9 min de lecture

logo terraform

Vous avez écrit votre première configuration Terraform, mais le nom de la VM, la taille du disque et l’image sont en dur dans main.tf. Pour utiliser la même configuration en dev et en prod, vous dupliquez le fichier en changeant trois valeurs — et vous maintenez deux bases de code similaires.

Les variables résolvent ce problème. Un bloc variable {} déclare un paramètre avec son type et sa valeur par défaut. La référence var.nom dans le code remplace la valeur en dur. À l’exécution, Terraform peut charger la valeur depuis une variable d’environnement, un fichier .tfvars ou une option de ligne de commande. Le résultat : une seule configuration, des dizaines de déploiements différents. Le bloc validation ajoute un garde-fou — il rejette une valeur invalide avec un message clair avant même le plan.

  • Déclarer une variable : bloc variable {}, type, valeur par défaut
  • Utiliser une variable : la référence var.nom dans les ressources
  • Typer et valider : string, number, bool, list, map et bloc validation
  • Fournir les valeurs : terraform.tfvars, -var, TF_VAR_
  • Marquer une variable sensible : masquer les secrets dans les logs

Pensez à une fonction classique :

def deploy_vm(vm_name, memory, vcpu):
create_vm(name=vm_name, memory=memory, vcpu=vcpu)
# Appels différents sans dupliquer la fonction
deploy_vm("dev-vm", 512, 1) # dev
deploy_vm("prod-vm", 2048, 4) # prod

Les variables Terraform font exactement cela : au lieu de copier du code, vous paramétrez. Vous écrivez une configuration une fois, puis la réutilisez pour dev, staging, prod en passant des valeurs différentes.

Une variable se déclare avec le bloc variable. Placez-les dans variables.tf :

variables.tf
variable "vm_name" {
description = "Nom de la VM libvirt"
type = string
default = "lab02-vm"
validation {
condition = can(regex("^[a-z0-9-]+$", var.vm_name))
error_message = "Le nom de VM ne peut contenir que des minuscules, des chiffres et des tirets."
}
}
variable "memory" {
description = "RAM allouée en MiB"
type = number
default = 512
validation {
condition = var.memory >= 256 && var.memory <= 16384
error_message = "La mémoire doit être comprise entre 256 et 16384 MiB."
}
}
variable "vcpu" {
description = "Nombre de vCPUs"
type = number
default = 1
}

Trois attributs courants :

AttributRôleObligatoire
descriptionDocumentation de la variableNon, mais recommandé
typeContrainte de typeNon, mais recommandé
defaultValeur utilisée si non fournieNon — sans default, la variable est obligatoire

On accède à une variable avec var.nom :

main.tf
resource "libvirt_domain" "vm" {
name = var.vm_name
memory = var.memory
memory_unit = "MiB"
vcpu = var.vcpu
# ...
}

Lors du terraform plan, Terraform substitue les valeurs. Si une variable n’a pas de default et n’est pas fournie, Terraform la demande en interactif.

variable "nom" { type = string } # "ubuntu-vm"
variable "memoire" { type = number } # 2048
variable "actif" { type = bool } # true ou false
variable "dns_servers" {
type = list(string)
default = ["1.1.1.1", "8.8.8.8"]
}
variable "tags" {
type = map(string)
default = {
env = "dev"
project = "mon-lab"
}
}

Le bloc validation vérifie la valeur avant d’appeler le provider. Résultat si la condition échoue :

│ Error: Invalid value for variable
│ on variables.tf line 1:
│ 1: variable "vm_name" {
│ ├────────────────
│ │ var.vm_name is "INVALID_NAME"
│ Le nom de VM ne peut contenir que des minuscules, des chiffres et des tirets.
│ This was checked by the validation rule at variables.tf:6,3-13.

Cette erreur apparaît dès le plan, sans contact réseau ni appel à libvirt.

# terraform.tfvars ← chargé automatiquement par Terraform
vm_name = "lab02-vm"
memory = 512
vcpu = 1
image_path = "/home/bob/images/ubuntu-24.04-cloudimg.img"
pool = "default"

Pour un fichier nommé différemment :

Fenêtre de terminal
terraform plan -var-file="prod.tfvars"
Fenêtre de terminal
terraform apply -var="memory=1024"

Le plan résultant montre la modification :

~ memory = 512 -> 1024
Fenêtre de terminal
export TF_VAR_vm_name="lab02-vm-ci"
terraform apply
default → TF_VAR_ → terraform.tfvars → *.auto.tfvars → options CLI

Entre -var-file et -var, le dernier argument fourni gagne.

Pour masquer une valeur dans tous les logs et plans :

variable "db_password" {
description = "Mot de passe de la base"
type = string
sensitive = true
}

Terraform affichera :

+ password = (sensitive value)
mon-projet/
├── main.tf ← ressources libvirt_domain, libvirt_volume
├── variables.tf ← tous les blocs variable {}
├── outputs.tf ← blocs output {}
├── locals.tf ← blocs locals {}
├── terraform.tfvars ← valeurs concrètes (dans .gitignore)
└── versions.tf ← terraform {} avec required_providers
  1. variable {} dans variables.tf déclare une entrée paramétrée
  2. On y accède avec var.nom dans n’importe quel fichier .tf du module
  3. type + description sont recommandés même si non obligatoires
  4. Sans default, la variable est obligatoire à chaque plan
  5. validation détecte les erreurs avant tout appel provider
  6. sensitive = true masque la valeur dans tous les affichages
  7. terraform.tfvars est chargé automatiquement — ne jamais le committer avec des secrets

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