From 937ac700b91defeb39f32df245d82ea9574984c4 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Wed, 1 Jul 2026 22:17:45 -0400 Subject: [PATCH] =?UTF-8?q?instancier=20:=20d=C3=A9chiffrer=20la=20vo?= =?UTF-8?q?=C3=BBte=20pour=20ansible-inventory=20(exit=204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une voûte chiffrée group_vars/all/vault.yml fait échouer ansible-inventory --list (comparaison du plan) sans mot de passe → « Appliquer le plan » cassé dès qu'une voûte existe. instancier utilise maintenant ~/.config/setops-vault-pass si ANSIBLE_VAULT_PASSWORD_FILE n'est pas déjà fourni. Validé : plus d'exit 4. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 6 ++++++ scripts/instancier.py | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f9b5aa..6f3184f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,12 @@ - **Compteur « vivantes »** dans l'en-tête (depuis la sonde), à côté de actifs/planifiés. ### Corrigé +- **Une voûte chiffrée cassait `instancier` / « Appliquer le plan ».** `ansible-inventory + --list` (utilisé pour la comparaison sémantique du plan) tente de déchiffrer + `group_vars/all/vault.yml` et échoue sans mot de passe (`exit 4`) — alors que + l'opération est structurelle, sans secret. `instancier` utilise désormais + automatiquement le fichier conventionnel `~/.config/setops-vault-pass` (si + `ANSIBLE_VAULT_PASSWORD_FILE` n'est pas déjà défini). - **Secrets des rôles non câblés à la voûte (échafaudage manquant).** Les rôles à secrets déclaraient `serveur_X_password: ""` avec, en commentaire seulement, la variable de voûte attendue (`{{ vault_X }}`) — sans mapping réel. Résultat : remplir diff --git a/scripts/instancier.py b/scripts/instancier.py index 7cdf2a7..e96cbc4 100644 --- a/scripts/instancier.py +++ b/scripts/instancier.py @@ -114,8 +114,15 @@ def ecrire(path: Path = GENERE) -> None: def _resolu(fichier: Path) -> tuple[dict, dict]: - sortie = subprocess.run(["ansible-inventory", "-i", str(fichier), "--list"], - capture_output=True, text=True, check=True).stdout + cmd = ["ansible-inventory", "-i", str(fichier), "--list"] + # Une voute chiffree (group_vars/all/vault.yml) fait echouer ansible-inventory sans + # mot de passe (exit 4). Si ANSIBLE_VAULT_PASSWORD_FILE n'est pas deja fourni, on + # tente le fichier conventionnel Set-OPS ~/.config/setops-vault-pass. + if not os.environ.get("ANSIBLE_VAULT_PASSWORD_FILE"): + conv = Path.home() / ".config" / "setops-vault-pass" + if conv.is_file(): + cmd += ["--vault-password-file", str(conv)] + sortie = subprocess.run(cmd, capture_output=True, text=True, check=True).stdout data = json.loads(sortie) hostvars = data.get("_meta", {}).get("hostvars", {}) groupes: dict = {}