Aller au contenu

Module 6 — Les modules

Durée indicative du cours : 1 h 30
Durée indicative de l’atelier : atelier du jour 3, partagé avec le module 5
Durée totale (cours + atelier) : le jour 3 réunit les modules 5 et 6 et l’atelier du jour

Ce module couvre les objectifs 5a à 5d. Un module est un dossier de fichiers .tf que l’on appelle. Le collègue réutilise la fiche sans copier ses blocs.

D’où vient un module

Le bloc module a un nom local et une source.

  • Un chemin relatif, ./modules/fiche, est un module local. C’est le premier pas du fil.
  • Une adresse du registre, namespace/nom/provider, est un module publié.
  • Une URL git peut aussi être une source. Le registre reste le cas de l’examen pour une source distante.
module "fiche" {
  source = "./modules/fiche"
  nom    = var.nom
}

terraform init installe les modules et les enregistre. Vous relancez init quand la source ou la version change. terraform get met à jour les modules déjà connus.

Le dossier appelant est la racine. Le dossier appelé est le module enfant. La racine est elle-même un module, le module racine.

Ce qui entre, ce qui sort

Les variables du module enfant ne sont pas celles de la racine. Rien ne passe tout seul. Vous affectez chaque entrée dans le bloc module. Vous lisez chaque sortie avec module.NOM.output.

# modules/fiche/variables.tf
variable "nom" {
  type = string
}

# modules/fiche/outputs.tf
output "chemin" {
  value = local_file.fiche_environnement.filename
}

# racine
output "chemin_fiche" {
  value = module.fiche.chemin
}

Une variable sans default est obligatoire. L’appelant doit la fournir. Une variable du parent qui porte le même nom n’est pas visible dans l’enfant. C’est le périmètre que l’examen demande : la portée s’arrête à la frontière du module.

Les ressources de l’enfant n’ont pas à être citées depuis la racine. Si la racine a besoin d’un attribut, l’enfant le publie dans un output. C’est le contrat.

Composer

Un module peut en appeler un autre. Vous le faites quand une responsabilité tient dans un dossier : ici, produire le suffixe et écrire la fiche. La racine garde les variables d’équipe et les outputs que le collègue consulte.

Vous évitez un module qui ne contient qu’une ressource sans entrée ni sortie utiles. Vous évitez aussi une racine qui recopie le même bloc pour chaque environnement. L’environnement change par les variables, pas par une copie des fichiers .tf.

Versionner

Un module local n’a pas d’argument version. Il suit le dépôt. Un module du registre, ou une source qui le permet, se fige avec version.

module "exemple_registre" {
  source  = "hashicorp/dir/template"
  version = "~> 1.0"
}

La contrainte ~> accepte les correctifs de la même mineure et refuse la mineure suivante, selon le nombre de composantes que vous avez écrites. Sans version, un init ultérieur peut prendre une version plus récente et changer le comportement. Dans un dépôt partagé, vous écrivez la contrainte.

Le lockfile des providers ne remplace pas cette contrainte de module. Chacun fige son propre objet.

Ce que vous faites sur le fil

  1. Créer le dossier modules/fiche.
  2. Y déplacer la ressource local_file et le random_id si le suffixe fait partie du contrat.
  3. Exposer nom en variable et chemin en output.
  4. Appeler le module depuis la racine.
  5. Lancer terraform init, puis un plan. Le plan peut proposer un déplacement. Le bloc moved du module 4 évite alors une destruction suivie d’une création.
  6. Changer la contrainte de version seulement quand la source est distante, puis relancer init.

Ce que l’examen veut pour ce module

Objectif Vous devez pouvoir l’expliquer
5a La source peut être un dossier local, le registre, ou une autre adresse acceptée par Terraform
5b Les variables de l’enfant ne voient pas celles du parent. On les passe dans le bloc module
5c On appelle un module par son bloc. On lit ses sorties par module.nom.output
5d version fige un module distant. Un module local suit le dépôt

Points à retenir

  • init après un changement de source ou de version.
  • Le contrat d’un module, ce sont ses variables et ses outputs.
  • On ne duplique pas les .tf pour changer d’environnement. On change les valeurs.
  • moved accompagne un renommage quand le state connaît déjà l’objet sous l’ancienne adresse.

Suite

Poursuivre avec le module 7 — Les données sensibles.