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 :

Questions :

  1. Le code est-il toujours lisible ?
  2. Combien de lignes avez-vous dupliqué ?
  3. Que se passerait-il avec 10 conteneurs ?

Questions :

  • Quel est le principal problème de votre configuration actuelle ?
  • Comment pourriez-vous éviter de copier-coller ce code ?

Bonus

Question :

Existe-t-il un moyen en Terraform de réutiliser du code ?

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