Ansible y Molecule para Configuración y Testing
Este documento describe cómo usar Ansible para la configuración de recursos y Molecule para probar los roles de Ansible de forma aislada.
Propósito
Usamos Ansible para gestionar la configuración de estado de los recursos que Terraform provisiona. Esto incluye:
- Creación de esquemas de base de datos en PostgreSQL.
- Creación de colas y “exchanges” en RabbitMQ.
Molecule nos permite probar estos roles de Ansible en entornos efímeros y aislados (contenedores Docker), garantizando que son fiables y predecibles.
Estructura de Directorios
ansible/
├── inventory/
│ └── local.ini # Inventario para el entorno local
├── playbooks/
│ └── configure_local.yml # Playbook para configurar el entorno local
└── roles/
├── postgresql_config/ # Rol para configurar PostgreSQL
│ ├── tasks/main.yml
│ └── molecule/default/ # Escenario de testing para este rol
│ ├── molecule.yml
│ └── verify.yml
└── rabbitmq_config/ # Rol para configurar RabbitMQ
└── ...
Testing con Molecule
Puedes probar cada rol de forma individual usando Molecule. Esto es fundamental antes de integrar los roles en playbooks más grandes.
Flujo de Trabajo de Molecule
flowchart TD A[Inicio] --> B[Crear Contenedor] B --> C[Aplicar Rol] C --> D[Verificar Resultados] D --> E[Destruir Contenedor] style A fill:#4CAF50,stroke:#388E3C style B fill:#2196F3,stroke:#0D47A1 style C fill:#FFC107,stroke:#FF8F00 style D fill:#4CAF50,stroke:#388E3C style E fill:#F44336,stroke:#B71C1C
Este diagrama muestra el flujo completo de pruebas con Molecule:
- Crear Contenedor: Molecule inicia un contenedor Docker con la imagen especificada
- Aplicar Rol: Ejecuta el rol de Ansible contra el contenedor
- Verificar Resultados: Ejecuta las tareas de verificación para confirmar que el rol funcionó correctamente
- Destruir Contenedor: Limpia el entorno eliminando el contenedor
Prerequisitos
- Docker debe estar en ejecución.
- El entorno virtual de Python debe estar activado (
source .venv/bin/activate
).
Ejecutar Pruebas
Para probar un rol, navega a su directorio y ejecuta molecule test
.
Ejemplo: Probar el rol de PostgreSQL
source .venv/bin/activate
cd ansible/roles/postgresql_config
molecule test
Este comando ejecutará la secuencia completa de Molecule:
- Creación: Inicia un contenedor Docker con la imagen de
postgres
. - Convergencia: Aplica el rol de Ansible (
postgresql_config
) contra el contenedor. - Verificación: Ejecuta el playbook
verify.yml
para comprobar que el rol hizo su trabajo correctamente (ej. que las tablas existen). - Destrucción: Elimina el contenedor Docker.
Uso en el Pipeline Local
El Makefile
ha sido actualizado para incluir la configuración con Ansible como parte del despliegue local.
Flujo de Despliegue Local con Ansible
flowchart LR A[Infra Up] --> B[Ansible Configure] B --> C[App Build] C --> D[App Deploy] style A fill:#2196F3,stroke:#0D47A1 style B fill:#FFC107,stroke:#FF8F00 style C fill:#9C27B0,stroke:#4A148C style D fill:#4CAF50,stroke:#388E3C
Este diagrama muestra el flujo del comando make deploy-local
:
- Infra Up: Provisiona la infraestructura local con Terraform
- Ansible Configure: Configura los recursos (PostgreSQL, RabbitMQ) con Ansible
- App Build: Construye la imagen Docker de la aplicación
- App Deploy: Despliega la aplicación en el clúster local
Comandos Disponibles
Puedes ver todos los comandos disponibles y sus descripciones ejecutando make
o make help
:
deploy-local
: Despliega la pila completa de la aplicación localmente.destroy-local
: Destruye la pila completa de la aplicación local.infra-up
: Provisiona solo la infraestructura local (Minikube, Helm charts, S3).infra-down
: Destruye solo la infraestructura local.app-build
: Construye la imagen Docker de la aplicación y la carga en Minikube.app-deploy
: Despliega la aplicación en Minikube usando Helm.app-destroy
: Desinstala la aplicación de Minikube.
Integración en CI/CD (GitLab)
El pipeline de GitLab se actualizará para incluir dos nuevos pasos:
-
Test de Roles (Etapa
test
): Se añadirá un job que ejecutemolecule test
para todos los roles en cada commit. Esto previene que roles rotos lleguen a las ramas principales.ansible_test: stage: test image: python:3.9 before_script: - # Instalar dependencias script: - cd ansible/roles/postgresql_config && molecule test - cd ../rabbitmq_config && molecule test
-
Configuración de Entornos (Etapa
configure
): Después de que Terraform despliegue la infraestructura en un entorno (lab
oprod
), un nuevo job ejecutará el playbook de Ansible correspondiente para aplicar la configuración.ansible_configure_lab: stage: configure # ... (configuración similar) script: - ansible-playbook -i ansible/inventory/lab.ini ansible/playbooks/configure_lab.yml