diff --git a/CHANGELOG.md b/CHANGELOG.md index 16ef2fd..0fa9864 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 : diff --git a/roles/client_pki/tasks/main.yml b/roles/client_pki/tasks/main.yml index a5b86e3..8208c01 100644 --- a/roles/client_pki/tasks/main.yml +++ b/roles/client_pki/tasks/main.yml @@ -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: diff --git a/roles/serveur_forgejo/defaults/main.yml b/roles/serveur_forgejo/defaults/main.yml index f642906..ad5639e 100644 --- a/roles/serveur_forgejo/defaults/main.yml +++ b/roles/serveur_forgejo/defaults/main.yml @@ -55,7 +55,17 @@ serveur_forgejo_connexion_locale: false # --- SSO OIDC (Keycloak, realm applicatif) — « Se connecter avec » --- # 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//callback serveur_forgejo_oidc_client_id: "forgejo" serveur_forgejo_oidc_client_secret: "{{ vault_forgejo_oidc | default('') }}" # voûte (vault_forgejo_oidc) diff --git a/roles/serveur_forgejo/tasks/main.yml b/roles/serveur_forgejo/tasks/main.yml index 9703e35..ad714b0 100644 --- a/roles/serveur_forgejo/tasks/main.yml +++ b/roles/serveur_forgejo/tasks/main.yml @@ -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: diff --git a/roles/serveur_step_ca/tasks/main.yml b/roles/serveur_step_ca/tasks/main.yml index 37d1eb4..73b6e52 100644 --- a/roles/serveur_step_ca/tasks/main.yml +++ b/roles/serveur_step_ca/tasks/main.yml @@ -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: