diff --git a/CHANGELOG.md b/CHANGELOG.md index bc056b8..ec9a44a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,10 +54,26 @@ pourtant les 15 roues « absentes du dépôt du site » : `--check` ne télécha du contrôleur reste vide, et le message accusait le dépôt à tort. Les deux messages se taisent désormais en simulation. +### La reconstruction de Technolibre s'arrête à l'insémination + +Sur `55f42ad`, à 10:45 : les 15 roues sont bien prises **au dépôt du site** (repli sauté), +puis « Destination directory /opt/setops/.roues-hors-ligne does not exist ». L'ancienne +copie du cache entier (`src: dossier/`) créait sa destination ; la copie fichier par fichier +du verrou ne la crée pas. La simulation sur l'ancien `ops-01` ne pouvait pas le voir : le +dossier y existait, et les copies sont sautées en `--check`. Les deux dossiers (roues, +collections) sont désormais assurés avant la copie, et `test_verrou_runner.py` exige, pour +toute copie fichier par fichier, que son dossier soit créé avant (témoin : l'ancien code +échoue sur les deux copies). + +Vu dans le même temps à la frontière : `site-pki-01` → `10.37.32.1:8006` bloqué, environ +1 270 fois par jour depuis au moins le 2026-10-07. C'est la sonde de connectivité +(`nftables_baseline`, entrée du 2026-10-05) qui vérifie chaque minute que la passerelle ne +répond **pas** sur l'API Proxmox ; le blocage est le résultat attendu. + ### Pas encore fait -Reconstruire les deux locataires sur ce code, pour prouver qu'aucun montage ne sort vers -PyPI ni Galaxy. +Reprendre la reconstruction de Technolibre (`DEPUIS=inseminer`), puis Chezlepro, pour prouver +qu'aucun montage ne sort vers PyPI ni Galaxy. ## 2026-10-09 (120) — Chezlepro reconstruite sur `3afb756` : les deux locataires sur le même commit diff --git a/roles/serveur_ops/tasks/main.yml b/roles/serveur_ops/tasks/main.yml index 01fa159..909b267 100644 --- a/roles/serveur_ops/tasks/main.yml +++ b/roles/serveur_ops/tasks/main.yml @@ -201,6 +201,18 @@ # LES ROUES DU VERROU, ET ELLES SEULES. Copier le cache entier deposait aussi les versions # d'hier (deux `cryptography`, deux `urllib3`...) ; `--no-index` choisissait alors la plus # haute, que personne n'avait choisie. +# LE DOSSIER D'ABORD (2026-10-09). L'ancienne copie du cache ENTIER (`src: dossier/`) creait +# sa destination ; une copie fichier par fichier ne la cree pas. Sur un runner neuf, la +# reconstruction de Technolibre s'est arretee la (« Destination directory … does not exist ») +# — invisible en simulant sur un runner ou le dossier existait deja. +- name: Assurer le depot des roues sur le runner + ansible.builtin.file: + path: "{{ serveur_ops_roues_depot }}" + state: directory + owner: "{{ serveur_ops_utilisateur }}" + group: "{{ serveur_ops_utilisateur }}" + mode: "0755" + - name: Deposer sur le runner les roues du verrou ansible.builtin.copy: src: "{{ serveur_ops_cache_roues }}/{{ item.nom }}" @@ -446,6 +458,14 @@ - not ansible_check_mode - not item.stat.exists or item.stat.checksum != item.item.sha256 +- name: Assurer le depot des collections sur le runner + ansible.builtin.file: + path: "{{ serveur_ops_racine }}/.collections-hors-ligne" + state: directory + owner: "{{ serveur_ops_utilisateur }}" + group: "{{ serveur_ops_utilisateur }}" + mode: "0755" + - name: Deposer sur le poste les collections du verrou register: serveur_ops_depot_collections ansible.builtin.copy: diff --git a/scripts/tests/test_verrou_runner.py b/scripts/tests/test_verrou_runner.py index 42050d0..c536cea 100644 --- a/scripts/tests/test_verrou_runner.py +++ b/scripts/tests/test_verrou_runner.py @@ -69,6 +69,17 @@ def main() -> int: texte = "\n".join(taches) verifier('"download"' not in texte and "collection download" not in texte, "plus aucune resolution contre PyPI ou Galaxy dans serveur_ops (pip / collection download)") + # Une copie fichier par fichier ne cree pas son dossier (2026-10-09 : reconstruction de + # Technolibre arretee sur un runner neuf). Chaque dossier vise doit etre assure AVANT. + assures: set[str] = set() + for t in yaml.safe_load((RACINE / "roles/serveur_ops/tasks/main.yml").read_text()): + f = t.get("ansible.builtin.file") or {} + if f.get("state") == "directory": + assures.add(f["path"]) + c = t.get("ansible.builtin.copy") or {} + if str(c.get("dest", "")).endswith("/{{ item.nom }}"): + dossier = c["dest"].rsplit("/", 1)[0] + verifier(dossier in assures, f"« {t['name']} » : son dossier est cree avant ({dossier})") verifier("verrou-runner.yml" in (RACINE / "roles/serveur_artefacts/tasks/main.yml").read_text(), "le site tient le verrou du runner") if ECHECS: