
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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Déclarer une variable : bloc
variable {}, type, valeur par défaut - Utiliser une variable : la référence
var.nomdans 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
Prérequis
Section intitulée « Prérequis »- Terraform ≥ 1.11 installé (installer Terraform)
- Compréhension du workflow init/plan/apply (le workflow Terraform)
L’idée derrière les variables
Section intitulée « L’idée derrière les variables »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 fonctiondeploy_vm("dev-vm", 512, 1) # devdeploy_vm("prod-vm", 2048, 4) # prodLes 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.
Déclarer une variable
Section intitulée « Déclarer une variable »Une variable se déclare avec le bloc variable. Placez-les dans 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 :
| Attribut | Rôle | Obligatoire |
|---|---|---|
description | Documentation de la variable | Non, mais recommandé |
type | Contrainte de type | Non, mais recommandé |
default | Valeur utilisée si non fournie | Non — sans default, la variable est obligatoire |
Utiliser une variable dans une ressource
Section intitulée « Utiliser une variable dans une ressource »On accède à une variable avec var.nom :
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.
Types disponibles
Section intitulée « Types disponibles »Types primitifs
Section intitulée « Types primitifs »variable "nom" { type = string } # "ubuntu-vm"variable "memoire" { type = number } # 2048variable "actif" { type = bool } # true ou falseTypes complexes
Section intitulée « Types complexes »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" }}Valider les valeurs
Section intitulée « Valider les valeurs »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.
Fournir des valeurs au runtime
Section intitulée « Fournir des valeurs au runtime »Option 1 — Fichier .tfvars (recommandé)
Section intitulée « Option 1 — Fichier .tfvars (recommandé) »# terraform.tfvars ← chargé automatiquement par Terraformvm_name = "lab02-vm"memory = 512vcpu = 1image_path = "/home/bob/images/ubuntu-24.04-cloudimg.img"pool = "default"Pour un fichier nommé différemment :
terraform plan -var-file="prod.tfvars"Option 2 — Argument -var
Section intitulée « Option 2 — Argument -var »terraform apply -var="memory=1024"Le plan résultant montre la modification :
~ memory = 512 -> 1024Option 3 — Variable d’environnement
Section intitulée « Option 3 — Variable d’environnement »export TF_VAR_vm_name="lab02-vm-ci"terraform applyPriorité de surcharge
Section intitulée « Priorité de surcharge »default → TF_VAR_ → terraform.tfvars → *.auto.tfvars → options CLIEntre -var-file et -var, le dernier argument fourni gagne.
Variables sensibles
Section intitulée « Variables sensibles »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)Structure recommandée
Section intitulée « Structure recommandée »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À retenir
Section intitulée « À retenir »variable {}dansvariables.tfdéclare une entrée paramétrée- On y accède avec
var.nomdans n’importe quel fichier.tfdu module type+descriptionsont recommandés même si non obligatoires- Sans
default, la variable est obligatoire à chaqueplan validationdétecte les erreurs avant tout appel providersensitive = truemasque la valeur dans tous les affichagesterraform.tfvarsest chargé automatiquement — ne jamais le committer avec des secrets