Fondamentaux IaC¶
Comprendre l'Infrastructure as Code, ses principes fondateurs et pourquoi le ClickOps est un anti-pattern.
IaC vs ClickOps¶
L'Infrastructure as Code consiste à décrire l'infrastructure dans des fichiers texte versionnes, exactement comme du code applicatif. Le ClickOps désigne l'approche inverse : provisionner et configurer manuellement via des interfaces graphiques.
| Critère | ClickOps | IaC |
|---|---|---|
| Traçabilité | Aucune — qui a fait quoi, quand ? | Commit par commit, avec auteur et message |
| Reproductibilite | Impossible a reproduire exactement | Identique à chaque exécution |
| Scalabilité | Lineaire en temps humain | Automatisable — 1 ressource ou 1000 |
| Revue | Impossible | Pull request, peer review, historique |
| Récupération | Reconstruction manuelle après incident | Re-apply depuis Git en quelques minutes |
| Audit et conformité | Capture d'écran ou rien | Diff Git — chaque changement est tracable |
ClickOps = zero trace
Une infrastructure créée via l'interface web d'un cloud provider n'a aucune mémoire. Qui a ouvert ce port ? Quand cette VM a-t-elle été provisionnee ? Pourquoi cette base de données est-elle en public ? Impossible à savoir. L'IaC rend chaque décision traçable et réversible.
Declaratif vs imperatif¶
Approche imperative¶
L'approche imperative décrit comment arriver à l'état souhaite. On écrit une suite d'instructions a exécuter dans l'ordre.
Problème : si l'état actuel est différent de ce qu'on suppose, les instructions peuvent échouer ou produire un résultat inattendu.
Approche declarative¶
L'approche declarative décrit ce que l'on veut, pas comment y arriver. L'outil (Terraform, Kubernetes, etc.) calcule les actions nécessaires pour atteindre l'état desire.
graph LR
A["Etat desire<br/>(fichiers .tf)"] --> B["Outil IaC"]
C["Etat actuel<br/>(state)"] --> B
B --> D["Plan de changement"]
D --> E["Application"]
E --> F["Etat reel = Etat desire"] Terraform est declaratif : vous decrivez une VM avec ses caractéristiques, Terraform déterminé si elle doit être créée, modifiée ou est déjà conforme.
Comparaison¶
| Critère | Imperatif (bash/Ansible sans idempotence) | Declaratif (Terraform, Kubernetes) |
|---|---|---|
| Description | Comment faire | Ce qu'on veut |
| Idempotence | A implémenter manuellement | Intrinsèque |
| Re-exécution | Risquee (doublons, erreurs) | Suree — convergence vers l'état desire |
| Lisibilite | Procédure | Spécification |
Idempotence¶
Une opération est idempotente si l'exécuter une fois ou dix fois produit le même résultat final.
Pourquoi c'est fondamental en IaC¶
En IaC, on re-exécuté régulièrement le même code : en CI, en cas d'incident, pour reconcilier un drift. Si le code n'est pas idempotent, chaque exécution risque de créer des doublons, de modifier des ressources qui ne devraient pas changer, ou de produire des erreurs.
Principe en pratique¶
- Terraform vérifié l'état courant avant d'agir : si la ressource existe déjà et est conforme, il ne fait rien
- Ansible avec ses modules
file,package,serviceest idempotent par conception - Un script bash
mkdirn'est pas idempotent — il échoué si le répertoire existe déjà.mkdir -pl'est
Test d'idempotence
Après un premier apply, re-executez immédiatement. Si le plan montre zero changement, votre code est idempotent. C'est un test a ajouter dans votre CI.
Immutable vs mutable¶
Infrastructure mutable¶
On modifie les ressources existantes en place : on met à jour un package sur une VM, on change un parametre de configuration sur un serveur en production. L'état réel de la machine diverge progressivement de ce qui est documente — c'est le configuration drift.
Infrastructure immutable¶
On ne modifie jamais une ressource existante. Pour tout changement, on crée une nouvelle ressource et on détruit l'ancienne. Les machines sont traitees comme du betail (cattle), pas comme des animaux de compagnie (pets).
graph LR
subgraph Mutable
VM1["VM v1"] -->|"patch"| VM1b["VM v1 modifiee"]
VM1b -->|"autre patch"| VM1c["VM v1 modifiee+"]
end
subgraph Immutable
VM2["VM v2"] -->|"nouvelle version"| VM3["VM v3 (nouvelle)"]
VM2 -->|"destruction"| X["X"]
end Quand appliquer chaque approche¶
| Approche | Avantages | Cas d'usage |
|---|---|---|
| Immutable | Reproductibilite totale, pas de drift, rollback simple | VMs, conteneurs, AMIs, images cloud |
| Mutable | Rapide pour les petits changements, moins de ressources | Cas exceptionnels, legacy difficile à migrer |
L'immutabilite est le principe fondateur des conteneurs Docker et des images cloud comme les AMIs AWS.
Outils¶
| Outil | Description | Lien |
|---|---|---|
| Terraform | IaC declaratif multi-cloud, le plus repandu | terraform.io |
| OpenTofu | Fork open source de Terraform (post-licence BSL) | opentofu.org |
| Ansible | Configuration management agentless, approche imperative/idempotente | ansible.com |
| Pulumi | IaC avec des langages de programmation (Python, Go, TS) | pulumi.com |