From d94fca490f44fab0f748bf76c264b4612133a606 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Sun, 23 Aug 2026 12:24:28 -0400 Subject: [PATCH] poste : le second symlink, celui qui separe exploiter d'engendrer Le poste ne clonait que le moteur et son plan : il savait configurer des machines existantes, pas en creer. Placer une VM demande de savoir sur quelle fabric la poser. Patient 0 n'a pas d'underlay a lui -- il est TENANT de SITE-Chezlepro. Son poste porte donc les deux symlinks de D-80, et quatre depots : le moteur, son plan, la fabric qui le porte, les modeles. underlay.vault.yml reste hors du genome : le poste lit la CARTE du monde physique, jamais ses cles. Mesure depuis ops-01 : `make instancier` rend un diff vide sans aucun secret, `make underlay-plan` refuse faute de voute. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 41 +++++++++++++++++++++++++++++ roles/serveur_ops/defaults/main.yml | 16 ++++++++++- roles/serveur_ops/tasks/main.yml | 16 +++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 478b4f4..42ffe97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -121,6 +121,47 @@ make aide -> « Set-OPS — moteur d ecosystemes numeriques souverains » L'écosystème lit son propre génome, depuis sa propre forge, avec son propre Ansible. +### Le second symlink : exploiter n'est pas engendrer + +Le poste ne clonait que le moteur et son plan. Il savait donc **configurer** des machines +existantes, pas en **créer** : placer une VM demande de savoir sur quel nœud, quel +stockage, quel pont — c'est-à-dire l'underlay. + +Patient 0 n'a pas de fabric à lui : il est **tenant de `SITE-Chezlepro`**, au même titre +qu'OPS-Chezlepro. Son poste porte donc désormais les deux symlinks de D-80 : + +``` +Set-OPS-public/instance -> /opt/setops/OPS-Patient0 +Set-OPS-public/underlay.yml -> /opt/setops/SITE-Chezlepro/underlay.yml +``` + +et quatre dépôts au lieu de deux — le moteur, son plan, la fabric qui le porte, et les +modèles (un descendant ne se crée pas à partir de rien). + +`ops-chezlepro` reste volontairement **non cloné** : c'est le plan d'un tenant voisin, +que patient 0 n'a aucune raison de détenir. Il est présent sur sa forge par le poussage +initial du génome — à revoir. + +### Où passe exactement la ligne + +Mesuré depuis `ops-01`, sous son propre compte : + +``` +make instancier DIFF VIDE : le plan reproduit exactement l'inventaire actuel +make underlay-plan Aucune voute sous /opt/setops/SITE-Chezlepro +``` + +Patient 0 régénère sa propre structure, sur sa propre machine, **sans aucun secret**. Et +dès qu'il s'agit de toucher la fabric, il est arrêté faute de voûte — `underlay.vault.yml` +est hors dépôt, donc absent du génome. Le poste lit la **carte** du monde physique, jamais +ses **clés**. + +Ce que cette carte expose, en revanche, mérite d'être dit : `underlay.yml` décrit les +quinze équipements du site, le VLAN de gestion `10.17.0.0/24` — celui-là même où la +frontière interdit à patient 0 d'entrer — et les accès OOB/IPMI. Aucun justificatif, mais +toute la topologie. C'est le prix de l'autonomie d'un tenant sur la fabric d'autrui, et il +se paie en connaissance. + ### Patient 0 Fonction `ops` (zone Services-infra), machine `ops-01` — adressage dérivé `10.29.19.41`, diff --git a/roles/serveur_ops/defaults/main.yml b/roles/serveur_ops/defaults/main.yml index 1b9e2aa..e21211e 100644 --- a/roles/serveur_ops/defaults/main.yml +++ b/roles/serveur_ops/defaults/main.yml @@ -55,8 +55,22 @@ serveur_ops_depots: - { depot: "set-ops-public", dest: "Set-OPS-public", role: "moteur" } - { depot: "ops-patient0", dest: "OPS-Patient0", role: "instance" } -# L'instance que le poste pilote par défaut (symlink `instance` du moteur). +# --- LES DEUX SYMLINKS (D-80) ------------------------------------------------ +# +# `instance` dit QUEL tenant on pilote. +# `underlay.yml` dit SUR QUELLE FABRIC il repose. +# +# Les deux sont independants, et le second manquait. Un poste qui ne connaît que son +# plan sait CONFIGURER des machines existantes ; il ne sait pas en CREER. Placer une VM +# demande de savoir sur quel nœud, quel stockage, quel pont — c'est-à-dire l'underlay. +# Sans lui, le poste est un exploitant, pas un géniteur. +# +# CE QUE LE POSTE N'AURA PAS POUR AUTANT : `underlay.vault.yml`, qui porte les secrets du +# monde physique. Il est hors dépôt (gitignore), donc absent du génome. Le poste lit la +# CARTE de la fabric, pas ses clés. serveur_ops_instance: "OPS-Patient0" +# Vide = le poste ne pose pas de lien `underlay.yml` (il configure, il n'engendre pas). +serveur_ops_underlay: "" # --- CLÉ SSH DU POSTE -------------------------------------------------------- # diff --git a/roles/serveur_ops/tasks/main.yml b/roles/serveur_ops/tasks/main.yml index 404189a..5328946 100644 --- a/roles/serveur_ops/tasks/main.yml +++ b/roles/serveur_ops/tasks/main.yml @@ -166,6 +166,22 @@ force: true when: not ansible_check_mode +# LE SECOND SYMLINK. Sans lui, le poste sait configurer des machines qui existent ; il ne +# sait pas en creer, faute de savoir sur quelle fabric les poser. C'est la difference +# entre exploiter et engendrer. +- name: Désigner la fabric sur laquelle l'écosystème repose + ansible.builtin.file: + src: "{{ serveur_ops_racine }}/{{ serveur_ops_underlay }}/underlay.yml" + dest: >- + {{ serveur_ops_racine }}/{{ (serveur_ops_depots | selectattr('role', 'eq', 'moteur') | first).dest }}/underlay.yml + state: link + owner: "{{ serveur_ops_utilisateur }}" + group: "{{ serveur_ops_utilisateur }}" + force: true + when: + - serveur_ops_underlay | length > 0 + - not ansible_check_mode + # --- LA CLÉ DU POSTE --------------------------------------------------------- # # Le poste se fabrique sa propre paire, distincte de celle du mainteneur. Deux