Skip to content

fix(collections): déclarer les collections Ansible employées - #52

Merged
stephrobert merged 1 commit into
mainfrom
fix/collections-declarees
Aug 21, 2026
Merged

fix(collections): déclarer les collections Ansible employées#52
stephrobert merged 1 commit into
mainfrom
fix/collections-declarees

Conversation

@stephrobert

@stephrobert stephrobert commented Aug 21, 2026

Copy link
Copy Markdown
Owner

Résumé

Trois collections Ansible hors ansible.builtin sont employées par ce dépôt, et
aucune n'était déclarée. Deux se trouvaient installées par hasard sur la
machine de développement ; la troisième, non.

Conséquence, sur une infra fraîchement provisionnée :

83 vert(s), 1 rouge(s), 0 ignoré(s) sur 84 lab(s).
  ✘ rhcsa-mock-exam    20 warnings, 20 errors

Le message envoyait chercher au mauvais endroit

RuntimeError: solution.yaml a échoué pour rhcsa-mock-exam (rc=4, status=failed). Stats : {}

rc=4 est le code « unreachable » d'Ansible, et des stats vides se lisent
comme « aucun hôte joint ». Quatre pistes ont été instruites avant la bonne :
l'état des VM, l'inventaire, la clé SSH, le déchiffrement vault. Pendant ce
temps, dsoxlab status rendait les trois hôtes verts et ansible -m ping alma-rhcsa-2.lab répondait pong.

La cause n'apparaît qu'en jouant la solution à la main :

[ERROR]: couldn't resolve module/action 'community.crypto.openssh_keypair'

Après ansible-galaxy collection install community.crypto, le capstone passe
20/20 en 59 s, sans autre changement.

Ce que le dépôt emploie réellement

Recensé sur tous les labs/** et toutes les solution/**, déchiffrées :

Collection Occurrences
ansible.builtin 604
ansible.posix 3
community.general 1
community.crypto 1

Le garde-fou

tests/test_collections_declarees.py refuse qu'une collection employée manque à
requirements.yml. Il porte sur ce que les fichiers emploient, pas sur ce
que la machine a d'installé : une suite verte parce que le poste est bien garni
ne dit rien de celui du prochain qui clone.

Il déchiffre les solutions au passage, et un second test vérifie que ce
déchiffrement a bien eu lieu
— sans quoi le premier passerait au vert sans
avoir rien regardé, la panne du harnais déguisée en succès.

Le hook est câblé dans .pre-commit-config.yaml, faute de quoi
outillage-coherent refuse le commit — et il a raison : « un vérificateur
présent mais débranché ne protège plus rien, en silence »
.

Éprouvé par mutation : retirer community.crypto de la déclaration fait
échouer le test en nommant le fichier fautif ; restauré, les deux passent.

Un faux départ, corrigé et documenté

Le premier motif cherchait mot.mot.mot n'importe où dans le texte et remontait
auto.master, logs.tar, net.ipv4, dl.flathub — des chemins, une archive,
un nom de domaine. Un garde-fou qui crie au loup se fait désactiver, alors il ne
regarde plus que la position de clé dans une tâche. La raison est écrite dans le
fichier, pour que personne ne « simplifie » le motif plus tard.

Au passage

runtime.hosts_required disparaît du capstone : le champ n'est lu ni par
dsoxlab ni par ce dépôt, et le compte d'hôtes est déjà porté par
runtime.targets[]. C'est l'un des quatre champs morts que les schémas JSON de
dsoxlab 0.1.54 ont fait apparaître.

Ce que cette PR ne fait PAS

Le message d'échec du replay n'est pas retouché. Une première version de ce
travail l'améliorait, avant de constater que main le traite déjà depuis
« un replay de solution en échec doit dire pourquoi » (#42) : la fin du stdout
du playbook y est collée au message. Le doublon a été abandonné, et cette branche
repart de main à jour plutôt que de le traîner.

Validation

Infra provisionnée (alma-rhcsa-1/2.lab, ubuntu-lfcs-1.lab), solutions
rejouées avec contrôle du verdict :

84 vert(s), 0 rouge(s), 0 ignoré(s) sur 84 lab(s).

Issues

Closes #50

🤖 Generated with Claude Code

Trois collections hors ansible.builtin sont utilisées et aucune n'était
déclarée. Deux se trouvaient installées par hasard sur la machine de
développement, la troisième non, et le capstone rhcsa-mock-exam échouait alors
sur « rc=4, Stats : {} ». Le 4 est le code « unreachable » d'Ansible : le
message envoie chercher un problème de réseau pendant que la cause est une
dépendance absente. Quatre pistes ont été instruites avant la bonne, alors que
les trois hôtes répondaient au ping.

Recensé sur tous les labs et toutes les solutions déchiffrées : ansible.builtin
604 fois, ansible.posix 3, community.general 1, community.crypto 1. Après
installation de la troisième, le capstone passe 20/20.

Le test refuse qu'une collection employée manque à la déclaration. Il porte sur
ce que les fichiers emploient, pas sur ce que la machine a d'installé : une
suite verte parce que le poste est bien garni ne dit rien de celui du prochain
qui clone. Il déchiffre les solutions au passage, et un second test vérifie que
ce déchiffrement a eu lieu, sans quoi le premier passerait au vert sans avoir
rien regardé.

Un premier motif cherchait mot.mot.mot n'importe où et remontait auto.master,
logs.tar, net.ipv4 et dl.flathub. Un garde-fou qui crie au loup se fait
désactiver, donc il ne regarde que la position de clé dans une tâche, et la
raison est écrite dans le fichier.

Éprouvé par mutation : retirer community.crypto de la déclaration fait échouer
le test en nommant le fichier fautif.

Au passage, runtime.hosts_required disparaît du capstone : le champ n'est lu ni
par dsoxlab ni par ce dépôt, et le compte d'hôtes est déjà porté par
runtime.targets. C'est l'un des champs morts que les schémas JSON de dsoxlab
0.1.54 ont fait apparaître.

Le message d'échec du replay n'est pas retouché : main le traite déjà depuis
« un replay de solution en échec doit dire pourquoi » (#42).

Validation : 84 labs verts sur 84, infra provisionnée, solutions rejouées.

Closes #50

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@stephrobert
stephrobert merged commit 29d5fbc into main Aug 21, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P1] Les collections Ansible requises ne sont déclarées nulle part, et leur absence se dit « rc=4 »

1 participant