Exercice 01 : Variables avancées et validation
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Déclarer des variables de type
list,mapetobject - ✅ Ajouter des contraintes avec le bloc
validation {} - ✅ Protéger les variables sensibles avec
sensitive = true - ✅ Utiliser plusieurs fichiers de variables (
-var-file)
Durée estimée : 20 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis : Terraform installé, exercices débutant terminés
📖 Contexte
Les variables scalaires (string, number) ne suffisent pas pour des configurations complexes. Terraform supporte des types structurés (listes, maps, objets) et permet d'ajouter des validations pour détecter les erreurs de configuration avant même le plan.
📋 Énoncé
Vous allez refactoriser la configuration Docker de l'exercice débutant pour utiliser des types complexes et ajouter des validations qui empêchent des configurations invalides.
Résultat attendu :
- Variables structurées avec validation
- Gestion de plusieurs environnements via des fichiers de variables distincts
🧭 Déroulement de l'exercice
Tâche 1 : Créer une variable de type object
Remplacez les trois variables container_name, external_port et nginx_version par une seule variable container_config de type object.
Indice :
object({ name = string, port = number, image_tag = string })
Vérification : terraform validate retourne Success! et var.container_config.name est accessible.
Tâche 2 : Ajouter une variable de type map
Déclarez une variable environment_tags de type map(string) pour les tags de l'environnement.
Indice :
map(string)est un dictionnaire clé/valeur de strings. Dansterraform.tfvars:{ key = "value" }.
Vérification : terraform console puis var.environment_tags["env"] retourne la valeur.
Tâche 3 : Ajouter une validation
Ajoutez un bloc validation {} à la variable container_config qui vérifie que le port est entre 1024 et 65535.
Indice :
condition = var.container_config.port >= 1024 && var.container_config.port <= 65535
Vérification : Tester avec port = 80 → terraform plan retourne une erreur de validation.
Tâche 4 : Créer une variable sensitive
Ajoutez une variable db_password de type string avec sensitive = true.
Indice : Une variable
sensitive = truen'apparaît pas dans les logs ni dans la sortie du plan.
Vérification : terraform plan affiche (sensitive value) pour cette variable.
Tâche 5 : Utiliser -var-file pour plusieurs environnements
Créez dev.tfvars et prod.tfvars avec des valeurs différentes, et testez les deux plans.
Indice :
terraform plan -var-file=dev.tfvarsetterraform plan -var-file=prod.tfvars
Vérification : Les deux plans utilisent des valeurs différentes sans modifier aucun fichier.
🗂️ Mini-Projet : Configuration multi-conteneurs avec liste
# variables.tf
variable "containers" {
type = list(object({
name = string
image = string
port = number
}))
description = "Liste des conteneurs à créer"
default = [
{ name = "web", image = "nginx:1.25", port = 8080 },
{ name = "api", image = "httpd:2.4", port = 8081 }
]
validation {
condition = alltrue([
for c in var.containers : c.port >= 1024 && c.port <= 65535
])
error_message = "Tous les ports doivent être entre 1024 et 65535."
}
}
variable "db_password" {
type = string
description = "Mot de passe de la base de données"
sensitive = true
}Checkpoints :
terraform validateavec des ports valides retourneSuccess!terraform plan -var='containers=[{name="test",image="nginx:1.25",port=80}]'retourne une erreur de validationterraform plann'affiche pas la valeur dedb_password((sensitive value))terraform plan -var-file=dev.tfvarsutilise la config devterraform plan -var-file=prod.tfvarsutilise la config prod sans modifier de fichier