Terraform + Azure CI/CD

Como sabemos de otros artículos anteriores, Terraform es un software de infraestructura como código que permite, entre otras cosas, desplegar la infraestructura desarrollada en las cloud como puede ser Azure, con la ejecución de sencillos comandos.

Si queremos automatizar este despliegue de infraestructura podemos integrar nuestro código de terraform en un ciclo de Integración Continua y despliegue Continuo. Esta integración es lo que se va a explicar en este artículo.

Integrar nuestro código de terraform en un ciclo de integración y despliegue contínuos

En primer lugar, utilizaremos como control de versiones Github y como plataforma CI/CD Azure DevOps.

Como parte fundamental desarrollaremos nuestro módulo en Visual Studio Code con la estructura típica de los proyectos de Terraform,

En el ejemplo mostrado se puede ver un ejemplo para la creación de un resource group en la subscripción en la que estemos logados. Dispone de los siguientes ficheros:

  • main.tf: fichero en el que se encuentra el código.
  • variables.tf: fichero en el que se encuentran definidas las variables que se van a utilizar.
  • outputs.tf: fichero en el que se especifica los valores de salida que se quieren informar.
  • providers.tf: fichero en el que se indican los providers a utilizar, en este caso se indicará la versión mínima de terraform y que se quiere utilizar el provider de Azure.
  • terraform.tfvars: fichero en el que se indican los valores que se les pasará a las variables.

Desde el propio Visual Studio Code podemos subir nuestro código a nuestro repositorio de Git.

Una vez tengamos nuestro código desarrollado, probado y subido a Github es el momento de configurar Azure DevOps para poder hacer uso de la integración y despliegues contínuos.

En primer lugar, para poder tener acceso desde nuestro Azure DevOps a nuestra subscripción definida en Azure Portal, para ello debemos crear una Service Connection de tipo Azure Resource Manager:

La conexión que crearemos será de tipo Service Principal (manual). Para crear este tipo de conexión necesitamos saber además del id y nombre de la subscripción con la que nos queremos conectar, hacer falta saber el Id del service principal que vamos a usar para conectarnos y su secret.

Una vez introducidos los datos se puede comprobar que la conexión es correcta presionando Verify. Para hacer uso de nuestro módulo subido en Github nos crearemos un repositorio en Azure Repos con la siguiente estructura:

En el fichero variables.tf tendremos definidas las variables que se van a usar y en el fichero tfvars el valor que tendrán las mismas, de la misma manera que tenemos en el módulo de Github.

En el fichero main.tf lo que tendremos será la invocación a nuestro código de Github.

En el fichero versions.tf se especificará qué versiones de terraform y del provider de azurerm se quieren utilizar.

En el fichero azure-pipeline.yaml lo que tendremos será la especificación para la build pipeline. Lo único que querremos es generar el artefacto para que esté disponible para usar en la release.

Como se puede ver en la imagen simplemente indicamos que se va a usar la rama master, el pool de agentes que vamos a utilizar y que se va a publicar el artefacto al que se llamará drop.

Digital Lover

Como siguiente paso, lo que habrá que hacer es crear la pipeline del build, que como ya tenemos el fichero .yaml creado es muy sencillo.

Se accederá a Pipeline y ahí se dará al botón de New Pipeline, seleccionando a continuación dónde tenemos nuestro código. En nuestro caso es Azure Repos puesto que tenemos ahí la invocación a los módulos. Tras seleccionar el repositorio le indicaremos que vamos a usar un yaml ya existente.

Una vez creado se le dará a Run y al terminar la ejecución podremos ver como habrá publicado el artefacto drop que le hemos indicado.

En primer lugar, en la parte de Artifacts añadiremos el artefacto que acabamos de crear con la ejecución de la build pipeline.

Una vez añadido iremos al stage para incluir ahí las tareas que queremos que se ejecuten. En primer lugar tendremos que indicar qué agente queremos usar.

Como tareas a ejecutar vamos a añadir las relacionadas con terraform: Install versión, init, plan y apply.

Si es la primera vez que se van a utilizar se encontrarán estos tipos de tareas en el Marketplace y habrá que instalarlas en nuestra organización de DevOps.

En la tarea Terraform tool installer indicaremos la versión de terraform que queremos utilizar para la ejecución. A continuación se crearán las tareas de terraform para el init, el plan y el apply.

En el campo Command será donde indicaremos el comando de terraform que queremos ejecutar.

Desde el directorio de Configuración seleccionaremos la ubicación en la que se encuentra nuestro código. Como se puede observar en la imagen a lo que se accede es al Artifact que hemos indicado en la pipeline release que vamos a utilizar.

A continuación habrá que rellenar la configuración de Azure.

Azure Subscription: Habrá que seleccionar la Service Connection que nos hemos creado anteriormente.

Resource Group: Este resource group, es el resource group que tiene que existir previamente y que albergará el storage account en el que se quiere almacenar el tfstate de las ejecuciones.

Storage Account: Storage account en el que se almacenará el resultado de la ejecución.

Container: Aquí indicaremos tfstate

Key: Incluiremos cualquier clave que sea única para identificar el tfstate.

En las tareas de plan y apply, además de indicar en el directorio de configuración dónde se encuentra el código y la service connection que se va a utilizar, tendremos que indicarle la ubicación del fichero tfvars del que tiene que leer los valores de las variables, para ello se incluirá el argumento –var-file en los argumentos adicionales.

Una vez rellenadas todas las tareas se presionará en Create Release y realizará la ejecución y, por tanto, se desplegará el recurso en nuestra subscripción de Azure.

Para posteriores ejecuciones, cuando se lance la build pipeline, lo cual se puede ejecutar automáticamente cuando se haga un cambio en el repo que tenemos en Azure Repos, la release se lanzará automáticamente puesto que lo tenemos configurado para que se ejecute después del build.

Como se ve en la imagen también se puede programar para que se ejecute en un momento determinado.

 

Guía de posibilidades profesionales sobre Azure
He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA