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_passo 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-agentokeychainalmacenar 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.gpgcomo 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.shen tuansible.cfg.Medio ambiente
Dijiste que lo usas
azure_rm.pycomo 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_envysecure_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.gpgysecure_enven su repositorio; luego, en la nueva llamada de terminalsource set_envuna vez, ingrese la contraseña de gpg una vez (para desbloquear el uso futuro de key.gpg); luego llameansible-playbooktantas veces como quiera sin ninguna contraseña.fuente
sourceenfoque, 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-passopción anterior . Y no entiendo cómo reemplazarlo con--vault-idresponderí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.