From a6713ffdcdab4800083398025d9dc24bde074af0 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 25 Aug 2026 09:34:02 -0400 Subject: [PATCH] =?UTF-8?q?doctrine=20:=20patient=200=20n'est=20pas=20un?= =?UTF-8?q?=20tenant=20=E2=80=94=20corriger=20la=20raison,=20garder=20le?= =?UTF-8?q?=20geste?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le commit dc92f01 justifiait le retrait des roles de site de patient 0 par « patient 0 est un tenant comme les autres, c'est meme tout ce qu'il prouve ». C'est FAUX. Un tenant ordinaire existe POUR SES GENS : Chezlepro heberge de l'identite, du courriel, de la collaboration. Patient 0 n'heberge que LA LIGNEE. Il est l'ecosysteme d'origine et le detenteur du genome, et il le reste. Ce qui le quitte, ce sont deux responsabilites de SITE qu'il tenait faute d'un SITE capable de les porter — a l'epoque un site n'etait qu'un fichier de carte, sans machines. Le SITE existe desormais comme objet a part entiere : le geste etait donc juste, seule sa raison ne l'etait pas. Le texte est corrige plutot qu'efface, dans le CHANGELOG comme dans les fichiers : une doctrine juste appuyee sur une raison fausse finit toujours par se retourner. 42 preuves vertes. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 20 +++++++++++++++----- Makefile | 11 ++++++++++- docs/audit/preuve-2026-08-25.md | 2 +- scripts/site_inventaire.py | 24 ++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e5bcf0..e1e4866 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -127,12 +127,22 @@ téléchargement. quelle machine de la flotte. L'oublier aurait donné à la machine la plus puissante du site la protection la plus faible. -### Patient 0 rendu à sa condition de tenant +### Patient 0 rend ses responsabilités de site -Son plan déclarait encore `serveur_ops_site` et `serveur_cache_site` — il tenait ces -rôles parce que le SITE n'existait pas comme objet à lui. Il existe. Un tenant qui -garderait ces rôles s'arrogerait un pouvoir sur ses voisins, et patient 0 est un tenant -comme les autres : c'est même tout ce qu'il prouve. +> **Corrigé le 2026-08-25.** Cette section affirmait que « patient 0 est un tenant comme +> les autres : c'est même tout ce qu'il prouve ». **C'est faux**, et le texte est corrigé +> plutôt qu'effacé. Un tenant ordinaire existe pour ses gens ; patient 0 n'héberge que la +> **lignée**. Il est l'écosystème d'origine et le détenteur du génome, et il le reste. +> Le geste était juste, la raison ne l'était pas — et une doctrine juste appuyée sur une +> raison fausse finit toujours par se retourner. + +Son plan déclarait encore `serveur_ops_site` et `serveur_cache_site`. Il les tenait non +par nature mais **faute d'un SITE capable de les porter** : à l'époque, un site n'était +qu'un fichier de carte, sans machines à lui. + +Le SITE existe désormais comme objet à part entière — machines déclarées dans son +underlay, sur leur propre réseau de fabric, avec leur voûte et leur runner. Matérialiser +et servir le cache aux voisins lui reviennent. Porter la lignée reste chez patient 0. Bilan au devis : **26 règles à créer, 5 à retirer** (dont les trois périmées de patient 0). diff --git a/Makefile b/Makefile index abe4e8b..2bb40dd 100644 --- a/Makefile +++ b/Makefile @@ -737,7 +737,16 @@ site-appliquer: ## Applique un role aux machines du site — GROUPE= dict: if erreurs: raise SystemExit("underlay.yml refuse :\n - " + "\n - ".join(erreurs)) + # L'IDENTITE DU SITE. Un tenant tire `domaine_interne` et `organisation` de son plan, + # via `instancier`. Un site n'a pas de plan : il les declare dans sa carte, et c'est + # ici qu'ils deviennent des variables d'inventaire. Sans eux, un role partage comme + # `serveur_forgejo` construirait des noms d'hote a partir de rien. + site = u.get("site") or {} + communes: dict = {} + if site.get("domaine"): + communes["domaine_interne"] = site["domaine"] + if site.get("organisation"): + communes["organisation"] = site["organisation"] + # LE REBOND, DECLARE PLUTOT QUE PASSE EN LIGNE DE COMMANDE. Le poste n'a pas de route + # vers le segment du site ; la frontiere y est adjacente. Le jour ou une route directe + # existe, on retire `rebond:` de la carte et rien d'autre ne bouge. + # Le socle ne pose `/etc/resolv.conf` que si cette variable existe. Sans elle, les + # machines naissent sans resolveur — et l'echec ressemble a un probleme de reseau. + if site.get("dns_amorcage"): + communes["dns_amorcage"] = str(site["dns_amorcage"]) + if site.get("cle_ssh"): + communes["ansible_ssh_private_key_file"] = site["cle_ssh"] + if site.get("rebond"): + communes["ansible_ssh_common_args"] = ( + f"-o ProxyJump={site['rebond']} -o StrictHostKeyChecking=no") + par_reseau = {r.get("nom"): r for r in U.reseaux(u)} hostvars: dict[str, dict] = {} groupes: dict[str, list[str]] = {} @@ -73,6 +96,7 @@ def inventaire() -> dict: # un site et un tenant peut avoir besoin de savoir de quel cote il tourne — # par exemple pour ne PAS chercher un plan la ou il n'y en a pas. "setops_site": True, + **communes, } groupes.setdefault(GROUPE_SOCLE, []).append(nom) for service in m.get("services") or []: