Aller au contenu

GUIDE TECHNIQUE · TERRAFORM

Terraform : créer des modules avec variables et outputs

Construire un module Terraform réutilisable avec main.tf, variables.tf et outputs.tf, l’appeler depuis un module racine, puis contrôler ses entrées, ses sorties et son comportement. Exemple local sans dépense cloud.

Niveau Intermédiaire6 min de lecture— vuesTerraform

L’ESSENTIEL EN BREF

Les étapes clés

Ce guide présente 6 étapes, de « Choisir une abstraction utile, pas un empilement de modules » à « Préparer un module maintenable et versionné ».

Avant de commencer : Avoir exécuté les principales commandes init, plan et apply et compris le rôle du state.

01 · CADRAGE

Périmètre et résultat visé

Résultat attendu : Les fichiers main.tf, variables.tf et outputs.tf sont séparés et compréhensibles.

Public concerné : Ingénieurs DevOps, administrateurs cloud, platform engineers et responsables de standards IaC

Environnement et versions

Terraform CLI 1.5 ou version ultérieure compatible ; exemple avec la ressource intégrée terraform_data et un module local. Les principes se transfèrent ensuite aux providers cloud.

Contrôlez les versions, les droits et les options disponibles dans votre environnement avant de suivre la procédure.

02 · AVANT DE COMMENCER

Prérequis et points de contrôle

  • Avoir exécuté les principales commandes init, plan et apply et compris le rôle du state.
  • Disposer d’un répertoire de recette séparé avec Terraform CLI compatible.
  • Pouvoir créer l’arborescence de fichiers modules/naming/.
  • Connaître les concepts de variable, ressource et output dans HCL.

03 · VUE D’ENSEMBLE

Comprendre l’architecture et les flux

ARCHITECTURE TECHNIQUEComprendre la chaîne de bout en bout
01Module racine
02Inputs service / env
03Module naming
04Ressource terraform_data
05Output fullname
06Consommateur
Le module racine appelle un module enfant local avec des variables typées. Le module enfant fournit une sortie explicite ; aucune ressource cloud réelle n’est créée dans cet exercice.

04 · TUTORIEL

Procédure complète, étape par étape

Suivez les étapes dans l’ordre et contrôlez chaque résultat avant de poursuivre. Renseignez les paramètres adaptés à votre environnement.

01

ÉTAPE 1 / 6

Choisir une abstraction utile, pas un empilement de modules

Un module n’est pertinent que s’il encapsule une responsabilité reproductible avec un contrat d’entrée et de sortie stable.

  1. Utiliser un petit exemple de convention de nommage pour apprendre l’interface, sans le présenter comme un module cloud complet.
  2. Créer les répertoires du module et du projet racine.
  3. Prévoir main.tf, variables.tf, outputs.tf et un README dans le module.
Exemple techniqueÀ adapter à votre environnement
mkdir -p terraform-modules-lab/modules/naming
cd terraform-modules-lab
find . -maxdepth 3 -type d
Ce qui se passe à cette étape
1Racine
2Module enfant
3Contrat

À vérifier : Une arborescence racine / modules/naming existe.

Point de vigilance : Pour la production, un module utile encapsule une vraie capacité technique ; évitez de publier des wrappers triviaux.

02

ÉTAPE 2 / 6

Déclarer des variables typées et des validations

Une interface explicite évite de mélanger valeurs de configuration, secrets et conventions implicites.

  1. Dans modules/naming/variables.tf, déclarer le service et l’environnement.
  2. Refuser les valeurs vides pour le service.
  3. Documenter le sens de chaque entrée dans le README du module.
Exemple techniqueÀ adapter à votre environnement
# modules/naming/variables.tf
variable "service" {
  description = "Nom court du service"
  type        = string
  validation {
    condition     = length(trimspace(var.service)) > 0
    error_message = "Le nom du service est obligatoire."
  }
}
variable "environment" {
  description = "Environnement cible"
  type        = string
}
Ce qui se passe à cette étape
1Inputs
2Validation
3Contrat

À vérifier : Le contrat du module expose deux inputs typés.

Point de vigilance : Ne placez jamais un mot de passe en valeur par défaut dans un module partagé.

03

ÉTAPE 3 / 6

Implémenter le module et son output

Le corps du module calcule une valeur et expose uniquement ce que le consommateur doit connaître.

  1. Créer le fichier main.tf de ce module enfant avec un local et une ressource de laboratoire.
  2. Créer outputs.tf pour retourner le résultat.
  3. Conserver la configuration des providers dans le module racine dans les projets cloud réels.
Exemple techniqueÀ adapter à votre environnement
# modules/naming/main.tf
locals {
  fullname = "${var.service}-${var.environment}"
}
resource "terraform_data" "identity" {
  input = local.fullname
}

# modules/naming/outputs.tf
output "fullname" {
  description = "Nom du service contextualisé"
  value       = terraform_data.identity.output
}
Ce qui se passe à cette étape
1Convention
2Ressource
3Output

À vérifier : Le module expose fullname par un output et ne contient pas de bloc provider.

Point de vigilance : Le préfixe de chemin # indique deux fichiers distincts : ne pas coller les deux blocs dans un seul fichier.

04

ÉTAPE 4 / 6

Appeler le module depuis la racine

La racine choisit les paramètres et peut composer plusieurs modules sans exposer leurs ressources internes.

  1. Créer main.tf à la racine et utiliser une source locale relative.
  2. Récupérer module.naming.fullname dans un output racine.
  3. Ne pas ajouter un attribut version : il n’est pas applicable à une source de module locale.
Exemple techniqueÀ adapter à votre environnement
# main.tf (racine)
terraform {
  required_version = ">= 1.5.0, < 2.0.0"
}
module "naming" {
  source      = "./modules/naming"
  service     = "api"
  environment = "recette"
}
output "service_name" {
  value = module.naming.fullname
}
Ce qui se passe à cette étape
1Racine
2Appel
3Valeur récupérée

À vérifier : Le module enfant est résolu localement et la racine expose service_name.

Point de vigilance : Après une modification de source ou de version de module, relancer terraform init.

05

ÉTAPE 5 / 6

Initialiser, valider et contrôler la réutilisation

Un module utile doit être vérifié à partir de son appelant, pas simplement parce que ses fichiers existent.

  1. Exécuter les contrôles depuis le répertoire racine ; lire le plan.
  2. Appliquer uniquement ce laboratoire, puis vérifier l’output API attendu.
  3. Changer environment en integration et relire le nouveau plan avant toute application.
Exemple techniqueÀ adapter à votre environnement
terraform init
terraform fmt -recursive
terraform validate
terraform plan
terraform apply
terraform output service_name
Ce qui se passe à cette étape
1Init
2Validation
3Réutilisation

À vérifier : L’output renvoie api-recette et la modification de l’environnement change la valeur projetée.

Point de vigilance : Sur une plateforme cloud, contrôlez aussi les IAM, les régions, les coûts et l’effet réel du plan.

06

ÉTAPE 6 / 6

Préparer un module maintenable et versionné

La réutilisation en équipe repose sur la documentation, les versions et une revue des breaking changes.

  1. Ajouter un README présentant objectif, inputs, outputs, exemples et limites.
  2. Définir la politique de version pour un registre de modules ; épingler une version validée côté appelant.
  3. Éviter les arbres de modules profondément imbriqués et tester les sorties à chaque évolution.
Exemple techniqueÀ adapter à votre environnement
# Exemple de source de registre à adapter :
# module "reseau" {
#   source  = "organisation/reseau/aws"
#   version = "1.2.3"
# }
Ce qui se passe à cette étape
1Documentation
2Version
3Revue

À vérifier : Le module dispose d’un contrat documenté et d’une stratégie de versionnement.

Point de vigilance : Les modules enfants réutilisables déclarent leurs required_providers mais ne configurent pas les provider blocks.

RÉFÉRENCES TECHNIQUES

Documentation officielle

Retrouvez les prérequis, les fonctionnalités et les versions prises en charge par Terraform. Vérifiez les commandes sur un environnement de test avant leur utilisation en production.

Consulter la documentation officielle

05 · RECETTE

Comment vérifier que tout fonctionne ?

Résultat attenduContrôles avant de considérer la procédure terminée
01

Les fichiers main.tf, variables.tf et outputs.tf sont séparés et compréhensibles.

02

terraform validate s’exécute depuis le module racine après init.

03

L’output service_name renvoie api-recette dans le laboratoire.

04

Un input vide service est rejeté par la validation au plan.

05

Une politique de versionnement et des exemples sont décrits avant diffusion.

06 · DIAGNOSTIC

Problèmes fréquents et résolution

Module not installed

Cause probable : Le chemin source a changé depuis la dernière initialisation

Que faire : Relancer terraform init depuis la racine.

Unsupported argument

Cause probable : Une variable n’est pas déclarée dans le module enfant

Que faire : Comparer les arguments de l’appel aux variables.tf du module enfant.

Reference to undeclared module

Cause probable : Nom d’appel différent de celui de l’output racine

Que faire : Utiliser module.naming.fullname et contrôler la déclaration module.

Erreur de version du provider

Cause probable : Contraintes incompatibles entre modules

Que faire : Vérifier required_providers, les contraintes et .terraform.lock.hcl.

07 · QUESTIONS PRATIQUES

Questions fréquentes

Un module Terraform est-il un dépôt Git ?

Non. C’est un ensemble de fichiers de configuration ; un module peut être local, dans Git ou publié dans un registre.

Faut-il une variable pour chaque attribut ?

Non. Exposez seulement les paramètres nécessaires ; trop d’options rend l’interface instable.

Peut-on configurer provider dans un module enfant ?

La configuration des providers se fait normalement au niveau du module racine ; les modules réutilisables déclarent leurs dépendances.

Quelle différence entre output et local ?

Un local n’est visible que dans son module ; un output expose une valeur aux appelants et à l’interface CLI.

AUTRES TECHNOLOGIES

Guides complémentaires

Tous les guides Terraform

VOTRE ENVIRONNEMENT

Besoin d’aller plus loin sur votre environnement ?

Infrastructure as Code, modules et gouvernance : échangeons sur la fiabilité et la sécurité de vos déploiements Terraform.

Échanger avec ADN Consulting

Pour aller plus loin