Automatización del despliegue de infraestructura con GitHub Actions

Clase 13 de 22Curso de Introducción a DevOps

Resumen

La implementación de DevOps para infraestructura como código (IaC) permite automatizar despliegues y mantener consistencia entre entornos. Este enfoque, aplicando principios de CI/CD a herramientas como Terraform, no solo mejora la eficiencia sino que también minimiza errores humanos, facilitando la gestión de infraestructura a escala.

¿Cómo configurar CI/CD para Terraform en GitHub Actions?

Una vez desplegada tu infraestructura manualmente con Terraform, el siguiente paso lógico es automatizar este proceso mediante pipelines de CI/CD. La automatización permite que cada cambio en tu código de infraestructura se valide y despliegue de manera consistente, siguiendo las mismas prácticas que utilizarías para una aplicación de software.

Para configurar un pipeline de CI/CD para Terraform en GitHub Actions, necesitamos:

  1. Crear un Service Principal en Azure para la autenticación.
  2. Configurar los secretos necesarios en GitHub.
  3. Definir el workflow de GitHub Actions para el despliegue automatizado.

¿Qué es un Service Principal y cómo crearlo?

Un Service Principal es esencialmente una cuenta de servicio en Azure que permite a aplicaciones externas autenticarse y gestionar recursos en tu suscripción de Azure sin necesidad de utilizar credenciales de administrador.

Para crear un Service Principal, ejecutamos el siguiente comando en la terminal de Azure CLI:

az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/SUBSCRIPTION_ID"

Este comando nos proporcionará cuatro valores críticos:

  • appId (será nuestro CLIENT_ID)
  • password (será nuestro CLIENT_SECRET)
  • tenant (será nuestro TENANT_ID)
  • subscription (ya lo deberíamos tener)

Es crucial guardar estos valores en un lugar seguro, ya que serán necesarios para configurar la autenticación en nuestro pipeline de CI/CD.

¿Cómo configurar los secretos en GitHub?

Para que GitHub Actions pueda interactuar con Azure, necesitamos almacenar de forma segura las credenciales del Service Principal. En GitHub:

  1. Ve a tu repositorio
  2. Navega a "Settings" > "Secrets and variables" > "Actions"
  3. Crea los siguientes secretos:
    • ARM_CLIENT_ID: El valor de appId
    • ARM_CLIENT_SECRET: El valor de password
    • ARM_SUBSCRIPTION_ID: Tu ID de suscripción
    • ARM_TENANT_ID: El valor de tenant
    • ARM_ACCESS_KEY: Token SAS para el backend de Terraform (si usas Azure Storage como backend)

Estos secretos permitirán que tu workflow de GitHub Actions se autentique en Azure sin exponer información sensible.

¿Cómo definir el workflow de GitHub Actions?

Ahora, creamos un archivo YAML en la ruta .github/workflows/ de nuestro repositorio con la siguiente estructura:

name: Deploy Infrastructure

on:
  push:
    branches: [ main ]

jobs:
  terraform:
    runs-on: ubuntu-latest
    
    defaults:
      run:
        working-directory: ./infra
        
    steps:
    - uses: actions/checkout@v2
      
    - name: Terraform Init
      run: terraform init -backend-config="access_key=${{ secrets.ARM_ACCESS_KEY }}"
      
    - name: Terraform Validate
      run: terraform validate
      
    - name: Terraform Plan
      run: terraform plan
      env:
        ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
        ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
        ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
        ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
      
    - name: Terraform Apply
      run: terraform apply -auto-approve
      env:
        ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
        ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
        ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
        ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}

Este workflow:

  1. Se activa con cada push a la rama main
  2. Ejecuta Terraform en el directorio ./infra
  3. Inicializa Terraform con el backend configurado
  4. Valida la sintaxis del código Terraform
  5. Genera un plan de ejecución
  6. Aplica los cambios automáticamente

¿Qué hacer cuando encuentras errores en tu workflow?

Es común enfrentar errores durante la configuración inicial de tu pipeline de CI/CD. Un error frecuente está relacionado con la configuración del backend, especialmente en la sintaxis para acceder a los secretos.

Si encuentras errores como backend config está mal puesto, revisa:

  1. La sintaxis de tus variables y secretos en el archivo YAML
  2. Asegúrate de que no hay comillas extras o faltantes
  3. Verifica que los nombres de los secretos coincidan exactamente con los que configuraste

Para solucionar estos problemas, puedes:

  1. Crear una nueva rama para hacer los cambios necesarios
  2. Modificar el archivo de workflow
  3. Crear un PR y fusionarlo a la rama principal
  4. Verificar que el workflow se ejecute correctamente después de los cambios

Si bien puede parecer un proceso burocrático, seguir estas prácticas garantiza la calidad y trazabilidad de los cambios en tu infraestructura.

¿Cuáles son los beneficios de automatizar la infraestructura?

La automatización de la infraestructura mediante CI/CD ofrece numerosos beneficios:

  1. Consistencia: Cada despliegue sigue exactamente el mismo proceso
  2. Velocidad: Los despliegues son más rápidos y requieren menos intervención manual
  3. Trazabilidad: Todos los cambios quedan registrados en el sistema de control de versiones
  4. Calidad: La validación automática reduce errores y problemas de configuración
  5. Colaboración: Los equipos pueden trabajar juntos en la infraestructura mediante PRs y revisiones de código

Cuando el pipeline está correctamente configurado, puedes centrarte en mejorar tu infraestructura en lugar de preocuparte por cómo desplegarla. Esto facilita añadir componentes adicionales o modificar los existentes, ya que GitHub Actions se encargará de desplegar los cambios de forma consistente.

La infraestructura como código ha difuminado la línea entre desarrollo y operaciones, permitiendo que los profesionales transiten entre ambos dominios con mayor facilidad y confianza.

¿Has implementado CI/CD para tu infraestructura? Comparte tus experiencias y los desafíos que has encontrado en este proceso. Tu perspectiva podría ayudar a otros en su camino hacia la automatización de infraestructura.