From 34e961fb61f60040da0b784e4c032abfd1fe06f3 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Fri, 9 Oct 2026 11:35:18 -0400 Subject: [PATCH] serveur_ops : la liste hors ligne des collections porte les vraies versions Le requirements.yml genere portait version: \1 (regex_replace dans un bloc YAML) ; ansible-galaxy refusait, et la reprise de la reconstruction de Technolibre s'est arretee apres avoir pris roues et collections au site. Version tiree du nom par decoupage, sans expression reguliere ; rejoue sur le poste, les trois collections s'installent hors ligne. test_verrou_runner.py rend desormais le fichier avec Jinja2 et compare. 94 preuves. CHANGELOG (121). Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 10 ++++++++++ roles/serveur_ops/tasks/main.yml | 2 +- scripts/tests/test_verrou_runner.py | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec9a44a..8bfd401 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,16 @@ collections) sont désormais assurés avant la copie, et `test_verrou_runner.py` toute copie fichier par fichier, que son dossier soit créé avant (témoin : l'ancien code échoue sur les deux copies). +Reprise sur `422b688`, 11:25 : les roues déposées, Ansible et les bibliothèques installés +hors ligne, les 3 collections prises **au site** (repli sauté) ; puis `ansible-galaxy` refuse : +« Non integer values in LooseVersion ('\1') ». Le `requirements.yml` généré portait +`version: \1` : dans un bloc `|`, le `'\\1'` de `regex_replace` garde ses deux barres +obliques inverses, et le remplacement rend un `\1` littéral. Rejoué sur le poste, la tâche +du rôle telle quelle rend trois `\1` ; remplacée par un découpage sans expression régulière (`replace('.tar.gz', '')` puis `split('-') | last`), +elle rend `1.6.2`, `10.3.0`, `3.10.2`, et `ansible-galaxy collection install` installe les +trois archives (sommes du verrou vérifiées). Le test vérifiait le modèle, jamais le fichier : +il **rend** désormais la liste avec Jinja2 et compare ses versions à `requirements.yml`. + 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 diff --git a/roles/serveur_ops/tasks/main.yml b/roles/serveur_ops/tasks/main.yml index 909b267..01c2cf0 100644 --- a/roles/serveur_ops/tasks/main.yml +++ b/roles/serveur_ops/tasks/main.yml @@ -493,7 +493,7 @@ collections: {% for c in serveur_ops_verrou.collections %} - name: {{ c.nom }} - version: {{ c.nom | regex_replace('^.*-([0-9][^-]*)[.]tar[.]gz$', '\\1') }} + version: {{ (c.nom | replace('.tar.gz', '')).split('-') | last }} {% endfor %} when: not ansible_check_mode diff --git a/scripts/tests/test_verrou_runner.py b/scripts/tests/test_verrou_runner.py index c536cea..a53a145 100644 --- a/scripts/tests/test_verrou_runner.py +++ b/scripts/tests/test_verrou_runner.py @@ -14,6 +14,7 @@ import re import sys from pathlib import Path +import jinja2 import yaml RACINE = Path(__file__).resolve().parents[2] @@ -80,6 +81,19 @@ def main() -> int: 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})") + # LE FICHIER RENDU, PAS LE MODELE (2026-10-09). `'\\1'` dans un bloc `|` restait `\1` : + # `ansible-galaxy` refusait « Non integer values in LooseVersion ('\1') », et la + # reconstruction de Technolibre s'est arretee. Rendu ici avec Jinja2 seul, comme le runner. + tache = next(t for t in yaml.safe_load((RACINE / "roles/serveur_ops/tasks/main.yml").read_text()) + if t.get("name") == "Ecrire la liste hors ligne des collections du verrou") + try: + rendu = yaml.safe_load(jinja2.Template(tache["ansible.builtin.copy"]["content"]).render( + serveur_ops_verrou={"collections": colls}))["collections"] + obtenues = sorted(f"{c['name']}={c['version']}" for c in rendu) + except Exception as e: # un filtre propre a Ansible, une syntaxe cassee : c'est un echec + obtenues = [f"rendu impossible : {e}"] + voulues = sorted(f"{c['name'].replace('.', '-')}-{c['version']}.tar.gz={c['version']}" for c in req) + verifier(obtenues == voulues, f"la liste hors ligne rendue porte les vraies versions ({obtenues})") verifier("verrou-runner.yml" in (RACINE / "roles/serveur_artefacts/tasks/main.yml").read_text(), "le site tient le verrou du runner") if ECHECS: