Exercice 04 : Créer et utiliser des modules réutilisables
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer un module Terraform dans
modules/ - ✅ Appeler un module avec
module "nom" { source = "./modules/..." } - ✅ Passer des variables et récupérer les outputs d'un module
- ✅ Utiliser
terraform getpour télécharger les modules distants
Durée estimée : 25 minutes
Difficulté : ⭐⭐⭐⭐☆ (Intermédiaire+)
Prérequis : Terraform installé, exercices 01-03 terminés
📖 Contexte
Les modules sont les blocs de construction réutilisables de Terraform. Un module est simplement un dossier contenant des fichiers .tf. En le paramétrant via des variables et en exposant des outputs, on peut l'instancier plusieurs fois avec des configurations différentes - exactement comme une fonction dans un langage de programmation.
📋 Énoncé
Vous allez créer un module docker-container qui encapsule la création d'un conteneur Docker, puis l'instancier deux fois pour déployer deux applications différentes.
Résultat attendu :
- Un module réutilisable dans
modules/docker-container/ - Deux instances du module avec des configurations différentes
🧭 Déroulement de l'exercice
Tâche 1 : Créer la structure du module
Créez le dossier modules/docker-container/ avec les fichiers main.tf, variables.tf et outputs.tf.
Indice : La convention est de mettre ces trois fichiers dans chaque module.
main.tfcontient les ressources du module.
Vérification : ls modules/docker-container/ liste les trois fichiers.
Tâche 2 : Définir les ressources du module
Dans modules/docker-container/main.tf, déclarez la ressource docker_container sans le bloc terraform ni provider (hérités du module parent).
Indice : Un module enfant n'a pas de bloc
terraform {}ni de déclarationprovider. Il reçoit le provider de son parent.
Vérification : terraform validate dans le dossier parent retourne Success!.
Tâche 3 : Définir les variables du module
Dans modules/docker-container/variables.tf, déclarez les variables que le module expose : name, image, port.
Indice : Les variables sans
defaultsont obligatoires lors de l'appel du module.
Vérification : terraform validate retourne Success!.
Tâche 4 : Appeler le module deux fois
Dans main.tf du projet racine, appelez le module deux fois avec des paramètres différents : une instance pour web (nginx) et une pour api (httpd).
Indice :
module "web" { source = "./modules/docker-container"; name = "web"; ... }
Vérification : terraform plan affiche la création de 2 conteneurs.
Tâche 5 : Récupérer les outputs du module
Ajoutez des outputs dans modules/docker-container/outputs.tf et référencez-les depuis le module racine avec module.web.container_id.
Indice : Les outputs d'un module enfant sont accessibles via
module.nom_instance.nom_output.
Vérification : terraform apply puis terraform output affiche les IDs des deux conteneurs.
🗂️ Mini-Projet : Structure de projet modulaire
projet-modules/
├── main.tf # appels des modules
├── variables.tf
├── outputs.tf
└── modules/
└── docker-container/
├── main.tf # ressources du module
├── variables.tf # interface du module
└── outputs.tf # sorties du module# main.tf (racine)
module "web" {
source = "./modules/docker-container"
name = "nginx-web"
image = "nginx:1.25"
port = 8080
}
module "api" {
source = "./modules/docker-container"
name = "apache-api"
image = "httpd:2.4"
port = 8081
}Checkpoints :
terraform validateretourneSuccess!avec les deux instances du moduleterraform planaffiche la création de 2docker_containeret 2docker_imageterraform applycrée les deux conteneursterraform outputaffiche les outputs des deux modules (module.web.*,module.api.*)- Modifier uniquement
module "web"→terraform plann'affecte que le conteneur web