Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

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’equipe invente sa propre structure ? C’est le role de catalog et scaffold. Ce guide vous montre comment les utiliser pour standardiser la creation de nouvelles units.

  • Comprendre la difference entre catalog (decouverte de modules) et scaffold (generation d’une unit)
  • Generer un terragrunt.hcl propre a partir d’un module avec scaffold
  • Configurer les garde-fous --no-hooks et --no-shell pour une generation sure
  • Industrialiser le pattern avec un depot catalogue dedie

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 piece choisie.

CommandeRoleQuand l’utiliser
catalogParcourir et selectionner un module dans une TUIDecouvrir les modules approuves par l’equipe
scaffoldGenerer un terragrunt.hcl pre-rempli a partir d’un moduleCreer 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 creation 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 ;
  • ecrire automatiquement vos blocs generate existants dans tout le repo ;
  • refactorer des units deja presentes.

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

L’exemple repose sur deux repertoires :

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

Le premier depot joue le role de catalogue de modules. Le second depot joue le role de repo consommateur dans lequel on veut generer 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 deployer une base MySQL complete, mais de verifier ce que scaffold deduit 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 depot catalogue initialisé avec Git ;
  • un repo consommateur avec au moins un root.hcl minimal.

Vous pouvez garder un root.hcl tres simple dans le repo consommateur :

locals {
environment = "dev"
}

Dans le dossier terragrunt-catalog-repo, initialisezt un depot Git :

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

Verification : git status doit indiquer un depot propre avant de passer a l’etape suivante.

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

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 resultat attendu est la creation du fichier dev/mysql/terragrunt.hcl.

Les options importantes sont les suivantes :

  • --output-folder indique ou ecrire la nouvelle unit ;
  • --root-file-name root.hcl aligne la generation sur la convention de ce repo ;
  • --no-hooks et --no-shell evitent l’execution 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 deja structuree, 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’ecrire moins vite un fichier. Le vrai gain est de standardiser trois choses :

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

Autrement dit, scaffold sert moins a faire gagner dix secondes qu’a eviter que chaque nouvelle unit commence avec une structure differente.

La commande terragrunt catalog lance une TUI pour parcourir un catalogue de modules. Son role n’est pas de generer des fichiers directement en batch, mais de rendre la decouverte 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 meme mecanisme de generation.

Terragrunt permet de declarer 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 configurees, ou a defaut dans le dossier courant selon les regles de decouverte de Terragrunt.

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

LevierA quoi il sert
Depot catalogue dedieCentraliser les modules que l’equipe est autorisee a utiliser
.boilerplate dans un moduleFournir un template de unit plus riche que le template par defaut
default_template dans catalogImposer un rendu standard pour plusieurs modules

Le template integre suffit pour debuter. Les templates personnalises 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 generes a cote du terragrunt.hcl.
  1. Creer le depot catalogue et le committer

    Verification : le module modules/mysql/main.tf existe dans un depot Git propre.

  2. Creer un repo consommateur avec live/root.hcl

    Verification : root.hcl est bien present avant la generation.

  3. Lancer terragrunt scaffold avec un dossier de sortie dedie

    Verification : dev/mysql/terragrunt.hcl apparait.

  4. Relire les inputs generes

    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.

SymptomeCause probableSolution
scaffold ecrit 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 defautAjouter --root-file-name root.hcl
Le template essaye d’executer des actions localesHooks ou shell activesAjouter --no-hooks --no-shell
L’equipe genere des units incoherentesChacun part d’un fichier videImposer scaffold comme point d’entree standard
Le catalogue n’affiche pas les bons reposURLs absentes ou mauvaise racine de rechercheDeclarer catalog.urls ou lancer catalog depuis le bon dossier
  • catalog sert surtout a parcourir un catalogue de modules dans une TUI.
  • scaffold sert a generer un terragrunt.hcl a partir d’un module ou d’un template.
  • Le flux le plus robuste pour une equipe est souvent : depot catalogue Git + scaffold + conventions de securite.
  • --root-file-name root.hcl permet d’aligner la generation sur un repo Terragrunt moderne.
  • --no-hooks et --no-shell sont de bons garde-fous quand vous ne voulez pas executer 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 +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn