🏗️ Infrastructure as Code
Terraform, Ansible & Automation
📐 Analogie : L'Architecte vs Le Maçon
ClickOps (Manuel) : Vous dites au maçon "Pose une brique ici, puis une autre là". Si
le mur tombe, il faut tout redire.
IaC (Terraform) : Vous donnez le plan 3D (Code) au robot. Il construit tout seul.
Si le mur tombe, il le reconstruit à l'identique.
⚠️ Rappel : Idempotence et State
L'idempotence garantit que l'exécution d'un script 100 fois aboutira exactement au même résultat final (sans créer 100 copies du serveur). L'IaC y parvient grâce à son fichier d'état (State, ex: terraform.tfstate) qui mémorise la réalité de l'infrastructure, servant de point de vérité absolu pour calculer le Delta des modifications.
📖 IaC : Des "Pets" aux "Cattle"
Le plus grand changement apporté par l'IaC est le changement de paradigme "Pets vs Cattle" (Animaux de compagnie vs Bétail) :
- Pets (Hier) : On donne un nom à nos serveurs (ex: "Zeus"). On les soigne manuellement. S'ils meurent, c'est la tragédie.
- Cattle (Aujourd'hui) : Les serveurs n'ont plus de noms individuels, mais des numéros (ex: web-01, web-02). S'ils ont un problème, on les supprime et on les recrée via le code.
L'Infrastructure as Code permet une Reproductibilité Totale et évite le "Snowflake Server" (serveur configuré à la main que personne n'ose toucher).
💡 Le saviez-vous ? L'essor de Terraform
En 2014, Mitchell Hashimoto (fondateur de HashiCorp) lance Terraform. Avant, chaque Cloud Provider avait son propre outil (CloudFormation pour AWS, ARM pour Azure). Terraform a réussi l'impossible : créer un langage Cloud Agnostic (HCL) qui peut parler à tous les Clouds via des "Providers".
C'est aujourd'hui l'outil d'IaC le plus utilisé au monde.
🔄 A. Cycle de vie IaC
Schéma interactif : Terraform construit l'infrastructure (serveurs, réseaux) via API, puis Ansible la configure (logiciels) via SSH.
🛠️ B. Outils IaC
📊 Provisioning vs Configuration
🏗️ Terraform (Déclaratif)
- Provisioning : Créer des ressources (VPC, VM, DB).
- State Management : Sait ce qu'il a créé (le fichier State).
- Idempotent : Ne recrée pas si la ressource existe déjà.
- Cycle de vie : Idéal pour "Infrastructure immutable".
🛠️ Ansible (Impératif/Hybride)
- Configuration : Installer des logiciels, modifier des fichiers.
- Stateless : Ne garde pas d'inventaire de l'état passé.
- Agentless : Fonctionne via SSH (pas d'agent à installer).
- Mutable : Idéal pour maintenir des serveurs existants.
📊 Cas d'étude : Capital One - L'IaC à l'échelle bancaire
Contexte : En 2015, Capital One décide de fermer tous ses datacenters pour migrer sur AWS. Le défi : garantir la sécurité et la conformité bancaire de manière automatisée.
Transformation :
- Terraform First : Interdiction de créer une ressource via la console. Tout passe par une PR Git.
- Policy as Code : Utilisation de Sentinel (HashiCorp) pour bloquer automatiquement les infras non-conformes (ex: Bucket S3 public).
- Immutable Infrastructure : On ne patche jamais un serveur, on redéploie une nouvelle version de l'infra complète.
Résultat : Réduction drastique des erreurs humaines et audit constant en temps réel.
🔄 À Retenir - Infrastructure as Code
- Versionnez tout : L'infra est du code, elle vit dans Git.
- Évitez le Drift : Utilisez des outils comme Driftctl pour détecter les modifs manuelles.
- Modularité : Ne répétez pas votre code (DRY - Don't Repeat Yourself). Utilisez des modules.
- Sécurité : Scannez vos manifests IaC avec des outils comme Checkov ou Tfsec.
resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" tags = { Name = "prod-vpc" } } resource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t3.micro" vpc_security_group_ids = [ aws_security_group.web.id ] }
- name: Configure Web Server hosts: webservers become: yes tasks: - name: Install Nginx apt: name: nginx state: present - name: Start Nginx service: name: nginx state: started enabled: yes
🧱 C. Advanced Terraform Patterns
Au lieu de copier-coller 50 fois le code d'un VPC, créez un module.
module "vpc_prod" { source = "./modules/vpc" }DRY (Don't Repeat Yourself) est roi.
Gérer Dev, Staging et Prod avec le même code.
terraform workspace select prodChaque workspace a son propre fichier d'état (tfstate) isolé.
🔒 D. Remote State & Locking
En équipe, stocker le fichier terraform.tfstate sur son PC est
interdit.
S'il est perdu, l'infra est orpheline. Si deux devs appliquent en même temps, c'est la corruption.
terraform { backend "s3" { bucket = "my-tf-state-bucket" key = "prod/terraform.tfstate" region = "us-east-1" dynamodb_table = "tf-state-locks" # Gère le verrouillage } }
terraform apply, DynamoDB verrouille le state. Si Alice essaie en même
temps, elle reçoit : Error: distinct locking.
🛑 Troubleshooting : Error acquiring the state lock
- Symptôme : Vous lancez
terraform applyet recevez une erreur :Error: Error acquiring the state lock ... Lock Info: ID: 1234.... - Diagnostic : Quelqu'un (ou un pipeline CI) exécute déjà une commande Terraform sur ce workspace, ou bien une exécution précédente a crashé (perte de connexion) sans relâcher le verrou (lock) dans DynamoDB.
- Remède :
1. Vérifiez avec votre équipe si un pipeline est en cours.
2. Si vous êtes absolument certain que c'est un verrou fantôme (crash), forcez le déverrouillage avec prudence :terraform force-unlock <LOCK_ID>.
Attention : Casser un verrou actif corrompra votre fichier d'état.
🚀 E. Beyond Terraform
Crossplane
L'IaC dans Kubernetes. Créez une base de données AWS RDS en faisant un
kubectl apply -f rds.yaml. K8s réconcilie l'infra cloud en continu.
Atlantis
GitOps pour Terraform. Le bot Atlantis commente le résultat de terraform plan
directement dans votre Pull Request GitHub.
Checkov
Scanner de sécurité statique pour IaC. Bloque le déploiement si un Security Group est ouvert sur 0.0.0.0/0.
📊 Cas d'étude : HashiCorp - Dogfooding Extreme
Contexte : Comment HashiCorp gère son propre cloud (HCP) ? En utilisant leurs propres outils à l'extrême.
Architecture :
- Nomad & Consul : Orchestration et Service Mesh (alternative à K8s).
- Sentinel Policy as Code : Tout est vérifié. Impossible de déployer une ressource sans tag "Owner" ou qui coûte plus de X$ sans approval.
- Ephemeral Environments : Chaque Pull Request crée un environnement complet éphémère qui est détruit après le merge.
⚠️ Le Danger : Drift
Si quelqu'un modifie l'infra manuellement dans la console AWS, le code et la réalité divergent.
~ update SG rule (Drift detected)
✅ Best Practices
- Remote State : S3/GCS + Locking (DynamoDB)
- Modules : Réutiliser via modules
- Review : terraform plan dans PR
- Immutable : Recréer plutôt que patcher