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 []: