Antecedentes
- Usamos Ansible para aprovisionar y administrar la infraestructura de Azure. En este momento ejecutamos Ansible "manualmente", es decir, ejecutamos manualmente libros de jugadas para diversas tareas automatizadas. No hay infraestructura de CI.
- Probablemente no sea relevante, pero gestionamos nuestro inventario mediante un script dinámico
azure_rm.py
. - Nos alienta a ser lo más seguro posible, es decir
- No almacene las contraseñas de Vault en
~/.vault_pass
o en ningún archivo local - No almacene los secretos de Azure en
~/.azure/credentials
- No almacene nada seguro
.bashrc
.
- No almacene las contraseñas de Vault en
En tal escenario, tengo problemas para encontrar una estrategia coherente para garantizar que mis libros de jugadas puedan acceder a los secretos de Azure, mientras sigo las pautas anteriores.
Pregunta
¿Cómo puedo evitar almacenar las credenciales de Ansible Vault y Azure en los archivos, sin dejar de garantizar que mis libros de jugadas puedan acceder a ellos?
Lo que he intentado
Hasta ahora he creado un script de envoltura que
- pide al usuario la contraseña de Vault
- Utiliza eso para descifrar un script de Vaulted Shell
- Evalúa el script, que carga las variables de entorno de Azure en el entorno;
- Ejecuta el libro de jugadas en el entorno que se ha configurado de este modo.
¿Hay alguna solución mejor (más elegante, menos complicada, más "Ansible")?
ansible
ansible-vault
Vish
fuente
fuente
Respuestas:
Contraseña de la bóveda
En primer lugar, debe familiarizarse con el hecho de que el archivo de contraseña de bóveda puede ser un script ejecutable. En este caso, Ansible lo ejecuta y espera recibir la contraseña como salida.
Por ejemplo, puede usar
gpg-agent
okeychain
almacenar su contraseña real y desbloquearla cuando sea necesario. Lea más en esta publicación de blog: https://benincosa.com/?p=3235Si eres un poco paranoico, puedes agregar una notificación cuando se llama a tu script de contraseña, así:
Este script de contraseña de almacén utiliza
key.gpg
como clave de almacén real y también muestra una notificación emergente (para MacOS) con el nombre del proceso principal cuando se utiliza el script. Gpg-agent almacena en caché la contraseña de desbloqueo durante algún tiempo, por lo que no es necesario ingresar la contraseña cada vez que inicie el libro de jugadas.Solo ponte
vault_password_file = ./vault_pass.sh
en tuansible.cfg
.Medio ambiente
Dijiste que lo usas
azure_rm.py
como script de inventario dinámico. Esto significa que debe establecer credenciales en sus variables de entorno antes de iniciar ansible-playbook para que pueda usarlas.Puedes hacer dos archivos:
secure_env
(cifrado con bóveda):set_env
(Texto sin formato):Cuando abre una nueva terminal para ejecutar sus tareas de automatización, debe ejecutar:
En este momento, bash evalúa
set_env
ysecure_env
(descifrado a través de ansible-vault). Después de este comando, tiene credenciales de Azure definidas para el shell actual, por lo que puede ejecutar libros de jugadas como de costumbre:Entonces, utilizando estos dos enfoques, puede almacenar
key.gpg
ysecure_env
en su repositorio; luego, en la nueva llamada de terminalsource set_env
una vez, ingrese la contraseña de gpg una vez (para desbloquear el uso futuro de key.gpg); luego llameansible-playbook
tantas veces como quiera sin ninguna contraseña.fuente
source
enfoque, configura el entorno una vez por sesión de terminal y puede utilizar toda la gama de herramientas por separado: ansible-playbooks, scripts de inventario, cli azul, sin envoltorios.Lea https://docs.ansible.com/ansible/2.4/vault.html Desde Ansible 2.4 se podría usar
--vault-id @prompt
.Cifre un archivo usando ansible-vault:
Ejecute el libro de jugadas y dará como resultado:
Hay varias opciones para descifrar archivos, que incluyen
@prompt
:preguntará:
Una vez que se ha ingresado la contraseña de la bóveda, el libro de jugadas debe tener éxito.
fuente
--ask-vault-pass
opción anterior . Y no entiendo cómo reemplazarlo con--vault-id
respondería la gran pregunta de un mejor flujo de trabajo.ansible-playbook --vault-id my-vault-password.py
. Pensé que quizás tenías una solución para usar un script de Python :) También estoy pensando en esto.