Aller au contenu
English
English
Infrastructure as Code medium

Terragrunt : catalogues, scaffold et industrialisation

11 min de lecture

logo terragrunt

Comment ajouter rapidement une nouvelle unit Terragrunt sans repartir d'un fichier vide et sans que chaque membre de l'équipe invente sa propre structure ? C'est le role de catalog et scaffold. Ce guide vous montre comment les utiliser pour standardiser la création de nouvelles units.

  • Comprendre la différence entre catalog (découverte de modules) et scaffold (génération d'une unit)
  • Générer un terragrunt.hcl propre a partir d'un module avec scaffold
  • Configurer les garde-fous --no-hooks et --no-shell pour une génération sûre
  • Industrialiser le pattern avec un dépôt catalogue dédié

Pensez a un magasin de pieces detachees : catalog est le catalogue ou vous feuilletez les references disponibles, et scaffold est le bon de commande qui genere la fiche technique de la pièce choisie.

CommandeRoleQuand l'utiliser
catalogParcourir et sélectionner un module dans une TUIDécouvrir les modules approuves par l'équipe
scaffoldGénérer un terragrunt.hcl pre-rempli a partir d'un moduleCréer une nouvelle unit sans partir de zero

Ces deux commandes ne servent pas a centraliser vos conventions existantes (root.hcl, remote_state, generate). Elles servent a standardiser la création de nouvelles units qui respecteront ensuite ces conventions.

Si votre objectif est de factoriser ce qui est commun a toutes les units, catalog et scaffold ne sont pas le bon premier outil.

Ils ne servent pas a :

  • remplacer un root.hcl partage ;
  • centraliser un backend via remote_state ;
  • écrire automatiquement vos blocs generate existants dans tout le repo ;
  • refactorer des units déjà presentes.

Ils servent a autre chose : préparer proprement une nouvelle unit qui respectera ensuite vos conventions racines.

L'exemple repose sur deux répertoires :

  • Répertoireterragrunt-catalog-repo/
    • Répertoiremodules/
      • Répertoiremysql/
        • main.tf
  • Répertoireterragrunt-consumer/
    • Répertoirelive/
      • root.hcl
      • Répertoiredev/
        • Répertoiremysql/
          • …

Le premier dépôt joue le role de catalogue de modules. Le second dépôt joue le role de repo consommateur dans lequel on veut générer une nouvelle unit.

Dans terragrunt-catalog-repo/modules/mysql/main.tf, placez ce module minimal :

terraform {
required_version = ">= 1.6.0"
}
variable "name" {
description = "Database name"
type = string
}
variable "instance_class" {
description = "Instance class"
type = string
}
variable "storage_gib" {
description = "Allocated storage in GiB"
type = number
default = 20
}

Ce module est volontairement petit. L'objectif n'est pas de déployer une base MySQL complète, mais de vérifier ce que scaffold déduit vraiment d'un module :

  • les variables obligatoires ;
  • les variables optionnelles ;
  • une structure de terragrunt.hcl pre-remplie.

Avant de lancer scaffold, vous devez avoir :

  • Terragrunt 1.0.0 installe ;
  • OpenTofu ou Terraform disponible ;
  • un dépôt catalogue initialisé avec Git ;
  • un repo consommateur avec au moins un root.hcl minimal.

Vous pouvez garder un root.hcl très simple dans le repo consommateur :

locals {
environment = "dev"
}

Dans le dossier terragrunt-catalog-repo, initialisezt un dépôt Git :

Fenêtre de terminal
git init
git add .
git commit -m "Initialise le catalogue de modules"

Verification : git status doit indiquer un dépôt propre avant de passer a l'étape suivante.

Cette etape compte vraiment. Dans cet exemple, scaffold fonctionne bien sur un dépôt Git local. C'est aussi la forme la plus proche d'un vrai dépôt de catalogue d'equipe.

Etape 2 : générer une nouvelle unit avec scaffold

Section intitulée « Etape 2 : générer une nouvelle unit avec scaffold »

Placez-vous dans terragrunt-consumer/live puis lancez :

Fenêtre de terminal
terragrunt scaffold ../terragrunt-catalog-repo//modules/mysql \
--output-folder dev/mysql \
--root-file-name root.hcl \
--non-interactive \
--no-hooks \
--no-shell

Le résultat attendu est la création du fichier dev/mysql/terragrunt.hcl.

Les options importantes sont les suivantes :

  • --output-folder indique ou écrire la nouvelle unit ;
  • --root-file-name root.hcl aligne la génération sur la convention de ce repo ;
  • --no-hooks et --no-shell évitent l'exécution implicite de templates actifs ;
  • --non-interactive rend la commande reproductible et plus proche d'un usage automatise.

Dans cet exemple, scaffold produit un fichier de cette forme :

# This is a Terragrunt unit generated by Gruntwork Boilerplate (https://github.com/gruntwork-io/boilerplate).
terraform {
source = "file:///.../terragrunt-catalog-repo//modules/mysql"
}
include "root" {
path = find_in_parent_folders("root.hcl")
}
inputs = {
# --------------------------------------------------------------------------------------------------------------------
# Required input variables
# --------------------------------------------------------------------------------------------------------------------
# Description: Database name
# Type: string
name = "" # TODO: fill in value
# Description: Instance class
# Type: string
instance_class = "" # TODO: fill in value
# --------------------------------------------------------------------------------------------------------------------
# Optional input variables
# Uncomment the ones you wish to set
# --------------------------------------------------------------------------------------------------------------------
# Description: Allocated storage in GiB
# Type: number
# storage_gib = 20
}

Ce point est le coeur du guide : Terragrunt lit les variables du module et genere une unit déjà structurée, au lieu de vous laisser repartir d'un fichier vide.

Etape 4 : comprendre ce que scaffold apporte vraiment

Section intitulée « Etape 4 : comprendre ce que scaffold apporte vraiment »

Le gain n'est pas seulement d'écrire moins vite un fichier. Le vrai gain est de standardiser trois choses :

  • la forme du terragrunt.hcl genere ;
  • l'inclusion racine du repo ;
  • la visibilité des variables du module, avec types et descriptions.

Autrement dit, scaffold sert moins a faire gagner dix secondes qu'a éviter que chaque nouvelle unit commence avec une structure différente.

La commande terragrunt catalog lance une TUI pour parcourir un catalogue de modules. Son role n'est pas de générer des fichiers directement en batch, mais de rendre la découverte plus simple :

  • recherche et filtrage dans les modules ;
  • affichage de la documentation du module selectionne ;
  • lancement de scaffold quand vous validez un module.

En pratique, catalog est donc une couche de navigation au-dessus du même mecanisme de génération.

Terragrunt permet de déclarer des URLs de catalogue dans la configuration racine. Un exemple minimal ressemble a ceci :

catalog {
urls = [
"../terragrunt-catalog-repo",
]
no_shell = true
no_hooks = true
}

Avec ce type de configuration, vous pouvez ensuite lancer :

Fenêtre de terminal
terragrunt catalog --root-file-name root.hcl

La TUI cherchera alors les modules dans les URLs configurées, ou a défaut dans le dossier courant selon les règles de découverte de Terragrunt.

Une fois le mecanisme compris, trois leviers deviennent utiles pour une équipe :

LevierA quoi il sert
Dépôt catalogue dédiéCentraliser les modules que l'équipe est autorisée a utiliser
.boilerplate dans un moduleFournir un template de unit plus riche que le template par défaut
default_template dans catalogImposer un rendu standard pour plusieurs modules

Le template integre suffit pour debuter. Les templates personnalisés deviennent interessants quand vous voulez ajouter automatiquement :

  • une structure de dossier plus riche ;
  • des conventions d'include ;
  • des blocs d'inputs plus opinionated ;
  • des fichiers annexes générés a côté du terragrunt.hcl.
  1. Créer le dépôt catalogue et le committer

    Verification : le module modules/mysql/main.tf existe dans un dépôt Git propre.

  2. Créer un repo consommateur avec live/root.hcl

    Verification : root.hcl est bien present avant la génération.

  3. Lancer terragrunt scaffold avec un dossier de sortie dédié

    Verification : dev/mysql/terragrunt.hcl apparaît.

  4. Relire les inputs générés

    Verification : les variables obligatoires sont decommentées, les optionnelles sont commentees.

  5. Activer ensuite catalog seulement si vous avez besoin de navigation

    Verification : vous savez que catalog est une couche TUI autour de scaffold, pas un remplacement.

SymptômeCause probableSolution
scaffold écrit au mauvais endroitAucun --output-folder clairToujours cibler un dossier de sortie explicite
Le fichier genere inclut terragrunt.hcl au lieu de root.hclNom de racine par défautAjouter --root-file-name root.hcl
Le template essaye d'exécuter des actions localesHooks ou shell activesAjouter --no-hooks --no-shell
L'équipe genere des units incoherentesChacun part d'un fichier videImposer scaffold comme point d'entrée standard
Le catalogue n'affiche pas les bons reposURLs absentes ou mauvaise racine de rechercheDéclarer catalog.urls ou lancer catalog depuis le bon dossier
  • catalog sert surtout a parcourir un catalogue de modules dans une TUI.
  • scaffold sert a générer un terragrunt.hcl a partir d'un module ou d'un template.
  • Le flux le plus robuste pour une équipe est souvent : dépôt catalogue Git + scaffold + conventions de sécurité.
  • --root-file-name root.hcl permet d'aligner la génération sur un repo Terragrunt moderne.
  • --no-hooks et --no-shell sont de bons garde-fous quand vous ne voulez pas exécuter de templates actifs.

Nous sommes arrives a la fin de la formation Terragrunt !

D'autres sujets peuvent vous interesser pour aller plus loin :

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn