diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d7838f..e3fae52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # 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=` le désigne explicitement, et l'inventaire d'un seul hôte (`-i ","`) +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 Question de l'exploitant : « on peut l'optimiser ? ». Mesuré avant de répondre — et la diff --git a/Makefile b/Makefile index 18107c2..e24ea9c 100644 --- a/Makefile +++ b/Makefile @@ -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-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 - 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 - 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 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)" .PHONY: _verifier-acces-modele _verifier-privileges-modele preparer-modele verifier-modele nettoyer-modele -_verifier-acces-modele: ansible-runtime - ansible -i $(INVENTAIRE_LAB) $(GROUPE_MODELE) -m ping -e ansible_become=false +_verifier-acces-modele: ansible-runtime _modele-requis + ansible -i $(INVENTAIRE_MODELE) $(CIBLE_MODELE) -m ping -e ansible_become=false -_verifier-privileges-modele: ansible-runtime - ansible -i $(INVENTAIRE_LAB) $(GROUPE_MODELE) -b -m command -a "whoami" +_verifier-privileges-modele: ansible-runtime _modele-requis + 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) - ansible-playbook -i $(INVENTAIRE_LAB) $(PLAYBOOK_PREPARER_MODELE) +# Le gabarit dore n'est PAS un hote du tenant : sa configuration Proxmox le place sur le +# 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=`. 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 - ansible-playbook -i $(INVENTAIRE_LAB) $(PLAYBOOK_VERIFIER_MODELE) +_modele-requis: + @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 ","` : 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 \ printf '%s\n' 'Refus: relancer avec CONFIRMER=true pour le nettoyage final du modele.'; \ exit 2; \ 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 diff --git a/docs/procedure-template-debian13-proxmox.md b/docs/procedure-template-debian13-proxmox.md index 71041a4..fe523b6 100644 --- a/docs/procedure-template-debian13-proxmox.md +++ b/docs/procedure-template-debian13-proxmox.md @@ -816,3 +816,36 @@ Cloud-init donne son identité au clone. Ansible configure le vrai serveur. Set-OPS documente et automatise l’ensemble. ``` + +--- + +## 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. +