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 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-10-09 11:35:18 -04:00
parent 422b68846b
commit 34e961fb61
3 changed files with 25 additions and 1 deletions

View file

@ -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

View file

@ -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

View file

@ -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: