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 = {}