eadl:bloc4:fm2:td1

Ceci est une ancienne révision du document !


TD1 : Introduction à l’Infrastructure as Code (IaC)

  • Comprendre les limites des approches manuelles
  • Découvrir les principes de l’Infrastructure as Code
  • Manipuler Terraform et Ansible sur un exemple simple

Vous intégrez une équipe DevOps.

Actuellement :

  • les développeurs lancent des conteneurs manuellement
  • les configurations sont faites “à la main”
  • les environnements sont incohérents

Problèmes :

  • erreurs humaines fréquentes
  • impossible de reproduire un environnement
  • perte de temps en debug

Objectif :

Automatiser :

  • la création d’un service web (Terraform)
  • sa configuration (Ansible)
  • Linux / macOS / WSL recommandé sous Windows
  • Docker installé
  • Accès terminal

Vérifier :

  • terraform version
  • ansible –version
  • docker –version

Versionner ses outils :

  • garantit la reproductibilité des environnements,
  • évite les incompatibilités entre équipes,
  • permet de diagnostiquer plus facilement les problèmes liés aux différences de versions.

Fichier : terminal

mkdir iac-demo
cd iac-demo
mkdir terraform ansible

Structure :

iac-demo/
├── terraform/
│   └── main.tf
└── ansible/
    ├── inventory.ini
    └── playbook.yml

Créer un conteneur NGINX

Fichier : terraform/main.tf

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

provider "docker" {}

resource "docker_container" "nginx" {
  image = "nginx:latest"
  name  = "mon_nginx"

  ports {
    internal = 80
    external = 8090
  }
}

Fichier : terminal

cd terraform
terraform init
terraform apply

Validation :

Fichier : terminal

terraform state list

Le state Terraform contient l’état réel des ressources gérées (IDs, propriétés, dépendances).

Terraform s’en sert pour savoir ce qui existe déjà, calculer les changements à appliquer et éviter de recréer inutilement des ressources.

Fichier : ansible/inventory.ini

localhost ansible_connection=local

Fichier : ansible/playbook.yml

- hosts: localhost
  connection: local

  tasks:
    - name: créer une page web temporaire
      copy:
        dest: /tmp/index.html
        content: |
          <h1>IaC avec Ansible</h1>

    - name: copier la page dans le conteneur nginx
      command: docker cp /tmp/index.html mon_nginx:/usr/share/nginx/html/index.html

Fichier : terminal

cd ../ansible
ansible-playbook -i inventory.ini playbook.yml

Validation :

Modifier le nom du conteneur dans Terraform :

Fichier : terraform/main.tf

name = "mon_nginx_v2"

Relancer :

terraform apply

Puis rejouer Ansible :

ansible-playbook -i inventory.ini playbook.yml

  • Terraform recrée le conteneur avec un nouveau nom (mon_nginx_v2).
  • Ansible échoue car il tente toujours de cibler l’ancien conteneur (mon_nginx), qui n’existe plus.
  • Le problème vient d’un manque de synchronisation entre Terraform (provisioning) et Ansible (configuration).

Corriger le playbook pour utiliser le bon nom de conteneur.

Pour éviter ce problème, il faut :

  • centraliser les variables (ex : nom du conteneur),
  • utiliser des outputs Terraform ou une source dynamique pour Ansible,
  • éviter les valeurs codées en dur.
  • Le déclaratif décrit l’état final souhaité (Terraform), tandis que le procédural décrit les étapes à exécuter (Ansible).
  • Terraform et Ansible sont séparés pour distinguer le provisioning (infrastructure) de la configuration (logicielle).
  • Relancer Terraform est idempotent : si rien n’a changé, aucune modification n’est appliquée.

Objectif :

  • consolider la compréhension
  • préparer le TD suivant

Modifier votre configuration :

  • changer le port exposé (ex : 8085)
  • modifier le contenu de la page HTML

Appliquer les changements.

Terraform modifie la ressource si le changement est compatible avec une mise à jour. Sinon, la ressource est recréée.

Ce comportement dépend du type de ressource et des contraintes du provider Docker.

Créer un second conteneur :

  • nom : nginx_test
  • port : 8091
  1. Adapter votre configuration Terraform.
  2. Adapter votre playbook Ansible pour configurer les deux conteneurs.

Questions :

  • Quelles parties du code avez-vous dupliqué ?
  • Est-ce problématique ?

Créer un troisième conteneur :

  • nom : nginx_data
  • port : 8092

Observer votre code :

L’augmentation du nombre de conteneurs rend le code difficile à lire et à maintenir :

  • Le nombre de lignes dupliquées augmente fortement.
  • Avec un grand nombre de conteneurs, le code devient lourd, répétitif et source d’erreurs.

La duplication de code est le principal problème de cette configuration.

Elle peut être évitée en utilisant des variables, des boucles (for_each) ou des modules Terraform.

  • Terraform → provisioning
  • Ansible → configuration
  • séparation des responsabilités
  • reproductibilité
  • eadl/bloc4/fm2/td1.1777816304.txt.gz
  • Dernière modification : il y a 4 jours
  • de jcheron