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:
parent
422b68846b
commit
34e961fb61
3 changed files with 25 additions and 1 deletions
10
CHANGELOG.md
10
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
|
toute copie fichier par fichier, que son dossier soit créé avant (témoin : l'ancien code
|
||||||
échoue sur les deux copies).
|
é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
|
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é
|
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
|
(`nftables_baseline`, entrée du 2026-10-05) qui vérifie chaque minute que la passerelle ne
|
||||||
|
|
|
||||||
|
|
@ -493,7 +493,7 @@
|
||||||
collections:
|
collections:
|
||||||
{% for c in serveur_ops_verrou.collections %}
|
{% for c in serveur_ops_verrou.collections %}
|
||||||
- name: {{ c.nom }}
|
- name: {{ c.nom }}
|
||||||
version: {{ c.nom | regex_replace('^.*-([0-9][^-]*)[.]tar[.]gz$', '\\1') }}
|
version: {{ (c.nom | replace('.tar.gz', '')).split('-') | last }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
when: not ansible_check_mode
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import re
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
import jinja2
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
RACINE = Path(__file__).resolve().parents[2]
|
RACINE = Path(__file__).resolve().parents[2]
|
||||||
|
|
@ -80,6 +81,19 @@ def main() -> int:
|
||||||
if str(c.get("dest", "")).endswith("/{{ item.nom }}"):
|
if str(c.get("dest", "")).endswith("/{{ item.nom }}"):
|
||||||
dossier = c["dest"].rsplit("/", 1)[0]
|
dossier = c["dest"].rsplit("/", 1)[0]
|
||||||
verifier(dossier in assures, f"« {t['name']} » : son dossier est cree avant ({dossier})")
|
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(),
|
verifier("verrou-runner.yml" in (RACINE / "roles/serveur_artefacts/tasks/main.yml").read_text(),
|
||||||
"le site tient le verrou du runner")
|
"le site tient le verrou du runner")
|
||||||
if ECHECS:
|
if ECHECS:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue