Aller au contenu
Infrastructure as Code medium

Intégrer HashiCorp Vault ou OpenBao avec Ansible : lookup, AppRole, KV v2

12 min de lecture

Logo Ansible

Quand Ansible Vault ne suffit plus, on délègue le stockage à HashiCorp Vault — ou son fork open-source OpenBao, API-compatible. Bénéfices : secrets dynamiques (credentials DB éphémères), rotation centralisée, audit logs détaillés, TTL automatique, intégration Cloud IAM. Cette page montre comment lookup un secret depuis un playbook avec la collection community.hashi_vault, avec l’authentification token (dev) puis AppRole (production).

À la fin, vous saurez démarrer un Vault local en mode dev, stocker un secret KV v2, le récupérer depuis Ansible, et migrer vers AppRole pour un usage CI/CD réaliste.

  • Différence Ansible Vault vs HashiCorp Vault : ce que chaque outil résout.
  • HashiCorp Vault vs OpenBao : licence, gouvernance, compatibilité API.
  • Démarrer Vault dev local avec Podman.
  • vault_kv2_get : lookup dans le moteur KV v2 (versionné).
  • AppRole : pattern d’authentification recommandé en CI/CD.
  • Sécurité : pas de token root, TLS, audit log.
  • Lu Introduction Ansible Vault pour la mise en perspective.
  • Podman (ou Docker) installé.
  • Collection community.hashi_vault : ansible-galaxy collection install community.hashi_vault.
  • Module Python hvac : pipx inject ansible hvac (ou pip install hvac).

HashiCorp Vault vs Ansible Vault — limites des *.vault.yml

Section intitulée « HashiCorp Vault vs Ansible Vault — limites des *.vault.yml »

Ansible Vault chiffre statiquement un fichier YAML. Il atteint ses limites dès que :

  • La rotation devient régulière : changer un mot de passe DB demande de rechiffrer N rôles.
  • L’audit fin est exigé : qui a accédé au secret ? Aucune trace dans Ansible Vault.
  • Les secrets sont dynamiques : credentials DB à TTL court, certificats à émission auto, tokens AWS STS.
  • Plusieurs équipes se partagent les mêmes secrets : qui peut éditer ? Aucun contrôle granulaire dans Ansible Vault.
  • Compliance SOC 2 / PCI-DSS exige un coffre dédié certifié.

HashiCorp Vault résout ces 5 points : centralisation, audit, rotation, dynamic secrets, RBAC fin, compliance.

En août 2023, HashiCorp est passé d’une licence MPL-2.0 à BSL (Business Source License) : commerciale au-delà d’un seuil de revenus. La Linux Foundation a forké le projet sous le nom OpenBao en MPL-2.0, sous gouvernance neutre.

CritèreHashiCorp VaultOpenBao
LicenceBSL (commerciale > seuil)MPL-2.0 (open-source pur)
GouvernanceHashiCorp (IBM depuis 2024)Linux Foundation
Enterprise featuresDR, MFA SAML, namespaces, SentinelDisponibles dans la version Edge
Compatibilité APIRéférenceCompatible 95+ %
CommunautéPlus large (historique)Croissance rapide depuis 2024

Décision pratique : un même playbook Ansible fonctionne avec les deux sans modification. Choisir selon le licensing et la gouvernance souhaitée, pas selon les fonctionnalités.

Fenêtre de terminal
# Démarrer HashiCorp Vault
podman run -d --name=vault-dev -p 8200:8200 \
-e VAULT_DEV_ROOT_TOKEN_ID=lab82-root \
hashicorp/vault:latest
# Ou OpenBao (commande IDENTIQUE, image différente)
podman run -d --name=vault-dev -p 8200:8200 \
-e VAULT_DEV_ROOT_TOKEN_ID=lab82-root \
openbao/openbao:latest

Le repo de lab fournit un script qui supporte les deux images :

Fenêtre de terminal
cd labs/vault/integration-hashicorp/
# HashiCorp Vault par défaut
./setup-vault.sh
# Ou OpenBao
IMAGE=openbao/openbao:latest ./setup-vault.sh

Sortie :

[setup-vault] OK — Vault disponible sur http://localhost:8200
Token : lab82-root
Path : secret/lab82

Le moteur KV v2 (Key-Value version 2) est le moteur de secrets statiques recommandé. Il versionne automatiquement chaque modification (history + rollback).

Fenêtre de terminal
podman exec -e VAULT_TOKEN=lab82-root vault-lab82 \
vault kv put secret/lab82 \
db_password=VaultPassLab82 \
api_key=vault_api_xyz_lab82

Vérifier :

Fenêtre de terminal
podman exec -e VAULT_TOKEN=lab82-root vault-lab82 \
vault kv get secret/lab82

KV v1 vs KV v2 :

  • KV v1 : pas de versioning, écrase à chaque put. Mode legacy.
  • KV v2 : versionné, peut rollback à -version=N. Recommandé.

Avec la collection community.hashi_vault :

playbook.yml
- name: Démo lookup HashiCorp Vault / OpenBao
hosts: localhost
connection: local
gather_facts: false
vars:
db_password: "{{ lookup('community.hashi_vault.vault_kv2_get',
'lab82',
engine_mount_point='secret',
url=hashi_vault_url,
token=hashi_vault_token).secret.db_password }}"
tasks:
- name: Vérifier la lookup
ansible.builtin.debug:
msg: "DB password length: {{ db_password | length }}"

Lancer :

Fenêtre de terminal
ansible-playbook playbook.yml \
-e "hashi_vault_url=http://localhost:8200" \
-e "hashi_vault_token=lab82-root"

Sortie :

TASK [Vérifier la lookup] ***
ok: [localhost] =>
msg: "DB password length: 14"

Bénéfice clé : le playbook ne contient aucun secret en clair. La lookup va chercher la valeur au runtime depuis Vault. Si on rote le mot de passe dans Vault, le prochain run récupère la nouvelle valeur automatiquement.

Étape 4 — Authentification AppRole en production

Section intitulée « Étape 4 — Authentification AppRole en production »

En production, on n’utilise pas le token root. Le pattern recommandé est AppRole : Vault génère un role_id (public, peut être commité) et un secret_id (TTL court, renouvelé par job CI).

Fenêtre de terminal
# Activer le backend AppRole
podman exec -e VAULT_TOKEN=lab82-root vault-lab82 \
vault auth enable approle
# Créer une policy ansible-readonly
podman exec -e VAULT_TOKEN=lab82-root vault-lab82 sh -c '
cat << EOF | vault policy write ansible-readonly -
path "secret/data/lab82" {
capabilities = ["read"]
}
EOF
'
# Créer un AppRole "ansible-app"
podman exec -e VAULT_TOKEN=lab82-root vault-lab82 \
vault write auth/approle/role/ansible-app \
token_policies="ansible-readonly" \
token_ttl=1h \
token_max_ttl=4h
# Récupérer role_id (public) et secret_id (sensible, TTL court)
ROLE_ID=$(podman exec -e VAULT_TOKEN=lab82-root vault-lab82 \
vault read -field=role_id auth/approle/role/ansible-app/role-id)
SECRET_ID=$(podman exec -e VAULT_TOKEN=lab82-root vault-lab82 \
vault write -field=secret_id -f auth/approle/role/ansible-app/secret-id)
- name: Lookup avec AppRole
vars:
db_password: "{{ lookup('community.hashi_vault.vault_kv2_get',
'lab82',
engine_mount_point='secret',
url=vault_url,
auth_method='approle',
role_id=role_id,
secret_id=secret_id).secret.db_password }}"

Lancer en CI/CD :

Fenêtre de terminal
ansible-playbook playbook.yml \
-e "vault_url=https://vault.prod.example.com" \
-e "role_id=$VAULT_ROLE_ID" \
-e "secret_id=$VAULT_SECRET_ID"

Pattern de sécurité :

  • role_id est public, peut être commité dans Git (équivalent d’un username).
  • secret_id est sensible, généré à la volée, TTL 15 minutes. Le pipeline CI le récupère via une étape sécurisée (un autre lookup Vault, un secret manager du CI), l’injecte au job, le révoque après.
  • Pas de token en clair dans playbook.yml — toujours via env var (VAULT_TOKEN) ou --extra-vars.
  • AppRole en CI/CD avec secret_id éphémère renouvelé par job.
  • TLS mandatory en production : https://, certificat pinné via ca_cert=.
  • Audit log activé : vault audit enable file file_path=/var/log/vault/audit.log.
  • Policy restrictives : least-privilege, un AppRole par projet/environnement.
  • Rotation périodique des secret_id AppRole (toutes les heures, voire à chaque pipeline).

Le lab vault/integration-hashicorp du repo ansible-training reproduit ce parcours avec 6 tests pytest qui valident :

  • Le script setup-vault.sh est présent et exécutable.
  • Il supporte HashiCorp Vault et OpenBao via la variable IMAGE.
  • Le playbook utilise bien la lookup community.hashi_vault.vault_kv2_get.
  • Aucun secret en clair n’est commité dans le playbook.

Suivre : labs/vault/integration-hashicorp/README.md.

  • Auth Kubernetes : Vault s’intègre avec les service accounts K8s pour rotation automatique.
  • Auth AWS IAM / Azure AD / GCP : pas de credentials statiques à stocker.
  • Dynamic secrets : Vault génère des credentials DB éphémères (PostgreSQL, MySQL, MongoDB).
  • Vault PKI : émission automatique de certificats X.509 internes.
  • Vault + Ansible Tower / AAP : Vault Credential Type intégré nativement.
  • Combinaison Passbolt + Vault : voir page suivante.
  • HashiCorp Vault / OpenBao complètent Ansible Vault dès qu’on a besoin de rotation centralisée, dynamic secrets, ou audit fin.
  • API compatible entre les deux — choisir selon licence et gouvernance, pas selon fonctionnalités.
  • community.hashi_vault.vault_kv2_get : lookup standard, pas de secret en clair dans le playbook.
  • AppRole est le pattern d’authentification recommandé en CI/CD (role_id public, secret_id éphémère).
  • TLS mandatory + audit log + policies least-privilege en production.
  • Combinaison hybride : Ansible Vault pour les configs versionnées, HashiCorp Vault pour les secrets dynamiques.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn