Table des matières

TD2 : Créer un module Terraform réutilisable

Objectifs

Contexte

Vous travaillez dans une équipe DevOps.

Votre équipe doit déployer plusieurs environnements de test pour différentes équipes :

Chaque équipe a besoin :

Problème actuel :

Objectif :

Créer une solution réutilisable permettant de déployer plusieurs conteneurs rapidement et sans erreur.

1. Structure du projet

mkdir -p terraform-td2/modules/nginx
cd terraform-td2

terraform-td2/
  main.tf
  modules/
    nginx/
      main.tf
      variables.tf
      outputs.tf

2. Création du module

Objectif : créer un composant réutilisable

2.1 Variables du module

Fichier : modules/nginx/variables.tf

variable "container_name" {
  description = "Nom du conteneur"
}

variable "external_port" {
  description = "Port exposé"
}

Question :

  • Pourquoi ne pas coder ces valeurs en dur ?

2.2 Ressources

Fichier : modules/nginx/main.tf

resource "docker_image" "nginx" {
  name = "nginx:latest"
}

resource "docker_container" "nginx" {
  name  = var.container_name
  image = docker_image.nginx.name

  ports {
    internal = 80
    external = var.external_port
  }
}

2.3 Outputs du module

Fichier : modules/nginx/outputs.tf

output "url" {
  value = "http://localhost:${var.external_port}"
}

Question :

  • À quoi peut servir cet output dans un projet réel ?

3. Utilisation du module

Fichier : main.tf

terraform {
  required_providers {
    docker = {
      source = "kreuzwerker/docker"
    }
  }
}

provider "docker" {}

module "nginx1" {
  source = "./modules/nginx"

  container_name = "frontend"
  external_port  = 8080
}

module "nginx2" {
  source = "./modules/nginx"

  container_name = "backend"
  external_port  = 8081
}

4. Exécution

Dans le dossier terraform-td2 :

terraform init
terraform plan
terraform apply

5. Problème volontaire

Fichier : main.tf

Modifier la configuration pour utiliser le même port :

external_port = 8080

Relancer :

terraform apply

Questions :

  • Que se passe-t-il ?
  • L’erreur vient-elle de Terraform ou de Docker ?
  • Pourquoi ?

Corriger le problème.

6. Exploitation des outputs

terraform output

Question :

  • En quoi cet output est utile dans une chaîne CI/CD ?

7. Compréhension

  • Pourquoi utiliser un module plutôt que copier-coller ?
  • Quel est le rôle des variables ?
  • Que contient le fichier terraform.tfstate ?
  • Comment Terraform détecte les changements ?

8. Extension

Fichier : modules/nginx/variables.tf

Rendre le module plus flexible :

variable "image_name" {
  description = "Image Docker"
  default     = "nginx:latest"
}

Fichier : modules/nginx/main.tf

Modifier :

resource "docker_image" "nginx" {
  name = var.image_name
}

Test :

  • utiliser nginx:alpine

9. Challenge

Créer un troisième environnement :

  • nom : data
  • port : 8082

10. Bonus

Fichier : main.tf

Afficher toutes les URLs :

output "urls" {
  value = [
    module.nginx1.url,
    module.nginx2.url
  ]
}

Question :

  • Comment automatiser encore davantage ce code si on a 10 conteneurs ?