Esta es una pregunta muy amplia sobre métodos y consejos sobre variables / estructura del entorno. Pero en última instancia, estoy buscando respuestas para la pregunta muy específica de '¿Cómo debo almacenar mis variables de entorno?'
En primer lugar algunas aclaraciones:
- Para mí, un entorno puede ser de 3 a 10 servidores y es una forma de contener la infraestructura de un cliente específico.
- Dentro de cada entorno hay algunas variables que en su mayoría se generan automáticamente a partir de algunas entradas clave (nombre, tamaño, etc.).
Tal como está ahora, estamos almacenando todas nuestras variables de entorno en una estructura como esta:
<playbook>.yml # Various playbooks for deployment
roles/windows # Ansible role for Ubuntu
roles/ubuntu # Ansible role for Ubuntu
config/hosts/<name>.yml # Ansible inventory
config/hosts/vars/<name>.json # Environment specific variables
En este momento, la configuración se inicializa como un submódulo en el repositorio de git anterior. Como el archivo de variables cambia con bastante frecuencia, esto ha causado problemas con el cambio de datos, una, dos o incluso tres veces entre confirmaciones, lo que hace que los cambios sean cada vez más difíciles de rastrear.
Como lo veo personalmente en el futuro, deberíamos buscar almacenar todas nuestras variables de cliente de forma centralizada / escalable y luego conectarlo con un inventario dinámico con ansible .
Entiendo que hay algunas tecnologías que parecen hacer una parte de lo que se podría requerir, como el Cónsul, pero parecen funcionar mejor en un entorno que sirve para una gran aplicación en lugar de muchas más pequeñas y ligeramente diferentes.
Esencialmente, veo que tenemos que escribir un script de inventario y luego guardar todos nuestros datos en una base de datos construida sin fines específicos y luego continuar como si nada hubiera cambiado. Considero que esto es concebible como una forma de reducir potencialmente muchos de los datos que almacenamos actualmente y tal vez buscar diferentes formas de almacenar los datos en lugar de simplemente escalar lo que les sirve nuevamente.
Espero que alguien tenga algún tipo de experiencia en la implementación de infraestructura como código cuando tenga que lidiar con muchos entornos más pequeños en lugar de uno, dos o tres enormes.
¿Alguna sugerencia?
Si sus entornos son por cliente, sugeriría en su caso específico tener un repositorio por cliente . (En general, es un repositorio por entorno). Este repositorio tendría una estructura de directorio estándar para variables de entorno, variables e inventarios, secretos fuertemente cifrados (tokens de acceso a cuentas, claves privadas, etc.). Git submodule el código en esos repositorios. Probablemente lo haría en múltiples repositorios. Uno para roles y módulos ansibles, uno para scripts de mantenimiento e implementación, uno para cada aplicación principal que se ejecute en los entornos.
Ahora, opcionalmente, puede bifurcar el código o fijar el submódulo en una etiqueta específica para su lanzamiento , asegurándose de que el código que administra el entorno del cliente no cambie a menos que se pruebe y se libere.
Si está utilizando un repositorio de artefactos , asegúrese de que los artefactos estén versionados correctamente y que esas versiones estén especificadas en las variables de entorno correctamente.
La automatización es importante porque las variables de entorno no deben ser actualizadas por humanos cuando sea posible, sino generadas por scripts. Asegúrese de que casi no hay actualizaciones manuales en el inventario por cliente y los desarrolladores solo actualizan los repositorios de código. Si quieren hacer un cambio de configuración, se debe hacer en uno de los scripts generadores, que luego se ejecuta para generar las variables y el diff se confirma en el repositorio del cliente. Vale la pena configurar la integración continua para este proceso. Sin esto, en algún momento habrá demasiados repositorios para mantener .
fuente