Ir al contenido

Integración de HashiCorp Vault con Ansible: guía práctica paso a paso

16 de junio de 2026 por
Ilimit Comunicacions S.L., Oscar Mas

Introducción a HashiCorp Vault y Ansible

En este artículo veremos cómo integrar HashiCorp Vault con Ansible para gestionar secretos de forma segura en entornos DevOps. Aprenderemos a crear un almacén de secretos, definir políticas de acceso, configurar la autenticación y consumir credenciales desde un playbook de Ansible en tiempo real.

Soy Òscar Mas y estoy seguro de que ya has leído mis otros posts de HashiCorp Vault, pero por si acaso, te los dejo resumidos a continuación:

  • HashiCorp Vault: el guardián de los secretos en entornos DevOps. En este post enseñamos las bases del producto y entendimos por qué Vault es una pieza clave para dejar de enviar contraseñas en texto plano y empezar a gestionar los secretos de forma segura, centralizada y cifrada.
  • HashiCorp Vault: Instalación con Docker y trabajo con secretos. Aquí nos pusimos manos a la obra y levantamos nuestro propio servidor de Vault utilizando Docker y aprendimos a almacenar en él nuestro primer secreto.

Ahora que ya tenemos el conocimiento del producto y somos capaces de desplegar nuestro propio servidor de Vault, es hora de dar el salto hacia la automatización real. Y lo haremos con una de las integraciones más potentes y famosas del mercado: Ansible.

Para quien no conozca Ansible, es una herramienta orientada a IaC (Infrastructure as Code) que nos permite automatizar configuraciones y despliegues en nuestra infraestructura. Pero, ¿qué pasa con las contraseñas y claves de la infraestructura que Ansible necesita gestionar? Aquí es donde entra en juego HashiCorp Vault.

Preparación del laboratorio

En el laboratorio utilizaremos dos equipos:

  • Equipo: vault. Es donde hemos instalado nuestro sistema de HashiCorp Vault.
  • Equipo: cli-ansible-vault. Es desde donde lanzaremos los playbooks de Ansible. Este servidor consumirá los secretos del servidor de HashiCorp Vault.

Lo primero que haremos será validar que el servicio del servidor vault esté "UnSelaed" e iniciaremos sesión en el servidor de HashiCorp Vault.

root@vault:~# docker exec -it vault ash

/ # vault status
Key             Value
---             -----
...             ...
Sealed          false
...             ...

/ # export VAULT_ADDR=http://127.0.0.1:8200
/ # vault login s.KaU83zJXYPXaZZCfFkgT8eJX

Crear un secreto en HashiCorp Vault

Crearemos un espacio de trabajo, tipo KV (Key-Value). Utilizaremos la version=2, que nos permite tener un historial y control de versiones de los secretos, y la ruta de acceso principal será Ansible.

/ # vault secrets enable -description="Secrets ansible DiBa" -version=2 -path=ansible kv

Crearemos un secreto para que después pueda consumirlo Ansible:

/ # vault kv put ansible/myapp/config username='secret-username' password='secret-password'

Haremos una consulta rápida para validar que los datos se han almacenado correctamente.

/ # vault kv get -format=json ansible/myapp/config
...
      "password": "secret-password",
      "username": "secret-username"
...

Crear una política de acceso para Ansible

Crearemos una política llamada policy-myapp que solo permite leer (read) este secreto. Más adelante, Ansible utilizará esta política para conectarse, asegurándonos de que no pueda fisgonear el resto de secretos que hay en HashiCorp Vault.

/ # vault policy write policy-myapp - <<EOF
path "ansible/data/myapp/config" {
    capabilities = ["read"]
}
EOF

Haremos un listado para validar que nuestra nueva política policy-myapp se ha guardado correctamente en el sistema y ya está lista para ser utilizada.

/ # vault policy list
default
policy-myapp
root

Configurar la autenticación de usuarios en HashiCorp Vault

Por defecto, HashiCorp Vault solo nos permite el acceso mediante token. Por ello habilitaremos los usuarios locales de Vault.

/ # vault auth enable userpass

Crearemos un usuario llamado oscar.mas con su contraseña (superpassword). Lo más importante de este comando es el parámetro policies=policy-myapp, que lo que hace es aplicar esta política al usuario oscar.mas. Recordad que esta política solo permite leer secretos (read). 

A partir de aquí, lo tenemos todo hecho, pero por seguridad validaremos que el usuario oscar.mas pueda acceder al secreto desde el propio servidor de HashiCorp Vault:

/ # vault login -method=userpass username=oscar.mas password=superpassword

/ # vault kv get -format=json ansible/myapp/config
...
      "password": "secret-password",
      "username": "secret-username"
...

Instalar Ansible y el cliente de Vault

Ahora cambiamos de máquina y nos situamos en nuestro cliente de Ansible (cli-ansible-vault). 

Lo primero que debemos hacer es preparar el entorno, instalando las herramientas necesarias y el cliente de Vault:

root@cli-ansible-vault:~# apt update && apt install -y ansible unzip python3-hvac
root@cli-ansible-vault:~# VAULT_RELEASE="1.19.4"
root@cli-ansible-vault:~# wget https://releases.hashicorp.com/vault/${VAULT_RELEASE}/vault_${VAULT_RELEASE}_linux_amd64.zip
root@cli-ansible-vault:~# unzip vault_${VAULT_RELEASE}_linux_amd64.zip
root@cli-ansible-vault:~# mv vault /usr/local/bin/

Una vez tenemos el cliente de Vault instalado en la máquina de Ansible, el siguiente paso es conectarnos a nuestro servidor de Vault. Para ello, ejecutamos estos comandos:

root@cli-ansible-vault:~# export VAULT_ADDR=http://172.26.0.30
root@cli-ansible-vault:~# vault login -method=userpass username=oscar.mas password=superpassword

Conectar Ansible con HashiCorp Vault

Una vez hayamos iniciado sesión, Vault nos dará un Token que es el que utilizaremos para autenticarnos con HashiCorp Vault. 

Para que quede claro: el login es simplemente el medio que utilizamos para identificarnos y que Vault nos entregue un Token. Este Token nos permitirá acceder durante un tiempo predeterminado (llamado TTL), que si no lo hemos modificado, por defecto es de 32 días (768 horas). Pasado este tiempo, el token caducará por seguridad, dejaremos de tener acceso a los secretos y tendremos que hacer el mismo procedimiento para que nos entregue un token nuevo.

Ahora, para que el sistema operativo recuerde el Token y no tener que introducirlo cada vez, lo exportaremos a una variable del sistema con el siguiente comando.

root@cli-ansible-vault:~# export VAULT_TOKEN="hvs.xxx"

Ejemplo de playbook de Ansible con HashiCorp Vault

Y ahora solo queda lanzar nuestro playbook:

root@cli-ansible-vault:~# ansible-playbook test-vault.yaml
PLAY [localhost] ******************************************************

TASK [HashiCorp Vault - Show username] ********************************
ok: [localhost] => {
    "msg": "secret-username"
}

TASK [HashiCorp Vault - Show password] ********************************
ok: [localhost] => {
    "msg": "secret-password"
}

TASK [HashiCorp Vault - Create file: /root/vault.secrets] *************
changed: [localhost]

PLAY RECAP ************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Si vamos a comprobar el fichero que ha creado Ansible, veremos que ha recuperado los secretos directamente desde Vault en tiempo real y los ha colocado en el fichero indicado:

root@cli-ansible-vault:~# cat vault.secrets
Username: secret-username
Password: secret-password

Os dejo el playbook que hemos lanzado, para poder terminar de realizar el laboratorio:

root@cli-ansible-vault:~# vim test-vault.yaml
---
- hosts: localhost
  gather_facts: false

  vars:
    ansible_hashi_vault_url: "http://172.26.0.30"
    ansible_hashi_vault_timeout: 5
    ansible_hashi_vault_retries: 3
    ansible_hashi_vault_auth_method: "token"

  tasks:
    - name: "HashiCorp Vault - Show username"
      debug:
        msg: "{{ lookup('community.hashi_vault.hashi_vault', 'ansible/data/myapp/config:username')}}"
    - name: "HashiCorp Vault - Show password"
      debug:
        msg: "{{ lookup('community.hashi_vault.hashi_vault', 'ansible/data/myapp/config:password')}}"

    - name: "HashiCorp Vault - Create file: /root/vault.secrets"
      copy:
        dest: "/root/vault.secrets"
        content: |
          Username: {{ lookup('community.hashi_vault.hashi_vault', 'ansible/data/myapp/config:username')}}
          Password: {{ lookup('community.hashi_vault.hashi_vault', 'ansible/data/myapp/config:password')}}

Configurar el tiempo de vida (TTL) de los tokens

Como hemos comentado antes, que un token dure 32 días (768 horas) por defecto puede ser un riesgo de seguridad. Si queréis reducir este tiempo de vida (TTL) a 24 horas, podéis hacerlo fácilmente modificando la configuración del método de autenticación userpass.

Primero, podemos consultar la configuración actual para comprobar que, efectivamente, está fijada en 32 días (768 horas):

root@cli-ansible-vault:~# vault read sys/auth/userpass/tune
Key                  Value
---                  -----
default_lease_ttl    768h
...                  ...
max_lease_ttl        768h
...                  ...

Para modificarlo, debemos lanzar el comando vault auth tune. Es importante actualizar tanto el tiempo por defecto (-default-lease-ttl) como el tiempo máximo permitido (-max-lease-ttl):

root@cli-ansible-vault:~# vault auth tune -max-lease-ttl=24h userpass
root@cli-ansible-vault:~# vault auth tune -default-lease-ttl=24h userpass

Si volvemos a hacer la consulta al sistema, veremos que los cambios se han aplicado correctamente:

root@cli-ansible-vault:~# vault read sys/auth/userpass/tune
Key                  Value
---                  -----
default_lease_ttl    24h
max_lease_ttl        24h

Espero que os sirva de ayuda o como mínimo de inspiración, para empezar a guardar vuestros secretos de una manera más segura.