Introducción
Ansible Vault cifra variables confidenciales para que puedan almacenarse junto con los playbooks sin exponer secretos en texto plano. Un playbook solo puede utilizar el valor si usted proporciona una contraseña de vault válida.
En este laboratorio, creará una variable cifrada, observará el fallo que ocurre cuando falta la contraseña y ejecutará un playbook correctamente utilizando un archivo de contraseña de vault.
Crear un proyecto de práctica con Vault
En este paso, creará un proyecto que incluya un inventario, un directorio de variables de grupo, un directorio de playbooks y un directorio de informes.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars/managed,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF
La variable cifrada residirá en inventory/group_vars/managed, por lo que se cargará para el grupo managed como cualquier otro archivo de variables. La diferencia es que Ansible debe descifrarla antes de utilizarla.
Crear un archivo de contraseña de Vault
En este paso, creará un archivo de contraseña para la automatización del laboratorio. En un entorno de trabajo real, proteja este archivo cuidadosamente o utilice un flujo de trabajo basado en solicitudes de contraseña. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible. Esto mantiene la estabilidad de los comandos incluso cuando LabEx ejecuta cada paso por separado.
cd /home/labex/project/rhce-ansible
cat > vault_pass.txt <<'EOF'
labex-vault-pass
EOF
chmod 600 vault_pass.txt
Este archivo de contraseña es solo para el flujo de trabajo del laboratorio. El modo chmod 600 significa que solo el propietario puede leerlo y escribir en él, lo cual es el hábito mínimo que se debe practicar cuando un archivo puede desbloquear secretos.
ls -l vault_pass.txt
Busque permisos similares a -rw-------. Si el archivo es legible por el grupo u otros usuarios, vuelva a ejecutar el comando chmod 600.
Crear una variable cifrada
En este paso, utilizará ansible-vault encrypt_string para crear una variable cifrada llamada app_secret. El archivo cifrado se puede cargar como cualquier otro archivo de variables de grupo.
Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.
cd /home/labex/project/rhce-ansible
ansible-vault encrypt_string --vault-password-file vault_pass.txt 'redhat' --name app_secret > inventory/group_vars/managed/vault.yml
El comando escribe una variable YAML cifrada llamada app_secret. El nombre de la variable permanece legible, pero el valor redhat se almacena dentro de un bloque de Vault.
sed -n "1,8p" inventory/group_vars/managed/vault.yml
El archivo debería mostrar app_secret: !vault y una cabecera $ANSIBLE_VAULT;. No debería ver el secreto en texto plano en este archivo.
Escribir un playbook que utilice el secreto
En este paso, escribirá un playbook que hace referencia a app_secret. Sin la contraseña de vault, Ansible no puede descifrar esta variable.
Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.
cd /home/labex/project/rhce-ansible
cat > playbooks/use-vault.yml <<'EOF'
---
- name: Use an encrypted variable
hosts: managed
gather_facts: false
tasks:
- name: Write secret-derived file
ansible.builtin.copy:
dest: /home/labex/project/rhce-ansible/managed/secret.txt
content: |
secret={{ app_secret }}
mode: '0600'
EOF
El playbook utiliza app_secret como una variable normal. Ese es el objetivo de Vault: la lógica del playbook puede mantenerse limpia mientras el valor confidencial permanece cifrado en reposo.
ansible-playbook playbooks/use-vault.yml > reports/vault-missing.txt 2>&1 || true
Se espera que esta ejecución falle porque no se proporcionó la contraseña de vault. La salida se redirige a un informe para que pueda inspeccionar el fallo sin detener el laboratorio.
grep -Ei "vault|decrypt|password|secret" reports/vault-missing.txt
El error filtrado debería mencionar Vault, descifrado (decrypt), contraseña (password) o secreto (secret). Observe también que la verificación espera que aún no exista el archivo managed/secret.txt.
Ejecutar el playbook con la contraseña de Vault
En este paso, proporcionará el archivo de contraseña de vault para que Ansible pueda descifrar la variable y escribir el archivo de salida protegido. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/use-vault.yml --vault-password-file vault_pass.txt | tee reports/vault-run.txt
Ahora Ansible puede descifrar app_secret y pasar el valor en texto plano a la tarea copy durante la ejecución. El archivo cifrado en el disco permanece cifrado.
sudo ls -l managed/secret.txt && cat managed/secret.txt
El archivo debería tener el modo 600 y contener secret=redhat. Esto demuestra que el playbook utilizó el valor descifrado mientras seguía protegiendo el archivo secreto generado.
Resumen
Ha creado una variable cifrada con Vault, ha observado que el playbook no puede utilizarla sin una contraseña y, posteriormente, ha ejecutado el playbook con un archivo de contraseña de vault para descifrar y aplicar el secreto.


