Exercice 02 : Utiliser les locals et les data sources
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Déclarer des valeurs calculées avec
locals {} - ✅ Référencer des ressources existantes avec
data "type" "nom" {} - ✅ Distinguer
resource(créer/gérer) dedata(lire uniquement) - ✅ Utiliser
terraform refreshpour synchroniser le state
Durée estimée : 20 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis : Terraform installé, Docker en cours d'exécution, exercice 01 terminé
📖 Contexte
Les locals permettent d'éviter la répétition de valeurs calculées dans la configuration. Les data sources permettent de référencer une ressource existante (créée hors Terraform, ou dans un autre projet Terraform) sans la recréer. Ces deux mécanismes rendent la configuration plus propre et DRY.
📋 Énoncé
Vous allez centraliser les tags et noms communs dans des locals, puis utiliser une data source pour récupérer une image Docker déjà présente localement.
Résultat attendu :
- Configuration DRY grâce aux locals
- Référence à une image Docker existante via data source
🧭 Déroulement de l'exercice
Tâche 1 : Créer des locals simples
Dans locals.tf, définissez des locals project, environment, et name_prefix (concaténation des deux premiers).
Indice :
locals { name_prefix = "${local.project}-${local.environment}" }. Les locals se référencent aveclocal.xxx.
Vérification : terraform console puis local.name_prefix retourne la valeur attendue.
Tâche 2 : Créer un local de type map (tags communs)
Ajoutez un local common_tags de type map qui consolide les tags à appliquer à toutes les ressources.
Indice : Ce pattern "common_tags" est très répandu dans les projets Terraform AWS.
Vérification : terraform console puis local.common_tags affiche la map complète.
Tâche 3 : Utiliser les locals dans les ressources
Remplacez les valeurs hardcodées dans main.tf par des références aux locals (local.name_prefix, local.common_tags).
Indice : Pour itérer sur une map de tags, utilisez un bloc
dynamicou directement si le provider supportetags = local.common_tags.
Vérification : terraform plan utilise les valeurs des locals.
Tâche 4 : Créer une data source docker_image
Utilisez une data source pour référencer l'image nginx:1.25 déjà présente localement (sans la télécharger avec resource).
Indice :
data "docker_image" "nginx" { name = "nginx:1.25" }. Référence avecdata.docker_image.nginx.id.
Vérification : terraform plan ne montre pas de + pour l'image (elle existe déjà).
Tâche 5 : Comprendre terraform refresh
Supprimez manuellement une ressource directement dans Docker (docker rm -f ...), puis lancez terraform refresh et observez la divergence avec le state.
Indice :
terraform refreshmet à jour le state en interrogeant l'état réel.terraform planensuite détecte la ressource manquante et propose de la recréer.
Vérification : Après refresh, terraform plan affiche + pour la ressource supprimée manuellement.
🗂️ Mini-Projet : Configuration DRY complète
# locals.tf
locals {
project = "devops-demo"
environment = var.environment
name_prefix = "${local.project}-${local.environment}"
common_tags = {
Project = local.project
Environment = local.environment
ManagedBy = "terraform"
CreatedAt = "2026-04"
}
container_name = "${local.name_prefix}-web"
image_name = "nginx:${var.nginx_version}"
}# main.tf avec data source
data "docker_image" "base_nginx" {
name = local.image_name
}
resource "docker_container" "web" {
name = local.container_name
image = data.docker_image.base_nginx.id
ports {
internal = 80
external = var.external_port
}
}Checkpoints :
terraform console:local.name_prefixretourne"devops-demo-dev"terraform console:local.common_tagsaffiche la map complètedata "docker_image"ne recrée pas l'image si elle existe déjà localementterraform planmontre 0 changement pour les data sources (lecture seule)- Supprimer le conteneur +
terraform refresh+terraform plan→ le conteneur est à recréer