Students : DIALLO Samba & DIOP Mouhamed
Section 7: Utilisation de Modules OpenTofu depuis GitHub
Exercices 11 & 12
Vue d’Ensemble
Cette section vous apprend à:
- Utiliser des modules depuis des dépôts GitHub
- Implémenter le contrôle de version avec les tags et branches Git
- Trouver et utiliser des modules publics depuis Terraform Registry
- Créer du code d’infrastructure réutilisable
Exercice 11: Versionnage Git avec les Modules
Objectif
Explorer les stratégies de versionnage pour les modules utilisant les tags et branches Git.
Concepts
1. Versionnage Sémantique
v1.2.3
├── 1: MAJOR (changements breaking)
├── 2: MINOR (nouvelles fonctionnalités, rétrocompatible)
└── 3: PATCH (corrections de bugs)
2. Patterns de Source de Module
Sans Version:
source = "github.com/username/repo.git//modules/ec2"
# Utilise: branche par défaut (main/master)
# Risque: Le code peut changer de manière inattendue
# Usage: Développement uniquementAvec Tag Git (RECOMMANDÉ):
source = "github.com/username/repo.git//modules/ec2?ref=v1.2.0"
# Utilise: Tag de version exacte
# Avantage: Reproductible, prévisible
# Usage: Environnements de productionAvec Branche:
source = "github.com/username/repo.git//modules/ec2?ref=develop"
# Utilise: Branche spécifique
# Avantage: Dernières fonctionnalités de la branche
# Risque: Le code peut changer
# Usage: Développement, développement actifAvec SHA de Commit:
source = "github.com/username/repo.git//modules/ec2?ref=abc123def456"
# Utilise: Commit exact
# Avantage: Précision maximale
# Risque: Difficile à maintenir
# Usage: Débogage, scénarios de rollbackExercice Pratique
Étape 1: Préparer Votre Dépôt GitHub
Si vous n’avez pas de compte GitHub, créez-en un sur github.com.
# Créer un nouveau dépôt sur GitHub:
# 1. Aller sur github.com/new
# 2. Nom: "iac-modules"
# 3. Ajouter README
# 4. Créer le dépôtÉtape 2: Pousser Votre Module Local vers GitHub
# Dans votre espace de travail
cd /home/sable/devops_base/td2/scripts/modules
# Initialiser git (si pas déjà fait)
git init
# Ajouter tous les fichiers
git add -A
git commit -m "Initial module structure"
# Ajouter remote (remplacer YOUR_USERNAME)
git remote add origin https://github.com/YOUR_USERNAME/iac-modules.git
# Pousser vers la branche main
git branch -M main
git push -u origin mainÉtape 3: Créer des Tags de Version
# Créer la première release
git tag -a v1.0.0 -m "First stable release"
git push origin v1.0.0
# Créer la seconde release (avec améliorations)
git tag -a v1.1.0 -m "Add port parameterization"
git push origin v1.1.0
# Créer une branche de développement
git checkout -b develop
git push -u origin developÉtape 4: Vérifier les Tags sur GitHub
# Voir tous les tags:
git tag -l
# Sortie:
# v1.0.0
# v1.1.0
# Voir les infos d'un tag spécifique:
git show v1.0.0Étape 5: Tester Différentes Références de Version
Créer différents modules utilisant différentes versions:
cd /home/sable/devops_base/td2/scripts/live/github-modulesFichier: test-v1.0.0.tf
module "app_v1_0_0" {
source = "github.com/YOUR_USERNAME/iac-modules.git//ec2-instance?ref=v1.0.0"
ami_id = var.ami_id
name = "app-v1-0-0"
instance_type = "t3.micro"
port = 8080
}Fichier: test-v1.1.0.tf
module "app_v1_1_0" {
source = "github.com/YOUR_USERNAME/iac-modules.git//ec2-instance?ref=v1.1.0"
ami_id = var.ami_id
name = "app-v1-1-0"
instance_type = "t3.micro"
port = 9000
}Fichier: test-main.tf
module "app_main" {
source = "github.com/YOUR_USERNAME/iac-modules.git//ec2-instance?ref=main"
ami_id = var.ami_id
name = "app-main"
instance_type = "t3.micro"
port = 8080
}Ce que Vous Apprenez
- Versionnage sémantique pour les modules
- Tagging Git pour les releases
- Versionnage basé sur les branches
- Références par SHA de commit
- Contraintes de version dans OpenTofu
- Gestion de modules prête pour la production
Points Clés
- Toujours utiliser des tags de version en production (?ref=v1.0.0)
- Utiliser des branches pour le développement (?ref=develop)
- Documenter les changements de version dans CHANGELOG.md
- Planifier les mises à jour soigneusement - tester en staging d’abord
- Utiliser le versionnage sémantique - attentes claires pour les changements
Exercice 12: Utilisation de Modules Publics depuis Terraform Registry
Objectif
Trouver et implémenter des modules prêts pour la production depuis des dépôts publics.
Sources de Modules Populaires
1. Terraform Registry (registry.terraform.io)
Registre officiel pour les modules Terraform et OpenTofu.
Modules courants:
- terraform-aws-modules/ec2-instance/aws - Instances EC2
- terraform-aws-modules/vpc/aws - VPC avec sous-réseaux
- terraform-aws-modules/security-group/aws - Groupes de sécurité
- terraform-aws-modules/ecs/aws - Clusters ECS
2. Dépôts GitHub Publics
Options bien maintenues:
- hashicorp/terraform-aws-modules
- gruntwork-io/terraform-aws-modules
- cloudposse/terraform-aws-modules
Exercice Pratique
Option A: Utiliser un Module Terraform Registry (LE PLUS FACILE)
Étape 1: Trouver un Module
Aller sur https://registry.terraform.io/modules et rechercher “security group”
Exemple: terraform-aws-modules/security-group/aws
Étape 2: Lire la Documentation
Le registre fournit:
- Description du module
- Variables d’entrée
- Valeurs de sortie
- Exemples d’utilisation
Étape 3: Créer la Configuration
provider "aws" {
region = "us-east-2"
profile = "labs-devops_diallo"
}
module "web_security_group" {
source = "terraform-aws-modules/security-group/aws"
version = "5.0.0"
name = "web-sg"
description = "Security group for web server"
vpc_id = "vpc-xxxxxxxx" # Votre VPC ID
# Règles Ingress
ingress_rules = ["http-80-tcp", "https-443-tcp", "ssh-tcp"]
ingress_cidr_blocks = ["0.0.0.0/0"]
# Règle Egress
egress_rules = ["all-all"]
egress_cidr_blocks = ["0.0.0.0/0"]
tags = {
Name = "web-server-sg"
}
}
output "security_group_id" {
value = module.web_security_group.security_group_id
}Modules Publics Recommandés
Pour EC2:
source = "terraform-aws-modules/ec2-instance/aws"
version = "5.0.0"Pour VPC:
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"Pour Security Groups:
source = "terraform-aws-modules/security-group/aws"
version = "5.0.0"Pour RDS:
source = "terraform-aws-modules/rds/aws"
version = "5.0.0"Fichiers de Configuration Disponibles
Les exemples complets sont disponibles dans:
Workflow Pratique
Scénario: Partager un Module avec l’Équipe
Phase 1: Développement (Local)
# Créer le module localement
/modules/ec2-instance/
├── main.tf
├── variables.tf
├── outputs.tf
└── user-data.sh
# Tester localement
cd live/sample-app
tofu applyPhase 2: Version (Git)
cd modules
git init
git add -A
git commit -m "Add ec2-instance module"
git remote add origin https://github.com/user/iac-modules.git
git push -u origin mainPhase 3: Release (Tag)
git tag -a v1.0.0 -m "Initial release"
git push origin v1.0.0Phase 4: Partager (GitHub)
Les membres de l’équipe peuvent maintenant utiliser:
module "app" {
source = "github.com/user/iac-modules.git//ec2-instance?ref=v1.0.0"
ami_id = "ami-xxx"
name = "my-app"
}Bonnes Pratiques
- Utiliser des tags de version pour la production
- Tester les modules dans un environnement de staging
- Documenter les changements dans CHANGELOG.md
- Suivre le versionnage sémantique
- Maintenir des exemples d’utilisation à jour
- Fournir des valeurs par défaut raisonnables
- Valider les entrées avec des contraintes