underlay : la frontiere entre les deux mondes, et l'instrument qui la mesure
Demande de l'exploitant : « il faut vraiment faire une distinction entre l'underlay et les
tenants. Definis bien la frontiere entre les deux mondes. L'underlay et son tenant doivent
avoir chacun sa voute. »
LA DOCTRINE (docs/frontiere-physique-virtuel.md) : qui possede quoi, ou ca vit, qui
l'administre. Et la regle qui la rend operante — UN TENANT NE DETIENT JAMAIS UN SECRET DU
MONDE PHYSIQUE. Aujourd'hui chaque tenant porte le jeton d'API du cluster ; patient 0 a du
le recopier pour exister. C'est la faute des neuf copies, appliquee aux secrets : une
valeur qui vit a N endroits diverge, et on ne peut plus en revoquer une sans les autres.
L'INSTRUMENT (`make underlay-plan`) confronte le fichier au reel : l'API du cluster pour
les adresses REELLEMENT portees, une sonde TCP pour ce qui repond. N'ecrit rien.
CE QU'IL A TROUVE, des le premier passage :
management 10.0.0.0/24, stockage 10.0.1.0/24, ceph 10.0.2-3.0/24 -> PERSONNE
transit 10.0.4.0/24, vxlan 10.0.5.0/24 -> occupes (3 noeuds)
portes par les noeuds et declares NULLE PART : 192.168.11.x (la vraie gestion),
10.11.5-7.x, 192.168.50.x, 10.1.110.254
La frontiere avait deja migre vers 10.17.0.1 ; les hyperviseurs, non. Le fichier decrivait
le monde d'avant — et c'est pour cela que la regle d'admin de patient 0 atterrissait sur
`wan`, ou elle n'aurait jamais laisse passer personne.
DEUX PRECAUTIONS ECRITES DANS L'INSTRUMENT, apprises en l'ecrivant :
- l'AUTORITE DEPEND DU ROLE. L'API de Proxmox connait ses hyperviseurs, et eux seuls.
Declarer un commutateur « porte par personne » parce que le cluster l'ignore, c'est
accuser le monde de ce que l'instrument ne voit pas.
- « pas joignable d'ici » n'est pas « absent ». Les reseaux de CHEMIN (transit, VXLAN,
stockage) ne sont jamais joignables de l'exterieur, par construction (D-78). Le premier
jet les declarait morts.
Le devis a donc corrige DEUX FOIS sa propre facon de mesurer avant de rendre un verdict.
RESTE, dans l'ordre : ecrire dans underlay.yml ce qui EST ; separer les voutes ; et alors
seulement appliquer la frontiere.
make verifier 41/41.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 16:31:35 -04:00
|
|
|
# La frontière entre les deux mondes — physique et virtuel
|
|
|
|
|
|
|
|
|
|
> **Pour qui :** l'**exploitant** et le **mainteneur**. Ce document tranche une question qui
|
|
|
|
|
> revenait à chaque décision : *qui possède quoi, et où ça vit ?*
|
|
|
|
|
|
|
|
|
|
Set-OPS manipule deux mondes qui se ressemblent et n'obéissent pas aux mêmes règles. Les
|
|
|
|
|
confondre a coûté plusieurs soirées ; les séparer proprement rend la plupart des questions
|
|
|
|
|
suivantes évidentes.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Les deux mondes
|
|
|
|
|
|
|
|
|
|
| | **Monde PHYSIQUE** — l'underlay | **Monde VIRTUEL** — le tenant |
|
|
|
|
|
|---|---|---|
|
|
|
|
|
| Ce que c'est | commutateurs, hyperviseurs, frontière, stockage, transport VXLAN | VM, applications, données |
|
|
|
|
|
| Possédé par | l'**hébergeur** | l'**organisation** |
|
|
|
|
|
| Adressage | bande basse du site : `10.<index>.0-15.x` | zones : `10.<index>.16+.x` |
|
|
|
|
|
| Décrit dans | `underlay.yml`, `proxmox-hebergeur.yml` | `plan/` |
|
|
|
|
|
| Monté par | le symlink `underlay.yml` | le symlink `instance` |
|
|
|
|
|
| Change quand | on touche au **matériel** | on touche au **service** |
|
|
|
|
|
| Ses secrets | jeton d'API Proxmox, clé d'API de la frontière, accès aux commutateurs | LDAP, forge, SSO, bases |
|
|
|
|
|
| Sa voûte | **la sienne**, chez l'hébergeur | `group_vars/all/vault.yml` |
|
|
|
|
|
|
|
|
|
|
**Les deux symlinks sont indépendants** (D-80) : `instance` dit *quel tenant*,
|
|
|
|
|
`underlay.yml` dit *sur quelle fabric*. Un tenant se déplace d'une fabric à l'autre sans
|
|
|
|
|
qu'on touche à son plan — c'est ce qui rend la portabilité possible.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## La règle qui rend la frontière opérante
|
|
|
|
|
|
|
|
|
|
> **Un tenant ne détient jamais un secret du monde physique.**
|
|
|
|
|
|
documentation : la tournee des 74 documents, parce qu un balayage ne lit pas
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
2026-09-06 16:18:23 -04:00
|
|
|
Chaque tenant a porté dans sa voûte le jeton d'API du cluster — patient 0 a dû le recopier
|
|
|
|
|
pour exister. C'était exactement la faute des **neuf copies** de la résolution d'instance,
|
|
|
|
|
appliquée aux secrets : une valeur qui vit à N endroits finit par diverger, et on ne peut
|
|
|
|
|
plus révoquer l'une sans révoquer les autres.
|
|
|
|
|
|
|
|
|
|
**C'est réglé depuis le 2026-08-22** : l'underlay a **sa propre voûte**
|
|
|
|
|
(`underlay.vault.yml`), chez l'hébergeur, à côté d'`underlay.yml`. Les opérations qui parlent
|
|
|
|
|
au matériel — cloner une VM, poser une zone SDN, écrire sur la frontière — l'y lisent : le
|
|
|
|
|
chemin se **dérive** du symlink `underlay.yml`, sans rien redéclarer
|
|
|
|
|
(`playbooks/proxmox/cloner_vm_debian.yml`). Les tenants n'y ont pas accès et n'en ont pas
|
|
|
|
|
besoin.
|
|
|
|
|
|
|
|
|
|
Deux compléments arrivés depuis, et qui achèvent la séparation :
|
|
|
|
|
|
|
|
|
|
- les **clés** aussi sont séparées (2026-08-28) : une voûte, **une clé**. Tant qu'un seul mot
|
|
|
|
|
de passe les ouvrait toutes, la séparation était organisationnelle, pas cryptographique ;
|
|
|
|
|
- **P25** refuse qu'une clé de l'hébergeur — nœuds, stockages, ponts, API — réapparaisse dans
|
|
|
|
|
un `group_vars` de tenant. La garde attrape la rechute : un `make config` lancé d'un autre
|
|
|
|
|
poste, une reprise à la main.
|
underlay : la frontiere entre les deux mondes, et l'instrument qui la mesure
Demande de l'exploitant : « il faut vraiment faire une distinction entre l'underlay et les
tenants. Definis bien la frontiere entre les deux mondes. L'underlay et son tenant doivent
avoir chacun sa voute. »
LA DOCTRINE (docs/frontiere-physique-virtuel.md) : qui possede quoi, ou ca vit, qui
l'administre. Et la regle qui la rend operante — UN TENANT NE DETIENT JAMAIS UN SECRET DU
MONDE PHYSIQUE. Aujourd'hui chaque tenant porte le jeton d'API du cluster ; patient 0 a du
le recopier pour exister. C'est la faute des neuf copies, appliquee aux secrets : une
valeur qui vit a N endroits diverge, et on ne peut plus en revoquer une sans les autres.
L'INSTRUMENT (`make underlay-plan`) confronte le fichier au reel : l'API du cluster pour
les adresses REELLEMENT portees, une sonde TCP pour ce qui repond. N'ecrit rien.
CE QU'IL A TROUVE, des le premier passage :
management 10.0.0.0/24, stockage 10.0.1.0/24, ceph 10.0.2-3.0/24 -> PERSONNE
transit 10.0.4.0/24, vxlan 10.0.5.0/24 -> occupes (3 noeuds)
portes par les noeuds et declares NULLE PART : 192.168.11.x (la vraie gestion),
10.11.5-7.x, 192.168.50.x, 10.1.110.254
La frontiere avait deja migre vers 10.17.0.1 ; les hyperviseurs, non. Le fichier decrivait
le monde d'avant — et c'est pour cela que la regle d'admin de patient 0 atterrissait sur
`wan`, ou elle n'aurait jamais laisse passer personne.
DEUX PRECAUTIONS ECRITES DANS L'INSTRUMENT, apprises en l'ecrivant :
- l'AUTORITE DEPEND DU ROLE. L'API de Proxmox connait ses hyperviseurs, et eux seuls.
Declarer un commutateur « porte par personne » parce que le cluster l'ignore, c'est
accuser le monde de ce que l'instrument ne voit pas.
- « pas joignable d'ici » n'est pas « absent ». Les reseaux de CHEMIN (transit, VXLAN,
stockage) ne sont jamais joignables de l'exterieur, par construction (D-78). Le premier
jet les declarait morts.
Le devis a donc corrige DEUX FOIS sa propre facon de mesurer avant de rendre un verdict.
RESTE, dans l'ordre : ecrire dans underlay.yml ce qui EST ; separer les voutes ; et alors
seulement appliquer la frontiere.
make verifier 41/41.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 16:31:35 -04:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Qui administre quoi, et depuis où
|
|
|
|
|
|
|
|
|
|
L'administration du monde physique se fait **depuis le tenant de l'hébergeur** : c'est lui
|
|
|
|
|
qui porte les outils, les clés et les traces. Le plan de gestion du site
|
|
|
|
|
(`10.<index>.0.0/24`) est la seule source autorisée à ouvrir SSH sur la flotte et à
|
|
|
|
|
franchir la frontière.
|
|
|
|
|
|
|
|
|
|
Ce n'est pas un détail de commodité. Une machine qui administre depuis l'extérieur des deux
|
|
|
|
|
mondes — un portable sur le réseau de la maison — n'est ni sauvegardée, ni reconstructible,
|
|
|
|
|
ni prouvée. Le jour où elle disparaît, l'écosystème est intact et personne ne peut plus y
|
|
|
|
|
entrer.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Ce que la confusion a coûté
|
|
|
|
|
|
|
|
|
|
**Une règle qui ne peut jamais correspondre.** `devis_opnsense` dérive l'interface d'une
|
|
|
|
|
règle de l'**attachement réel** de sa source (D-61), et cet attachement se lit dans
|
|
|
|
|
`underlay.yml`. Un plan d'administration absent du fichier est classé « distant », et sa
|
|
|
|
|
règle atterrit sur `wan`. Le 22 août, on s'apprêtait à poser 89 objets sur la frontière
|
|
|
|
|
avec une règle d'admin qui n'aurait jamais laissé passer personne.
|
|
|
|
|
|
|
|
|
|
**Un fichier qui décrit un monde disparu.** Mesuré le même jour :
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
management 10.0.0.0/24 déclaré → PERSONNE
|
|
|
|
|
stockage 10.0.1.0/24 déclaré → PERSONNE
|
|
|
|
|
ceph 10.0.2-3.0/24 déclaré → PERSONNE
|
|
|
|
|
transit 10.0.4.0/24 déclaré → occupé (3 nœuds)
|
|
|
|
|
vxlan 10.0.5.0/24 déclaré → occupé (3 nœuds)
|
|
|
|
|
|
|
|
|
|
et, portés par les nœuds sans être déclarés nulle part :
|
|
|
|
|
192.168.11.x 10.11.5-7.x 192.168.50.x 10.1.110.254
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
La frontière avait déjà migré vers `10.17.0.1` ; les hyperviseurs, non. Le fichier était
|
|
|
|
|
resté au monde d'avant.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## L'instrument
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
make underlay-plan # confronte le fichier au réel, n'écrit rien
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Il interroge l'API du cluster pour les adresses **réellement portées**, et sonde en TCP ce
|
|
|
|
|
qui répond. Deux précautions y sont inscrites, toutes deux apprises en l'écrivant :
|
|
|
|
|
|
|
|
|
|
- **l'autorité dépend du rôle.** L'API de Proxmox connaît ses hyperviseurs, et eux seuls.
|
|
|
|
|
Déclarer un commutateur « porté par personne » parce que le cluster l'ignore, c'est
|
|
|
|
|
accuser le monde de ce que l'instrument ne voit pas ;
|
|
|
|
|
- **« pas joignable d'ici » n'est pas « absent ».** Les réseaux de *chemin* (transit,
|
|
|
|
|
transport VXLAN, stockage) ne sont **jamais** joignables depuis l'extérieur, par
|
|
|
|
|
construction (D-78). Le premier jet du devis les déclarait morts.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
documentation : la tournee des 74 documents, parce qu un balayage ne lit pas
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
2026-09-06 16:18:23 -04:00
|
|
|
## La séquence — faite, dans cet ordre
|
|
|
|
|
|
|
|
|
|
Cette section était une liste de tâches ouvertes. **Les trois sont faites** ; on la garde
|
|
|
|
|
sous forme d'ordre parce que c'est l'ordre lui-même qui est la leçon — un site neuf le
|
|
|
|
|
rejouera tel quel.
|
|
|
|
|
|
|
|
|
|
- [x] **Reconnaître** — `make underlay-plan` confronte l'underlay *déclaré* au réel (API du
|
|
|
|
|
cluster + sondes). `underlay.yml` décrit ce qui **est**, pas ce qui était prévu :
|
|
|
|
|
chaque réseau porté et non déclaré est un réseau que le moteur ne sait pas classer.
|
|
|
|
|
- [x] **Séparer les voûtes** — fait le **2026-08-28**. Une voûte, une clé
|
|
|
|
|
(`scripts/voutes.py`, `ANSIBLE_VAULT_IDENTITY_LIST`) : le jeton Proxmox et la clé de
|
|
|
|
|
la frontière vivent dans `underlay.vault.yml`, hors de toute voûte de tenant. La
|
|
|
|
|
séparation devait précéder la distribution des clés aux runners — sans elle, poser
|
|
|
|
|
« la » clé sur le plus petit locataire lui donnait les secrets de l'hébergeur.
|
|
|
|
|
- [x] **Appliquer la frontière** — ses règles dépendent des deux points ci-dessus, et
|
|
|
|
|
elles en dérivent : P43 mesure que le devis de la frontière retrouve les machines du
|
|
|
|
|
plan (7 machines, 104 règles du site).
|