patient 0 debout — et quatre defauts que seul un ecosysteme DIFFERENT pouvait montrer
Some checks are pending
verifier / verifier (push) Waiting to run

Quatre machines, zero echec, la forge repond (service actif, ecoute 3000, HTTP 200).
forge-01 121 taches, infra-pki-01 109, infra-edge-01 92, infra-dns-01 84.

1. UN TIERS INTERMITTENT ARRETAIT TOUT. `packages.smallstep.com` repond une fois sur deux ;
   `get_url` abandonne a 10 s sans reprise. Mesure AVANT d'accuser le reseau : DNS
   resolvait, la poignee TLS aboutissait, 138 Ko depuis deb.debian.org passaient en 0,09 s,
   et le chemin acceptait 1450 octets en refusant 1500 — l'attendu exact en overlay. Le
   reseau n'y etait pour rien. Reprises posees sur les trois telechargements du chemin
   critique (serveur_step_ca, client_pki, serveur_forgejo). Une dizaine d'autres restent
   sans reprise : liste dans le CHANGELOG.

2. UN `register` A ECRASE UN CHEMIN DE FICHIER. En posant la reprise, j'ai enregistre dans
   `client_pki_cle`, nom que le role utilisait deja pour la cle privee. L'ecart s'est vu 70
   taches plus loin : `step ca certificate` recevait un dict serialise a la place du
   fichier et refusait « too many positional arguments ». Un register ecrit dans l'espace
   de noms de TOUT le role.

3. LE SSO SE DECLARAIT AU LIEU DE SE DERIVER. `serveur_forgejo_oidc_actif: true` en dur
   faisait cabler une source OAuth2 vers un Keycloak inexistant. Derive desormais de
   l'inventaire. Quatrieme manifestation en deux jours de la meme hypothese — le moteur
   supposait l'ecosysteme COMPLET — apres les intrants (P32), les bases (P35) et les
   dependances causales.

AUCUN de ces defauts n'etait visible sur Chezlepro, qui porte tout et tournait deja. Ils ne
pouvaient apparaitre qu'au premier ecosysteme DIFFERENT.

make verifier 41 OK, 0 echec, 0 saute ; make test inchange.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-23 02:53:44 -04:00
parent 4af1fcd0e2
commit 15cdb7d454
5 changed files with 112 additions and 1 deletions

View file

@ -1,5 +1,62 @@
# CHANGELOG — Set-OPS
## 2026-08-23 — Patient 0 est debout
Quatre machines, zéro échec, et la forge répond.
```
forge-01 121 tâches forgejo actif, écoute 3000, HTTP 200
infra-pki-01 109
infra-edge-01 92
infra-dns-01 84
```
Le premier écosystème **né du moteur corrigé** — et le déploiement a servi de révélateur :
quatre défauts, tous invisibles sur une flotte déjà debout.
### Un serveur tiers intermittent arrêtait tout
`packages.smallstep.com` répond une fois sur deux : la même URL pend, puis rend 200 en
0,48 s au second essai. Le défaut de `get_url` est **10 secondes et aucune reprise** — le
socle échouait donc sur la première machine.
Avant d'accuser le réseau, on a mesuré : DNS résolvait, la poignée TLS aboutissait
(`Verify return code: 0`), 138 Ko depuis `deb.debian.org` passaient en 0,09 s, et le chemin
acceptait 1450 octets en refusant 1500 — exactement l'attendu en overlay. **Le réseau n'y
était pour rien.** Reprises posées sur les trois téléchargements du chemin critique.
Audit au passage : une dizaine d'autres téléchargements de tiers restent sans reprise.
### Un `register` a écrasé un chemin de fichier
En ajoutant la reprise, j'ai enregistré dans `client_pki_cle` — un nom que le rôle utilise
**déjà** pour le chemin de la clé privée. L'écart ne s'est pas vu là : **soixante-dix
tâches plus loin**, `step ca certificate` recevait un dict sérialisé à la place du fichier
de clé et refusait « too many positional arguments ».
> Un `register` écrit dans l'espace de noms de **tout le rôle**. Le nom est désormais long
> à dessein.
### Le SSO se déclarait au lieu de se dériver
`serveur_forgejo_oidc_actif: true` en dur : la forge tentait de câbler une source OAuth2
vers un Keycloak qui n'existe pas dans un écosystème minimal. Il se **dérive** maintenant
de l'inventaire — un groupe `serveur_keycloak` sans hôte, c'est un écosystème sans identité
fédérée.
**Quatrième manifestation en deux jours** de la même hypothèse — le moteur supposait
l'écosystème complet — après les intrants (P32), les bases (P35) et les dépendances
causales.
### Ce que ça vaut
Aucun de ces quatre défauts n'était visible sur Chezlepro, qui porte tout et tournait déjà.
Ils ne pouvaient apparaître qu'au premier écosystème **différent** — c'est exactement ce
qu'on attendait de patient 0, et il l'a rendu avant même de servir.
`make verifier` : 41 OK, 0 échec, 0 sauté.
## 2026-08-23 — Un boîtier injoignable n'est pas un boîtier vide
L'exploitant lance `make frontiere-appliquer` dans son propre terminal. Résultat :

View file

@ -45,6 +45,9 @@
path: "{{ client_pki_depot_cle_fichier }}"
register: telecharger_la_cle_de_signature_smallste_present
# Un serveur tiers intermittent ne doit pas arreter un deploiement de quarante
# minutes (mesure du 2026-08-23 : la meme URL pend, puis rend 200 en 0,48 s au
# second essai). Defaut de `get_url` : 10 s et aucune reprise.
- name: Telecharger la cle de signature Smallstep
when: not telecharger_la_cle_de_signature_smallste_present.stat.exists
ansible.builtin.get_url:
@ -53,6 +56,11 @@
owner: root
group: root
mode: "0644"
timeout: 30
register: client_pki_cle_depot_telechargee
retries: 5
delay: 6
until: client_pki_cle_depot_telechargee is succeeded
- name: Ajouter le depot apt Smallstep
ansible.builtin.template:

View file

@ -55,7 +55,17 @@ serveur_forgejo_connexion_locale: false
# --- SSO OIDC (Keycloak, realm applicatif) — « Se connecter avec <organisation> » ---
# Requiert client_pki (confiance step_ca) + résolution de l'hôte Keycloak (plancher/DNS).
# Le client OIDC doit exister dans le realm (serveur_keycloak_clients).
serveur_forgejo_oidc_actif: true
# LE SSO SUIT L'EXISTENCE D'UN FOURNISSEUR D'IDENTITE — il ne se declare pas (2026-08-23).
#
# `true` en dur faisait echouer le deploiement de tout ecosysteme SANS Keycloak : la forge
# tentait de cabler une source OAuth2 vers un fournisseur qui n'existe pas. C'est la
# quatrieme fois en deux jours que la meme hypothese se paie — le moteur supposait
# l'ecosysteme COMPLET, apres les intrants (P32), les bases (P35) et les dependances
# causales.
#
# Derive de l'inventaire : un groupe `serveur_keycloak` sans hote, c'est un ecosysteme sans
# identite federee. Surchargeable pour un IdP externe au plan.
serveur_forgejo_oidc_actif: "{{ (groups['serveur_keycloak'] | default([])) | length > 0 }}"
serveur_forgejo_oidc_nom: "{{ organisation | default('organisation') | lower | replace(' ', '-') }}" # slug du callback : /user/oauth2/<nom>/callback
serveur_forgejo_oidc_client_id: "forgejo"
serveur_forgejo_oidc_client_secret: "{{ vault_forgejo_oidc | default('') }}" # voûte (vault_forgejo_oidc)

View file

@ -99,31 +99,48 @@
become: false
when: not serveur_forgejo_binaire_present.stat.exists
# Un serveur tiers intermittent ne doit pas arreter un deploiement de quarante minutes
# (mesure du 2026-08-23 : la meme URL pend, puis rend 200 en 0,48 s au second essai).
# Defaut de `get_url` : 10 s et aucune reprise.
- name: Télécharger le binaire Forgejo dans le cache du contrôleur (une seule fois)
ansible.builtin.get_url:
url: "{{ serveur_forgejo_url }}"
dest: "{{ serveur_forgejo_cache_local }}/forgejo-{{ serveur_forgejo_version }}"
mode: "0644"
timeout: 30
delegate_to: localhost
become: false
when:
- not serveur_forgejo_binaire_present.stat.exists
- not (serveur_forgejo_cache_present.stat.exists | default(false))
register: serveur_forgejo_bin
retries: 5
delay: 6
until: serveur_forgejo_bin is succeeded
# VERIFIER LA SIGNATURE AVANT DE POSER UN BINAIRE EXECUTABLE SUR UN HOTE.
#
# C'est un binaire, pas une archive de donnees : ce qu'on depose ici s'execute en tant que
# service. La verification tourne sur le CONTROLEUR, contre la cle versionnee du depot et
# l'empreinte PRIMAIRE epinglee — voir `defaults/main.yml` pour la raison de la primaire.
# Un serveur tiers intermittent ne doit pas arreter un deploiement de quarante minutes
# (mesure du 2026-08-23 : la meme URL pend, puis rend 200 en 0,48 s au second essai).
# Defaut de `get_url` : 10 s et aucune reprise.
- name: Récupérer la signature détachée du binaire
ansible.builtin.get_url:
url: "{{ serveur_forgejo_signature_url }}"
dest: "{{ serveur_forgejo_cache_local }}/forgejo-{{ serveur_forgejo_version }}.asc"
mode: "0644"
timeout: 30
force: true
delegate_to: localhost
become: false
when: not serveur_forgejo_binaire_present.stat.exists
register: serveur_forgejo_sig
retries: 5
delay: 6
until: serveur_forgejo_sig is succeeded
- name: Vérifier la signature du binaire contre l empreinte épinglée
ansible.builtin.command:

View file

@ -31,6 +31,20 @@
register: telecharger_la_cle_de_signature_smallste_present
- name: Telecharger la cle de signature Smallstep
# UN SERVEUR TIERS QUI REPOND UNE FOIS SUR DEUX NE DOIT PAS ARRETER UN DEPLOIEMENT DE
# QUARANTE MINUTES (mesure du 2026-08-23, premier deploiement de patient 0).
#
# `packages.smallstep.com` est intermittent : la meme URL pend au premier essai et rend
# 200 en 0,48 s au second. Le defaut de `get_url` est un delai de 10 secondes et AUCUNE
# reprise — le socle echouait donc sur la premiere machine, avant meme d'avoir pose le
# resolveur des autres.
#
# Mesure faite avant d'accuser : DNS resolvait, la poignee TLS aboutissait
# (`Verify return code: 0`), un transfert de 138 Ko depuis deb.debian.org passait en
# 0,09 s, et le chemin acceptait 1450 octets et refusait 1500 — exactement l'attendu en
# overlay. Le reseau n'y etait pour rien.
#
# Meme idiome que les roles Keycloak et Forgejo devant leurs propres tiers.
when: not telecharger_la_cle_de_signature_smallste_present.stat.exists
ansible.builtin.get_url:
url: "{{ serveur_step_ca_depot_cle_url }}"
@ -38,6 +52,11 @@
owner: root
group: root
mode: "0644"
timeout: 30
register: serveur_step_ca_cle
retries: 5
delay: 6
until: serveur_step_ca_cle is succeeded
- name: Ajouter le depot apt Smallstep
ansible.builtin.template: