Ansible Vault es una utilidad integrada en Ansible que permite cifrar y descifrar archivos de datos, como los YAML utilizados en inventarios, playbooks y roles. Esto es esencial para proteger información sensible como contraseñas, claves API o configuraciones confidenciales.
Comandos Básicos de Ansible Vault
La herramienta se ejecuta mediante el comando ansible-vault y ofrece varias subcomandos para gestionar el cifrado. A continuación, se detallan los más comunes:
[admin@controlador ~]$ ansible-vault --help
usage: ansible-vault [-h] [--version] [-v]
{create,decrypt,edit,view,encrypt,encrypt_string,rekey} ...
Utilidad de cifrado/descifrado para archivos de datos de Ansible
argumentos posicionales:
{create,decrypt,edit,view,encrypt,encrypt_string,rekey}
create Crea un nuevo archivo cifrado con Vault
decrypt Descifra un archivo cifrado con Vault
edit Edita un archivo cifrado con Vault
view Muestra el contenido de un archivo cifrado con Vault
encrypt Cifra un archivo YAML existente
encrypt_string Cifra una cadena de texto
rekey Cambia la contraseña de un archivo cifrado con Vault
argumentos opcionales:
--version Muestra la versión del programa y otras ubicaciones
-h, --help Muestra este mensaje de ayuda y sale
-v, --verbose Incrementa la verbosidad de Ansible para depuración
Operaciones Fundamentales de Cifrado
1. Crear y Cifrar un Archivo Nuevo
El subcomando create genera un archivo cifrado directamente. Se solicita una contraseña y luego se ingresa el contenido.
[admin@controlador proyecto]$ ansible-vault create inventario_seguro.yml
Nueva contraseña de Vault:
Confirmar nueva contraseña de Vault:
# Se escribe el contenido en el editor abierto, por ejemplo:
# all:
# hosts:
# servidor1:
# ansible_host: 192.168.1.10
[admin@controlador proyecto]$ cat inventario_seguro.yml
$ANSIBLE_VAULT;1.1;AES256
... (contenido cifrado en formato hexadecimal) ...
2. Cifrar un Archivo YAML Existente
Para cifrar un archivo ya creado, se usa encrypt. También es posible emplear un archivo de contraseña para automatizar el proceso.
[admin@controlador proyecto]$ echo "configuracion" > configuracion.yml
[admin@controlador proyecto]$ ansible-vault encrypt configuracion.yml
Nueva contraseña de Vault:
Confirmar nueva contraseña de Vault:
Cifrado exitoso
[admin@controlador proyecto]$ cat configuracion.yml
$ANSIBLE_VAULT;1.1;AES256
... (contenido cifrado) ...
# Alternativamente, usando un archivo de contraseña:
[admin@controlador proyecto]$ echo "clave_segura" > clave_vault.txt
[admin@controlador proyecto]$ ansible-vault encrypt playbook_adicional.yml --vault-password-file=./clave_vault.txt
Cifrado exitoso
3. Visualizar Contenido Cifrado
El comando view permite leer el contenido descifrado temporalmente sin modificar el archivo.
[admin@controlador proyecto]$ ansible-vault view configuracion.yml
Contraseña de Vault:
configuracion
# Otro ejemplo:
[admin@controlador proyecto]$ ansible-vault view inventario_seguro.yml
Contraseña de Vault:
all:
hosts:
servidor1:
ansible_host: 192.168.1.10
4. Editar Archivos Cifrados
Con edit, se abre el archivo en un editor después de ingreasr la contraseña, permitiendo modificaciones seguras.
[admin@controlador proyecto]$ ansible-vault edit inventario_seguro.yml
Contraseña de Vault:
# Se edita el contenido, por ejemplo, añadiendo un host
[admin@controlador proyecto]$ ansible-vault view inventario_seguro.yml
Contraseña de Vault:
all:
hosts:
servidor1:
ansible_host: 192.168.1.10
servidor2:
ansible_host: 192.168.1.11
5. Descifrar Archivos
El subcomando decrypt elimina el cifrado, dejando el archivo en texto plano. Se debe usar con precaución.
[admin@controlador proyecto]$ ansible-vault decrypt inventario_seguro.yml
Contraseña de Vault:
Descifrado exitoso
[admin@controlador proyecto]$ cat inventario_seguro.yml
all:
hosts:
servidor1:
ansible_host: 192.168.1.10
servidor2:
ansible_host: 192.168.1.11
6. Cambiar la Contraseña de Cifrado
Para actualizar la contraseña sin descifrar el archivo, se utiliza rekey.
[admin@controlador proyecto]$ ansible-vault rekey configuracion.yml
Contraseña de Vault:
Nueva contraseña de Vault:
Confirmar nueva contraseña de Vault:
Cambio de clave exitoso
Ejecución de Playbooks con Contenido Cifrado
Cuando un playbook o archivo de inventario está cifrado, se debe proporcionar la contraseña durante la ejecución. Hay dos métodos principales:
1. Entrada Interactiva de Contraseña
Al ejecutar un playbook cifrado, se utiliza --ask-vault-pass para solicitar la contraseña manualmente.
# Primero, se cifra un playbook
[admin@controlador proyecto]$ ansible-vault create despliegue.yml
Nueva contraseña de Vault:
Confirmar nueva contraseña de Vault:
# Se ingresa contenido, por ejemplo: un playbook simple
# Luego, se ejecuta con entrada interactiva
[admin@controlador proyecto]$ ansible-playbook despliegue.yml --ask-vault-pass
Contraseña de Vault:
PLAY [servidores] *****************************************************************************
TAREA [Recopilar hechos] *********************************************************************
ok: [servidor1]
TAREA [mostrar mensaje] **********************************************************************
ok: [servidor1] => {
"msg": "Ejecución segura"
}
RESUMEN DE EJECUCIÓN *************************************************************************
servidor1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2. Uso de Archivo de Contraseña
Para automatización, se puede cifrar el playbook con un archivo de contraseña y luego usar ese mismo archivo al ejecutarlo.
# Cifrar el playbook usando un archivo de contraseña
[admin@controlador proyecto]$ echo "mi_clave_secreta" > secret.txt
[admin@controlador proyecto]$ ansible-vault encrypt --vault-password-file=secret.txt despliegue.yml
Cifrado exitoso
# Ejecutar el playbook proporcionando el archivo de contraseña
[admin@controlador proyecto]$ ansible-playbook despliegue.yml --vault-password-file=secret.txt
PLAY [servidores] *****************************************************************************
TAREA [Recopilar hechos] *********************************************************************
ok: [servidor1]
TAREA [mostrar mensaje] **********************************************************************
ok: [servidor1] => {
"msg": "Ejecución segura"
}
RESUMEN DE EJECUCIÓN *************************************************************************
servidor1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0