Desplegar una infraestructura con Terrafom usando Github Actions

Ya que tengas algo de experiencia desplegando recursos al proveedor que más te guste de infraestructura por medio de Terraform. Y que hasta tengas tus módulos. Entonces es momento de ponerlo dentro de una Github Action y ver que toda tu infraestructura se despliegue por medio de un commit, estableciendo un proceso de CI/CD de la mejor manera posible.

Para comenzar, en el caso de Azure, necesitarás crear un servicio principal se trata de un servicio que le permitirá a la acción poder crear recursos sin ningún problema. Para ello, desde tu Azure CLI escribe el siguiente comando.

az ad sp create-for-rbac --name "terraformActions" --role contributor 
--scopes /subscriptions/"subscriptionId" --sdk-auth

Este comando regresará algo muy parecido a esto.

Lo que más te interesa del resultado es, clientId, clientSecret, subscriptionId, tenantId. Ya con un repositorio creado donde se encuentre tu proyecto de Terraform que luzca algo muy parecido a esto.

Con tu proyecto ya listo, ve a Configuración>Secretos, y ahí crea cuatro secretos, estos secretos corresponden a los cuatro datos obtenidos a partir de la creación de tu servicio principal.

Quiero hasta aquí aclarar que realmente no necesitas crear los cuatro secretos, el único que realmente importa aquí es clientSecret pero en lo personal prefiero hacer esto en lugar de crear un archivo .tfvars en el proyecto y poner ahí los campos restantes, de cualquier manera ambos casos tienen sus ventajas. Ahora, sigamos con la creación de una Github Action.

Creando mi Github Action

Como podrás notar, Github nota el tipo de tecnología que tienes en tu repositorio y te hace una sugerencia del tipo de acción que podrías crear, en lugar de apoyarte en Github, mi particular truco es tomar la plantilla que se encuentra en el sitio de Terraform.

Esta plantilla considera seis pasos para completar la acción. Los pasos en el orden pensado son los siguientes.

  • Checkout: Extracción de los recursos desde el repositorio, básicamente en cualquier acción debes hacerlo.
  • Terraform format: Verificación de que todos los documentos de Terraform tengan un formato adecuado.
  • Terraform init: Inicia la configuración de Terraform.
  • Terraform validate: Validación general, que la sintaxis esté correcta.
  • Terraform plan: Muesta que acciones se ejecutarán.
  • Terraform apply: Crea los recursos en el proveedor de la misma manera que fueron estimados en el plan.

Después de tener estos pasos, tu archivo YAML lucirá de esta manera.

name: 'Terraform GitHub Testing CI'

on:
  push:
    branches:
      - master
#just for testing
jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    steps:
      - name: 'Checkout'
        uses: actions/checkout@master
      - name: 'Terraform Format'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'fmt'
      - name: 'Terraform Init'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'init'
      - name: 'Terraform Validate'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'validate'
      - name: 'Terraform Plan'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'plan'
          args: '-var=client_secret=${{secrets.clientSecret}} -var=sub=${{secrets.subscription}} -var=client_id=${{secrets.clientId}} -var=tenant_id=${{secrets. tenantId}}'
      - name: 'Terraform Apply'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'apply'
          args: '-var=client_secret=${{secrets.clientSecret}} -var=sub=${{secrets.subscription}} -var=client_id=${{secrets.clientId}} -var=tenant_id=${{secrets. tenantId}}'

Hay una parte sumamente importante que debes notar dentro de esta acción. En los pasos de Terraform plan y Terraform apply nota que estoy agregando la propiedad args, aquí debes agregar cada una de las variables que deseas invocar desde tus secretos para permitir que el proveedor de Terraform los pueda utilizar para crear los recursos adecuados.

De nuevo, aquí podrás agregar solo una variable o las que requieras. Nota que en el ejemplo que puse agregué los cuatro valores requeridos por el proveedor para crear recursos, simplemente lo hice así porque no hay casi ningún ejemplo que te muestre como hacerlo así que tendrás ambas posibilidades. Como sea, eso será decisión tuya y de tu equipo.

Muy bien, entonces, después de todo esto, solo ejecuta un commit y lo que verás será el flujo de tu acción ejecutándose.

Ya solo falta que vayas a Azure y puedas confirmar que tus recursos se encuentran ahí. Si algo te falló no olvides ponerlo aquí en los comentarios, si todo salió bien, nos vemos en la próxima.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *