eadl:bloc4:fm2:td2

TD2 : Créer un module Terraform réutilisable

  • Comprendre l’intérêt des variables et des outputs
  • Structurer un projet Terraform
  • Créer et utiliser un module
  • Manipuler Terraform de manière autonome

Vous travaillez dans une équipe DevOps.

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

  • frontend
  • backend
  • data

Chaque équipe a besoin :

  • d’un conteneur web
  • accessible via un port différent

Problème actuel :

  • duplication du code Terraform
  • erreurs fréquentes (ports, noms…)
  • difficile à maintenir

Objectif :

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

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

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

Objectif : créer un composant réutilisable

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 ?

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
  }
}

Fichier : modules/nginx/outputs.tf

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

Question :

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

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
}

Dans le dossier terraform-td2 :

terraform init
terraform plan
terraform apply

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.

terraform output

Question :

  • En quoi cet output est utile dans une chaîne CI/CD ?
  • 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 ?

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

Créer un troisième environnement :

  • nom : data
  • port : 8082

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 ?
  • eadl/bloc4/fm2/td2.txt
  • Dernière modification : il y a 4 jours
  • de jcheron