Vault y secretos
ansible-vault cifra ficheros YAML (o cualquier texto) para guardarlos en git sin dejar passwords, tokens o claves en claro. El playbook los descifra en memoria al ejecutarse si proporcionas la clave.
Que cifrar
| Cifrar | No cifrar (suele bastar en claro) |
|---|---|
| Passwords DB, API tokens | Puertos, nombres de paquete |
| Claves privadas, certificados | Flags booleanos de feature |
| Credenciales cloud de lab | Inventario de hostnames |
Patron tipico: group_vars/production/vault.yml cifrado + group_vars/production/vars.yml en claro que referencia {{ vault_db_password }}.
Crear un fichero cifrado
# Interactivo (pide password de vault)
ansible-vault create inventory/group_vars/production/vault.yml
# Con fichero de password (CI / equipo)
ansible-vault create --vault-password-file=~/.vault_pass \
inventory/group_vars/production/vault.ymlContenido tipico antes de guardar (el editor abre en claro):
---
vault_db_password: "s3cr3t-change-me"
vault_api_token: "tok_xxx"
vault_ssl_key: |
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----En group_vars/production/vars.yml (sin cifrar):
---
db_password: "{{ vault_db_password }}"
api_token: "{{ vault_api_token }}"Asi el role solo conoce db_password; el prefijo vault_ marca origen sensible.
Editar, ver, rekey
ansible-vault edit inventory/group_vars/production/vault.yml
ansible-vault view inventory/group_vars/production/vault.yml
ansible-vault rekey inventory/group_vars/production/vault.yml
ansible-vault encrypt inventory/group_vars/staging/secrets.yml
ansible-vault decrypt inventory/group_vars/staging/secrets.yml # evita en prodrekey cambia la password del vault sin reescribir a mano cada secreto.
Cifrar una sola variable (inline)
ansible-vault encrypt_string 'supersecreto' --name 'db_password'Salida para pegar en un YAML mixto:
db_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653...Util cuando solo una clave de un fichero es secreta. Para muchos secretos, fichero completo cifrado es mas limpio.
Ejecutar playbooks con vault
# Prompt
ansible-playbook playbooks/site.yml --ask-vault-pass
# Fichero de password (permisos 600)
ansible-playbook playbooks/site.yml --vault-password-file=~/.vault_pass
# Variable de entorno (wrappers / CI)
export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass
ansible-playbook playbooks/site.ymlScript ejecutable como password file (lee de un gestor):
#!/usr/bin/env bash
# vault-pass.sh (chmod 700)
set -euo pipefail
# Ejemplo: op read "op://Platform/AnsibleVault/password"
cat "${HOME}/.vault_pass"ansible-playbook site.yml --vault-password-file=./vault-pass.shMultiples vault IDs
Cuando staging y prod usan passwords distintas:
ansible-vault encrypt --vault-id prod@prompt group_vars/production/vault.yml
ansible-vault encrypt --vault-id staging@prompt group_vars/staging/vault.yml
ansible-playbook site.yml \
--vault-id staging@~/.vault_staging \
--vault-id prod@~/.vault_prodEtiqueta en el header del fichero cifrado; Ansible prueba los IDs proporcionados.
CI/CD
Nunca commits de .vault_pass. En GitHub Actions:
- name: Run playbook
env:
VAULT_PASS: ${{ secrets.ANSIBLE_VAULT_PASSWORD }}
run: |
printf '%s' "$VAULT_PASS" > .vault_pass
chmod 600 .vault_pass
ansible-playbook -i inventory/prod playbooks/site.yml \
--vault-password-file=.vault_pass
shred -u .vault_pass || rm -f .vault_passAlternativa: secretos solo en el runner (AWS Secrets Manager, Vault HashiCorp) e inyectar con -e, sin cifrar en git. Vault de Ansible y Vault de HashiCorp resuelven problemas distintos; a menudo se combinan.
Rotacion
- Genera nuevo secreto en el sistema destino (DB
ALTER USER ... PASSWORD). ansible-vault edity actualizavault_*.- Playbook que despliega la app/config con el nuevo valor.
- Invalida el secreto antiguo.
rekeyperiodico de la password del vault (acceso al repo + password).
Errores comunes
- Commitear
.vault_passo imprimiransible-vault viewen logs de CI. - Misma password de vault para lab personal y produccion compartida.
- Cifrar
group_vars/all.ymlentero (dificulta review; cifra solovault.yml). - Dejar ficheros
*.ymldescifrados en el working tree tras undecryptde prueba. - Roles que hacen
debug: var=db_password"para comprobar".
Buenas practicas
- Prefijo
vault_en claves cifradas; variables publicas sin el valor en claro. - Password del vault en gestor (1Password, Bitwarden, SOPS+age en flujos avanzados).
- ACL del repo: quien clona no deberia poder descifrar prod sin el secreto aparte.
- Revisa con
git log -pque nunca entro un secreto en claro en un commit antiguo (si paso: rota + limpia historia o acepta rotacion como mitigacion). - En PRs, los ficheros vault aparecen como blob cifrado: pide review del cambio de claves por canal seguro.
Ejercicios
- Crea
vault.ymlconansible-vault create, anadevault_demo_secrety referencialo desde un play condebugsin imprimir el valor (usalengtho un checksum). - Corre el playbook con
--ask-vault-passy luego con--vault-password-file. - Usa
encrypt_stringpara una variable inline en unvars.ymlmixto. - Haz
rekeyy confirma que la password antigua ya no abre el fichero.
Siguiente paso
El capitulo 6 explica como escribir tareas que puedas re-ejecutar sin efectos secundarios no deseados.
