Aller au contenu

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.

creer un reseau virtuel
attacher un sous-reseau
creer une VM dans ce sous-reseau
ouvrir le port 443

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, service est idempotent par conception
  • Un script bash mkdir n'est pas idempotent — il échoué si le répertoire existe déjà. mkdir -p l'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