Some checks failed
verifier / verifier (push) Has been cancelled
La revision a commence par un balayage par motifs — chemins morts, cibles make absentes, comptes derives. Il a trouve une trentaine d ecarts et rate presque tout le reste : un motif ne voit que ce qui s exprime en motif. make hote-planifier en est l exemple. La cible EXISTE, donc le controle passait au vert. C est une cible depreciee qui refuse et sort en 2, recommandee par AGENTS.md, et qui contredit la REGLE D OR du meme fichier trois ecrans plus haut. Il fallait lire pour la voir. 74 documents lus un par un. 66 corriges, 8 exacts. CE QUI ETAIT FRANCHEMENT FAUX AGENTS.md, la source d autorite, annoncait la flotte pas encore executee contre des VM reelles. Elle a ete rasee et remontee depuis zero trois fois. ecosysteme-chezlepro.md, le document montre a un client, portait la meme phrase : il se sous-vendait gravement. courriel-conception.md s ouvrait sur aucun role n est encore ecrit, au-dessus de son propre paragraphe 1 qui les nomme. autorisation.md se terminait sur rien n est construit alors qu il rapporte des mesures datees du role en fonctionnement. hebergeur-exploitation.md disait rien n est fait d un depot qui existe. filiation-emancipation.md se contredisait a deux ecrans de distance. DES MODELES DECRITS D APRES UN MONDE ANTERIEUR Le resolveur : cinq documents decrivaient un Unbound par VM en opt-in, trois le donnaient en exemple d integration FACULTATIVE — il est universel depuis le 2026-08-24. L adressage de nomenclature-vm.md : reseau unique, VLAN 11-15, VMID a cinq chiffres. Le nommage SDN de sdn-evpn.md contre le code : c est le wiki qui avait raison. CE QUI CASSE AU PREMIER ESSAI Le nom du gabarit dore etait faux a quatre endroits, dont la procedure qui le FABRIQUE et le critere R2 de l epreuve d operateur independant. preparer-un-site-hebergeur.md avertissait qu une VM faite a la main serait detruite : raser derive du plan, il ne la detruira jamais — le risque est l inverse. Un mot de passe d essai en clair dans un depot public. DEUX PREUVES ETENDUES, ET UNE QUI SE TROMPAIT ELLE-MEME P57 couvre les groupes : elle a signale aussitot 29 groupes annonces au-dessus d un tableau qui en cite 40. P29 confronte le tableau de authentification.md aux declarations reelles : 12 annonces, 21 reels. Et P57 imposait un chiffre faux — 56 preuves alors que le depot en porte 57, la conditionnelle vivant hors de tout comptage. Un garde-fou qui fait respecter une erreur ajoute l assurance a l erreur. CE QUI RESTE, ET QU AUCUNE PREUVE NE TIENT Deux comptes trouves a la main. Et une lacune reelle : rien ne garde les meta/acces.yml — ni qu un service web-sso en porte un, ni que le groupe qu il nomme existe. P29 tient les positions d authentification, personne ne tient les habilitations. make prouver : CONFORME, 56 OK, 0 echec, 1 saute. 0 lien mort. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
118 lines
5.7 KiB
Markdown
118 lines
5.7 KiB
Markdown
# Vérifier le déployé — quand la preuve statique ne suffit plus
|
|
|
|
> **Unité d'apprentissage.** Moule : ① concept → ② Set-OPS → ③ transférable → ④ à toi de jouer.
|
|
|
|
---
|
|
|
|
## ① Le concept *(générique)*
|
|
|
|
Il y a **deux questions** qu'on confond tout le temps, et seule la première est facile :
|
|
|
|
| Question | Ce qu'on lit | Ce que ça prouve |
|
|
|---|---|---|
|
|
| « Mon **code** est-il cohérent ? » | le dépôt | qu'il ne se contredit pas lui-même |
|
|
| « Mon **système** ressemble-t-il à mon code ? » | les machines | qu'il fait ce qu'on a écrit |
|
|
|
|
Un test unitaire, un *linter*, une validation de schéma répondent tous à la première. Ils sont
|
|
rapides, ils tournent partout, et ils **ne touchent jamais** la machine. C'est leur force et
|
|
c'est leur limite.
|
|
|
|
La seconde question exige d'aller *demander* au système. Et elle est la seule qui compte le jour
|
|
où quelque chose ne marche pas.
|
|
|
|
> **Le piège n'est pas d'ignorer la seconde question. C'est de croire que la première y répond.**
|
|
> Un tableau de bord tout vert dit « le code est bon », et on le lit « le service fonctionne ».
|
|
|
|
---
|
|
|
|
## ② Comment Set-OPS le fait
|
|
|
|
Set-OPS a longtemps eu **31 preuves statiques** (`make prouver`) — zéro appel réseau, zéro SSH.
|
|
Elles établissent que le dépôt est cohérent avec lui-même : les *handlers* existent, l'adressage
|
|
dérive du seed, aucun intrant n'est orphelin.
|
|
|
|
Le 2026-08-08, l'autorité de certification de la flotte est restée **expirée pendant huit
|
|
heures** sous un harnais entièrement vert. Le renouvellement échouait toutes les quatorze
|
|
minutes. Aucune preuve ne pouvait le voir : aucune ne parlait à une machine.
|
|
|
|
D'où les **devis de service** — même patron que les devis réseau (D-23/D-24), porté aux services :
|
|
|
|
```
|
|
make identite-plan le realm, la fédération LDAP, la politique de mot de passe, les comptes
|
|
make certificats-plan ce que le disque porte contre ce que la mémoire sert
|
|
make expositions-plan chaque service publié répond-il — depuis l'edge et depuis ton poste
|
|
make postgresql-plan le chiffrement est-il imposé, et à quels réseaux
|
|
make courriel-plan Postfix → LDAP → LMTP → Dovecot → IMAP, file d'attente comprise
|
|
```
|
|
|
|
Le même patron a ensuite été porté **sous** les services, au monde physique — mêmes pièces,
|
|
même refus d'écrire :
|
|
|
|
```
|
|
make frontiere-plan les règles de la frontière OPNsense contre leur devis
|
|
make proxmox-fw-plan le pare-feu est-ouest de l'hyperviseur contre le registre des flux
|
|
make sdn-plan la zone EVPN, ses VNets et la sortie des VRF
|
|
make underlay-plan l'underlay déclaré contre ce que le cluster porte vraiment
|
|
make placement-plan chaque VM est-elle là où le plan la met
|
|
```
|
|
|
|
*(Deux mesures voisines ne comparent à rien et ne portent donc pas le suffixe `-plan` :
|
|
`make mtu-mesurer` et `make versions-mesurer` relèvent un état, sans devis en face.)*
|
|
|
|
| Pièce | Rôle |
|
|
|---|---|
|
|
| un **playbook** (`playbooks/maintenance/devis-*.yml`) | **relève** le déclaré et le réel, dépose un JSON |
|
|
| un **script** (`scripts/devis_*.py`) | **compare**, affiche les écarts, sort en code 1 |
|
|
| `make deployer` | **répare** — ce n'est pas le rôle du devis |
|
|
|
|
**Trois règles qui font la différence entre un devis utile et un devis décoratif :**
|
|
|
|
**Le devis ne redéclare jamais ce qu'il vérifie.** Il charge les défauts du rôle et appelle les
|
|
résolveurs. Un contrôle qui recopie la valeur attendue ne contrôle rien — il se compare à
|
|
lui-même.
|
|
|
|
**Une vraie requête, jamais un `connect()`.** À travers un pare-feu qui fait de l'anti-usurpation,
|
|
toute connexion TCP réussit, même vers une adresse où rien n'existe. Et en TLS c'est le *client*
|
|
qui parle en premier : le silence après connexion ne distingue pas un service sain d'un trou.
|
|
Seul un échange applicatif complet tranche.
|
|
|
|
**Un code de retour n'est pas un verdict.** Un `502` *est* une réponse, et pourtant le service
|
|
est mort derrière.
|
|
|
|
---
|
|
|
|
## ③ Pourquoi c'est transférable
|
|
|
|
| Set-OPS | Équivalents ailleurs |
|
|
|---|---|
|
|
| preuves statiques | tests unitaires · *linters* · validation de schéma · `terraform validate` |
|
|
| devis de service | tests de bout en bout · sondes *black-box* · `terraform plan` sur l'état réel |
|
|
| relevé puis comparaison | *drift detection* — AWS Config, Chef `--why-run`, Puppet `--noop` |
|
|
|
|
Le mot que tout le monde emploie est **dérive** (*drift*) : l'écart qui s'installe entre ce qu'on
|
|
a déclaré et ce qui tourne. Aucun outil ne l'empêche ; ils aident seulement à la **voir**.
|
|
|
|
Et la vraie leçon n'est pas technique : **une garantie qui n'a jamais échoué n'est pas une
|
|
garantie, c'est une habitude.** Un contrôle qu'on n'a pas vu dire *non* ne prouve rien — il faut
|
|
l'éprouver dans les deux sens, en cassant volontairement ce qu'il surveille.
|
|
|
|
---
|
|
|
|
## ④ À toi de jouer
|
|
|
|
1. Lance les **dix** devis sur ta flotte — les cinq de service, puis les cinq
|
|
d'infrastructure. Note le temps que ça prend : quelques minutes pour ce qui demandait une
|
|
journée d'enquête à la main.
|
|
2. **Casse quelque chose exprès** — arrête un service publié, change un port — et relance le
|
|
devis concerné. S'il ne dit rien, c'est *lui* qu'il faut réparer, pas le service.
|
|
3. Cherche, dans ton propre outillage, une vérification qui n'a **jamais** échoué. Demande-toi si
|
|
c'est parce que tout va bien, ou parce qu'elle ne regarde rien.
|
|
|
|
| Terme | Ce que tu retiens |
|
|
|---|---|
|
|
| preuve statique | lit le **code** ; rapide, universelle, aveugle au réel |
|
|
| devis / *drift detection* | interroge le **système** ; seule réponse à « est-ce que ça marche ? » |
|
|
| test négatif | éprouver qu'un contrôle sait dire **non** |
|
|
|
|
Tu as appris **la différence entre valider du code et vérifier un système** — pas « les devis
|
|
Set-OPS ».
|