modeles_vm : trois commandes qui ne pouvaient rien faire

Le groupe etait TOUJOURS vide et rien ne le signalait. instancier l'emet comme
squelette, les etats d'un serveur ne connaissent que actif et planifie — aucun
chemin ne permettait d'y faire entrer une machine. Les trois cibles recevaient
« skipping: no hosts matched », qui n'est pas une erreur.

Le gabarit ne PEUT PAS venir du plan : sa config Proxmox le place sur le
reseau de fabrication (192.168.12.99/24), pas dans le supernet. Ce n'est pas
un hote de l'ecosysteme, c'est la matrice dont il est tire. Le forcer dans
plan/serveurs.yml aurait ete le mettre dans un registre qui n'est pas le sien.

MODELE_HOTE=<ip> le designe ; l'inventaire d'un seul hote sert les trois
playbooks, prerequis d'acces et de privileges compris. Sans lui, elles
REFUSENT en expliquant au lieu de ne rien faire.

Meme famille que le reste de la journee : une capacite declaree dont personne
ne verifiait qu'elle est branchee — a ceci pres qu'elle ne se manifestait par
aucun symptome. Elle ne faisait rien, poliment.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-09 10:40:49 -04:00
parent 711676ca69
commit ff3ca3bf26
3 changed files with 107 additions and 13 deletions

View file

@ -1,5 +1,36 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-08-09 — `modeles_vm` : trois commandes qui ne pouvaient rien faire
Le groupe était **toujours vide**, et rien ne le signalait. `instancier` l'émet comme
squelette (`"modeles_vm": {"hosts": {}}`) et les états d'un serveur ne connaissent que
`actif` et `planifie` — aucun chemin ne permettait d'y faire entrer une machine. Les trois
cibles qui le ciblent recevaient « skipping: no hosts matched », qui n'est pas une erreur.
**Le gabarit ne peut pas venir du plan, et c'est structurel.** Sa configuration Proxmox le
place sur le réseau de fabrication (`ip=192.168.12.99/24`), pas dans le supernet. Ce n'est
pas un hôte de l'écosystème : c'est la matrice dont l'écosystème est tiré. Peupler
`modeles_vm` depuis `plan/serveurs.yml` aurait été forcer un objet dans un registre qui
n'est pas le sien.
`MODELE_HOTE=<ip>` le désigne explicitement, et l'inventaire d'un seul hôte (`-i "<ip>,"`)
sert les trois playbooks. Sans lui — et sans groupe peuplé — elles **refusent en
expliquant**, au lieu de ne rien faire :
```
Refus: aucune VM de gabarit designee.
Le gabarit vit sur le reseau de fabrication, pas dans le tenant :
il ne peut pas venir du plan. Le designer explicitement —
make preparer-modele MODELE_HOTE=192.168.12.99
```
Les prérequis d'accès et de privilèges suivent la même cible : ils interrogeaient eux aussi
le groupe vide.
C'est la même famille que tout ce que la journée a produit — **une capacité déclarée dont
personne ne vérifiait qu'elle est branchée**. À la différence près que celle-ci ne se
manifestait par aucun symptôme : elle ne faisait rien, poliment.
## 2026-08-09 — Le gabarit doré : ce qu'il transporte de son réseau de naissance ## 2026-08-09 — Le gabarit doré : ce qu'il transporte de son réseau de naissance
Question de l'exploitant : « on peut l'optimiser ? ». Mesuré avant de répondre — et la Question de l'exploitant : « on peut l'optimiser ? ». Mesuré avant de répondre — et la

View file

@ -187,13 +187,13 @@ lint: ansible-runtime ## Passe ansible-lint sur tout le depot
syntaxe: syntaxe-modele syntaxe-verification-modele syntaxe-nettoyage syntaxe-verification-hote syntaxe-groupes syntaxe-proxmox ## Verifie la syntaxe de TOUS les playbooks (modele, hote, groupes, proxmox) syntaxe: syntaxe-modele syntaxe-verification-modele syntaxe-nettoyage syntaxe-verification-hote syntaxe-groupes syntaxe-proxmox ## Verifie la syntaxe de TOUS les playbooks (modele, hote, groupes, proxmox)
syntaxe-modele: ansible-runtime ## Verifie la syntaxe du playbook de preparation du gabarit dore syntaxe-modele: ansible-runtime ## Verifie la syntaxe du playbook de preparation du gabarit dore
ansible-playbook -i $(INVENTAIRE_LAB) $(PLAYBOOK_PREPARER_MODELE) --syntax-check ansible-playbook -i $(INVENTAIRE_MODELE) $(PLAYBOOK_PREPARER_MODELE) --syntax-check
syntaxe-verification-modele: ansible-runtime ## Verifie la syntaxe du playbook de verification du gabarit syntaxe-verification-modele: ansible-runtime ## Verifie la syntaxe du playbook de verification du gabarit
ansible-playbook -i $(INVENTAIRE_LAB) $(PLAYBOOK_VERIFIER_MODELE) --syntax-check ansible-playbook -i $(INVENTAIRE_MODELE) $(PLAYBOOK_VERIFIER_MODELE) --syntax-check
syntaxe-nettoyage: ansible-runtime ## Verifie la syntaxe du playbook de nettoyage du gabarit syntaxe-nettoyage: ansible-runtime ## Verifie la syntaxe du playbook de nettoyage du gabarit
ansible-playbook -i $(INVENTAIRE_LAB) $(PLAYBOOK_NETTOYER_MODELE) --syntax-check ansible-playbook -i $(INVENTAIRE_MODELE) $(PLAYBOOK_NETTOYER_MODELE) --syntax-check
syntaxe-verification-hote: ansible-runtime ## Verifie la syntaxe du playbook de verification d'hote syntaxe-verification-hote: ansible-runtime ## Verifie la syntaxe du playbook de verification d'hote
ansible-playbook -i $(INVENTAIRE_PRODUCTION) $(PLAYBOOK_VERIFIER_HOTE) --syntax-check ansible-playbook -i $(INVENTAIRE_PRODUCTION) $(PLAYBOOK_VERIFIER_HOTE) --syntax-check
@ -841,24 +841,54 @@ inventaire-production: ## Affiche le graphe de l'inventaire de production
$(MAKE) inventaire-graphe FICHIER_INVENTAIRE="$(INVENTAIRE_PRODUCTION)" $(MAKE) inventaire-graphe FICHIER_INVENTAIRE="$(INVENTAIRE_PRODUCTION)"
.PHONY: _verifier-acces-modele _verifier-privileges-modele preparer-modele verifier-modele nettoyer-modele .PHONY: _verifier-acces-modele _verifier-privileges-modele preparer-modele verifier-modele nettoyer-modele
_verifier-acces-modele: ansible-runtime _verifier-acces-modele: ansible-runtime _modele-requis
ansible -i $(INVENTAIRE_LAB) $(GROUPE_MODELE) -m ping -e ansible_become=false ansible -i $(INVENTAIRE_MODELE) $(CIBLE_MODELE) -m ping -e ansible_become=false
_verifier-privileges-modele: ansible-runtime _verifier-privileges-modele: ansible-runtime _modele-requis
ansible -i $(INVENTAIRE_LAB) $(GROUPE_MODELE) -b -m command -a "whoami" ansible -i $(INVENTAIRE_MODELE) $(CIBLE_MODELE) -b -m command -a "whoami"
preparer-modele: ansible-runtime _verifier-acces-modele _verifier-privileges-modele ## Prepare le gabarit dore (VM de reference clonee pour chaque hote) # Le gabarit dore n'est PAS un hote du tenant : sa configuration Proxmox le place sur le
ansible-playbook -i $(INVENTAIRE_LAB) $(PLAYBOOK_PREPARER_MODELE) # reseau de fabrication (192.168.12.x), pas dans le supernet. `instancier` emet donc
# `modeles_vm` toujours VIDE, et les etats d'un serveur ne connaissent que `actif` et
# `planifie` — rien ne pouvait y entrer. Resultat mesure le 2026-08-09 : trois cibles
# documentees qui ne pouvaient rien faire, et Ansible qui repondait « skipping: no hosts
# matched » sans que ce soit une erreur.
#
# On DESIGNE donc la machine explicitement : `MODELE_HOTE=<ip-ou-nom>`. A defaut, on
# refuse au lieu de ne rien faire — une commande qui ne fait rien en silence est pire
# qu'une commande absente.
, := ,
verifier-modele: ansible-runtime ## Verifie le gabarit dore _modele-requis:
ansible-playbook -i $(INVENTAIRE_LAB) $(PLAYBOOK_VERIFIER_MODELE) @if [[ -z "$(MODELE_HOTE)" ]] && ! ansible-inventory -i $(INVENTAIRE_LAB) --list 2>/dev/null | python3 -c 'import json,sys; d=json.load(sys.stdin); sys.exit(0 if (d.get("modeles_vm") or {}).get("hosts") else 1)' 2>/dev/null; then \
printf '%s\n' 'Refus: aucune VM de gabarit designee.'; \
printf '%s\n' ' Le gabarit vit sur le reseau de fabrication, pas dans le tenant :'; \
printf '%s\n' ' il ne peut pas venir du plan. Le designer explicitement —'; \
printf '%s\n' ' make preparer-modele MODELE_HOTE=192.168.12.99'; \
printf '%s\n' ' make verifier-modele MODELE_HOTE=192.168.12.99'; \
printf '%s\n' ' make nettoyer-modele MODELE_HOTE=192.168.12.99 CONFIRMER=true'; \
printf '%s\n' ' (la VM doit etre DEMARREE : un template Proxmox ne boote pas ;'; \
printf '%s\n' ' le convertir en VM ou en cloner une copie de travail.)'; \
exit 2; \
fi
nettoyer-modele: ansible-runtime ## Nettoie le gabarit avant capture — exige CONFIRMER=true # `-i "<hote>,"` : la virgule finale fait de la chaine un inventaire d'un seul hote.
INVENTAIRE_MODELE = $(if $(MODELE_HOTE),"$(MODELE_HOTE)$(,)",$(INVENTAIRE_LAB))
# Cible : la machine designee, ou le groupe si l'inventaire en contient un.
CIBLE_MODELE = $(if $(MODELE_HOTE),$(MODELE_HOTE),$(GROUPE_MODELE))
preparer-modele: ansible-runtime _modele-requis _verifier-acces-modele _verifier-privileges-modele ## Prepare le gabarit dore (VM de reference clonee pour chaque hote)
ansible-playbook -i $(INVENTAIRE_MODELE) $(PLAYBOOK_PREPARER_MODELE)
verifier-modele: ansible-runtime _modele-requis ## Verifie le gabarit dore
ansible-playbook -i $(INVENTAIRE_MODELE) $(PLAYBOOK_VERIFIER_MODELE)
nettoyer-modele: ansible-runtime _modele-requis ## Nettoie le gabarit avant capture — exige CONFIRMER=true
@if [[ "$(CONFIRMER)" != "true" ]]; then \ @if [[ "$(CONFIRMER)" != "true" ]]; then \
printf '%s\n' 'Refus: relancer avec CONFIRMER=true pour le nettoyage final du modele.'; \ printf '%s\n' 'Refus: relancer avec CONFIRMER=true pour le nettoyage final du modele.'; \
exit 2; \ exit 2; \
fi fi
ansible-playbook -i $(INVENTAIRE_LAB) $(PLAYBOOK_NETTOYER_MODELE) -e template_cleanup_confirm=true ansible-playbook -i $(INVENTAIRE_MODELE) $(PLAYBOOK_NETTOYER_MODELE) -e template_cleanup_confirm=true
.PHONY: _verifier-acces-hote _verifier-privileges-hote _attendre-hote faits verifier-hote .PHONY: _verifier-acces-hote _verifier-privileges-hote _attendre-hote faits verifier-hote

View file

@ -816,3 +816,36 @@ Cloud-init donne son identité au clone.
Ansible configure le vrai serveur. Ansible configure le vrai serveur.
Set-OPS documente et automatise lensemble. Set-OPS documente et automatise lensemble.
``` ```
---
## 28. Rejouer la préparation sur une VM existante — `MODELE_HOTE`
Ajouté le 2026-08-09, après avoir constaté que `make preparer-modele`,
`verifier-modele` et `nettoyer-modele` **ne pouvaient rien faire**.
Ils ciblaient le groupe `modeles_vm`, qu'`instancier` émet **toujours vide** : les états
d'un serveur ne connaissent que `actif` et `planifie`, donc rien ne pouvait y entrer.
Ansible répondait « skipping: no hosts matched » — ce qui n'est pas une erreur, et passait
donc inaperçu.
**Pourquoi le gabarit ne peut pas venir du plan.** Sa configuration Proxmox le place sur le
réseau de *fabrication* (`ip=192.168.12.99/24`), pas dans le supernet du tenant. Ce n'est
pas un hôte de l'écosystème : c'est la matrice dont l'écosystème est tiré.
On le désigne donc explicitement :
```bash
make preparer-modele MODELE_HOTE=192.168.12.99
make verifier-modele MODELE_HOTE=192.168.12.99
make nettoyer-modele MODELE_HOTE=192.168.12.99 CONFIRMER=true
```
Sans `MODELE_HOTE` — et sans groupe `modeles_vm` peuplé — les trois **refusent** en
expliquant comment les appeler. Une commande qui ne fait rien en silence est pire qu'une
commande absente.
> **La VM doit être démarrée.** Un template Proxmox ne démarre pas : le convertir en VM, ou
> en cloner une copie de travail et ne convertir celle-ci en template qu'une fois prouvée.
> Le gabarit en service reste intact pendant toute l'opération.