serveur_ops : creer les depots de roues et de collections avant la copie

La copie fichier par fichier du verrou ne cree pas son dossier, contrairement
a l'ancienne copie du cache entier. La reconstruction de Technolibre s'est
arretee a l'insemination sur un runner neuf (roues bien prises au site).
test_verrou_runner.py exige desormais que chaque dossier vise soit cree avant.

CHANGELOG (121) : l'arret, et le blocage site-pki-01 -> 10.37.32.1:8006 vu a
la frontiere, qui est la sonde de connectivite (resultat attendu).

94 preuves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-10-09 11:22:01 -04:00
parent 55f42add15
commit 422b68846b
3 changed files with 49 additions and 2 deletions

View file

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

View file

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

View file

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