Burricornio Dev

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:

  1. Crear Contenedor: Molecule inicia un contenedor Docker con la imagen especificada
  2. Aplicar Rol: Ejecuta el rol de Ansible contra el contenedor
  3. Verificar Resultados: Ejecuta las tareas de verificación para confirmar que el rol funcionó correctamente
  4. 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:

  1. Creación: Inicia un contenedor Docker con la imagen de postgres.
  2. Convergencia: Aplica el rol de Ansible (postgresql_config) contra el contenedor.
  3. Verificación: Ejecuta el playbook verify.yml para comprobar que el rol hizo su trabajo correctamente (ej. que las tablas existen).
  4. 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:

  1. Infra Up: Provisiona la infraestructura local con Terraform
  2. Ansible Configure: Configura los recursos (PostgreSQL, RabbitMQ) con Ansible
  3. App Build: Construye la imagen Docker de la aplicación
  4. 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:

  1. Test de Roles (Etapa test): Se añadirá un job que ejecute molecule 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
    
  2. Configuración de Entornos (Etapa configure): Después de que Terraform despliegue la infraestructura en un entorno (lab o prod), 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