Set-OPS-Public/wiki/Infra-as-Code-et-idempotence.md
Daniel Allaire 85fed974a4 wiki : rattraper la reconstruction, et une unite sur la verification du deploye
Le wiki datait du 3 aout. Verifie avant d'y toucher : toutes les cibles make
citees existent, aucune commande morte.

La-preuve.md annoncait P01-P21 ; le harnais est a P33. Les trois nouvelles
ajoutees, et surtout la page dit maintenant ce que ces preuves NE FONT PAS :
elles sont statiques, elles lisent le depot, et c'est dans cet angle mort
qu'une AC est restee expiree huit heures sous un harnais vert.

Infra-as-Code-et-idempotence.md enseignait l'idempotence comme acquise. Vrai
role par role, faux a l'echelle de la flotte. La page enseigne desormais
depuis les chiffres (924 -> 17 -> 0), raconte ce que les 17 cachaient, et
explique pourquoi il faut verifier le zero lui-meme.

Nouvelle unite « Verifier le deploye » : la difference entre valider du code
et verifier un systeme, avec les trois regles qui separent un devis utile d'un
devis decoratif.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 15:11:43 -04:00

93 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Infra as Code & idempotence
> **Unité d'apprentissage.** Moule : ① concept → ② Set-OPS → ③ transférable → ④ à toi de jouer.
---
## ① Le concept *(générique)*
**Infra as Code (IaC)** : décrire l'infrastructure **dans du code** (versionné, revu, reproductible)
plutôt qu'à la main. Le serveur devient le **résultat d'un fichier**, pas d'une suite de clics oubliés.
**Déclaratif vs impératif** :
- *impératif* = « fais ceci, puis cela » (une recette d'étapes) ;
- *déclaratif* = « voici l'**état voulu** » (le moteur trouve comment y arriver).
**Idempotence** : appliquer la **même** description **N fois** donne le **même** résultat. La 1ʳᵉ
exécution change des choses ; les suivantes ne changent **rien** (`changed=0`). C'est ce qui rend
l'IaC **sûre à rejouer**.
**Modèle plan → apply** : on décrit (plan), on **prévisualise** (dry-run), on **applique**. Tout est
en **contrôle de version** (git), donc auditable et réversible.
---
## ② Comment Set-OPS le fait
- **Ansible** = le moteur **déclaratif** (des *rôles* décrivant l'état voulu, idempotents).
- Le **plan** (`serveurs.yml`, `applications.yml`, `bases-donnees.yml`) décrit *quoi* déployer.
- `make instancier` **génère** l'inventaire statique depuis le plan.
- `make deployer` applique les rôles ; le `Vérifier` (dry-run) **prévisualise** d'abord.
- Tout vit dans **git** (ce dépôt) — reproductible, revu, réversible.
### L'idempotence ne se décrète pas : elle se mesure
Cette page a longtemps affirmé que redéployer un rôle donnait `changed=0`. C'était vrai **rôle
par rôle** — et faux à l'échelle de la flotte, ce que personne n'avait vérifié. Le 2026-08-09,
après une reconstruction complète, on a compté :
```
924 taches « changed » rejeu depuis zero (tout est neuf : normal)
17 taches « changed » second passage (la flotte devrait etre convergente)
0 taches « changed » apres correction
```
**Les 17 n'étaient pas du bruit.** Elles cachaient deux pannes qui ne se signalaient d'aucune
autre façon :
| Ce qu'on voyait | Ce que c'était |
|---|---|
| 13× « démarrer node_exporter » | le service **était mort** — tué par `SIGHUP` à chaque renouvellement de certificat, donc toutes les 24 h, sur les quatorze hôtes |
| 2× « déployer app.ini » | le dépôt **faisait tourner le secret JWT** de la forge à chaque déploiement, invalidant ses jetons |
La leçon dépasse Ansible : **un compteur de changements est un instrument de diagnostic.** Tant
qu'il indiquait 17, aucun de ces deux défauts n'était visible — ils se noyaient dans un fond
qu'on avait pris l'habitude d'ignorer. Ramené à zéro, le moindre `changed` sur une flotte non
modifiée devient un signal.
**Vérifier le zéro, aussi.** Un zéro peut vouloir dire « rien à faire » ou « plus rien ne
travaille ». On a compté les tâches exécutées : **2266 au passage à vide contre 2152 au rejeu**.
Plus de tâches, aucune modification — donc convergence, pas silence.
---
## ③ Pourquoi c'est transférable
| Set-OPS | Équivalents ailleurs |
|---|---|
| Ansible | Terraform · Puppet · Chef · SaltStack · OpenTofu |
| plan → dry-run → apply | `terraform plan/apply`, tout workflow IaC |
| idempotence | **propriété fondamentale** de toute IaC sérieuse |
Tu as appris **le déclaratif, l'idempotence, plan→apply, l'infra versionnée** — pas « Ansible ».
---
## ④ À toi de jouer
1. **Sens l'idempotence.** Redéploie un rôle déjà en place (ex. via la GUI ou
`make deployer HOTE=…`) : la 2ᵉ fois, **`changed=0`**. Rien à faire = rien n'est touché.
2. **Le flux déclaratif.** Édite le plan (un serveur dans la GUI), `⚙ Appliquer le plan`
(instancier), puis `Vérifier` (dry-run) : tu **prévisualises** avant d'appliquer.
3. **La réversibilité.** `git diff` / `git checkout` sur le plan : l'état est **du code**, donc
annulable.
4. **Casse & répare.** Modifie à la main un fichier géré par un rôle (ex. un `.conf`), puis
redéploie : Ansible **rétablit l'état voulu** (le code gagne sur la dérive manuelle). Tu *sens*
que la source de vérité, c'est **le code**.
---
## Pour aller plus loin *(dépôt)*
- Le flux : `make instancier``make instancier-appliquer``make deployer` (ou la GUI).
- Le plan : `instance/plan/` ; les rôles : `roles/` ; l'autorité : `AGENTS.md`.
- Relations déclaratives entre entités : unité **Liaisons (bindings)**.