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

Question :

  • Pourquoi est-il important de versionner ses outils en DevOps ?

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

Questions :

  • Que contient le state ?
  • Pourquoi Terraform en a besoin ?

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

Questions :

  • Que se passe-t-il ?
  • Pourquoi Ansible échoue ?
  • Quel outil est responsable du problème ?

Corriger le playbook pour utiliser le bon nom de conteneur.

Question :

  • Comment éviter ce type de problème en production ?
  • Quelle est la différence entre déclaratif et procédural ?
  • Pourquoi séparer Terraform et Ansible ?
  • Que se passe-t-il si on relance Terraform plusieurs fois ?

Objectif :

  • consolider la compréhension
  • préparer le TD suivant (modules)

Modifier votre configuration :

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

Appliquer les changements.

Questions :

Terraform recrée-t-il la ressource ou la modifie-t-il ? Pourquoi ?

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ées ?
  • 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ées ?
  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.1777487420.txt.gz
  • Dernière modification : il y a 19 heures
  • de jcheron