En este artículo vamos a ver cómo podemos ejecutar Terraform en remoto teniendo nuestro código en un repositorio en Github, haciendo que cada vez que se hace un cambio en una rama que elijamos  se ejecute Terraform en remoto a través de Terraform Cloud.

Cuando me refiero a ejecutar en remoto, quiero decir a que se realizan los mismos pasos que si desplegáramos nuestro código en local:

terraform init.: Descargar los providers necesarios para que se ejecute nuestro plan…

terraform plan :Para saber qué cambios hay que realizar en nuestra infraestructura desde la última vez que hicimos terraform apply.

terraform apply : Ejecuta el plan de terraform, es decir desplegar nuestra infraestructura

Si usáramos Azure DevOps para ejecutar nuestro código de Terraform, también sería en remoto bien usando un agente privado o uno hosted. En este artículo cuando me refiero a remoto, es a un servicio autogestionado en el que no necesitas crear ningun  infraestructura para ejecutar tu código de Terraform, es Terraform Cloud el que se encarga de ejecutar el código.

 Pero nada mejor que ver como se hace para ver cómo funciona.

Lo primero que necesitamos es un repositorio de Github. Acordaros al crearlo crear un fichero .gitignore Terraform. De esta manera al subir el código no os subirá cosas como el tfstate, el cuál no debería nunca subirse a vuestro repositorio de código.

Después de crear el repositorio subimos nuestros ficheros .tf (el cuál esta disponible en https://github.com/recetasdevops/TerraformCloudRemoteExecution ). Este código genera los siguientes recursos en Azure una vez sea desplegado:

  • Un resource group
  • Un servidor SQL Server
  • Una base de datos SQL Server

Una vez creado el repositorio, vamos a Terraform Cloud https://app.terraform.io/app, y una vez dentro vamos a Settings –> VCS Providers

Una vez dentro pulsamos en Add VCS Provider

En el formulario elegimos que proveedor vamos a usar, en este ejemplo Github.com

Respecto al tema de Azure DevOps, de momento no hay conexión pero la gente de HashiCorp está trabajando en ello https://www.hashicorp.com/resources/terraform-cloud-ga-collaboration-for-everyone

Ahora damos un nombre identificativo, en este caso GitHubRecetasDevOps

Ahora abrimos otra ventana del navegador y ponemos https://github.com/settings/applications/new para crear una aplicación OAuth en Github

Una vez dentro ponemos un nombre descriptivo a la aplicación,  como homepage https://app.terraform.io y como Authorization Callback Url de momento ponemos http://localhost (más adelante cambiaremos este valor). Por último pulsar en Register Application.

Ahora nos copiamos tanto el Client ID como el Client Secret de la aplicación creada, ya que debemos usar estos valores en la página de Terraform Cloud.

Volvemos de nuevo a Terraform Cloud y ponemos  el Client ID y el Client Secret. Luego pulsamos en Create VCS Provider.

En la pantalla que nos aparece nos copiamos el Callback Url.

Ahora volvemos de nuevo a la página de GitHub donde nos habíamos quedado y sustituimos el valor de Authorization callback URL  por el obtenido de Terraform Cloud. Después pulsamos en Update application

Volvemos de nuevo a Terraform Cloud y pulsamos en Connect organization recetasdevops

En la página siguiente pulsamos en Authorize recetasdevops. Con esto ya tendríamos creada la conexión correctamente entre Terraform Cloud y Github.

Ahora volvemos de nuevo a Terraform Cloud y en el menú pulsamos en Workspaces y luego en New WorkSpace

En la página de configuración del Workspace pulsamos en:

En la siguiente paso elegimos el repositorio con nuestro código de Terraform, en nuestro ejemplo TerraformCloudRemoteExecution

En el siguiente paso se nos pide un nombre del workspace, en nuestro caso dejamos el nombre del repositorio.

También se nos pide  el directorio de trabajo donde están ubicados los fichero .tf de Terraform y por tanto donde se van a ejecutar los comandos de terraform (terraform plan, terraform apply …). En caso de dejar vacío este campo, por defecto se supone que los ficheros están en el raíz del repositorio.

Por último podemos decir cuál es la rama que va a provocar que se ejecute el código de Terraform. En caso de estar vacío por defecto sería la rama de Github por defecto, es decir master. Ahora pulsamos en Create workspace

En la siguiente pantalla vamos a pulsar en Configure variables

Nos sale la siguiente página:

Cómo puedes ver hay dos tipos de variables, terraform variables y environment variables. En terraform variables, que sería como tener un fichero terraform.tfvars, vamos a definir el valor de las variables creadas en el fichero variables.tf de nuestro repositorio. Estas variables son:

location : Ubicación de los datacenters de Azure donde van a ser desplegados los recursos.

sql_server_name : nombre del servidor SQL Server que se va a crear.

sql_server_database_name : nombre de la base de datos a crear.

sql_server_user : administrador del  servidor de base de datos

sql_server_password : password del usuario administrador del  servidor de base de datos.

Ahora pulsamos en Add variable y vamos añadiendo y configurando cada una de las variables mencionadas arriba. Cuando ya tengamos una variable configurada pulsamos en Save variable y ya vamos asignando la siguiente variable.

De estas variables, hay una muy “delicada” en lo que ha seguridad se refiere que es sql_server_password. A la hora de crear este tipo de variables debemos aceptar el checkbox Sensitive, lo que va a provocar que cuando pulsemos en  Save variable nunca más veamos su valor y solo nos permita cambiar el valor de la variable por uno nuevo.

Una vez definidas las Terraform variables, vamos a definir las Environment variables. Y ¿Qué vamos a definir en las Environment Variables?. Pues vamos a definir la configuración de Azure para poder desplegar nuestra insfraestructura, al igual que haríamos cuando trabajamos en Terraform en local. Aquí no podemos usar Azure CLI ,ya que este método requiere interacción con el usuario, es por ello que debemos crear un Azure principal. Las variables a definir son:

ARM_CLIENT_ID : El AppId del service principal.

ARM_CLIENT_SECRET: El secreto del service principal.

ARM_SUBSCRIPTION_ID: El id de la subscripción de Azure.

ARM_TENANT_ID: El id de tu directorio de Azure.

En Environment Variables,  pulsamos en Add Variables y vamos añadiendo las variables comentadas arriba.

Con ARM_CLIENT_SECRET al igual que con sql_server_password la hemos marcado como oculta.

Una vez definidas las variables necesarias, ya podemos realizar nuestro primer plan de terraform. Como es nuestro primer plan, este lo debemos de hacer manualmente con los ficheros tal y como están ahora en el repositorio. Para ello vamos a la parte de arriba de la página y en el menú pulsamos en Queue Plan, damos una descripción y pulsamos en Queue plan

Nos aparece la siguiente página. Nos muestra, si todo ha ido bien el plan de terraform a ejecutar y una confirmación para realizar el apply y desplegar la infraestructura. Pulsamos en Confirm & Apply

Se nos pide un comentario para realizar el Apply. Luego pulsamos en Confirm plan.

A continuación podemos ir viendo cómo se despliega nuestra infraestructura, lo que vendría siendo ejecutar un terraform apply

Si todo ha ido bien, se nos confirmará que se ha desplegado todo correctamente. Podemos pulsar en Add Comment por si queremos anotar algo sobre el despliegue.

Si vamos al portal de Azure (https://portal.azure.com), deberíamos encontrarnos con que efectivamente se ha desplegado correctamente el resource group, el servidor y la base de datos de SQL Server.

Ahora realizamos un pequeño cambio en nuestro fichero main.tf que provoque que se vuelva  a ejecutar un nuevo plan en Terraform Cloud. El cambio a realizar es agregar un nuevo tag al resource group:

Hacemos commit de ese cambio.

Si pulsamos en el menú Runs  nos aparece el nuevo plan.

Si pulsamos sobre él nos vuelve a aparecer el mismo flujo que hicimos en el primer plan.

Si todo va bien el plan será correcto…

Si volvemos a ir al portal de azure https://portal.azure.com podemos ver que el nuevo tag se ha creado correctamente:

Y eso es todo, espero os haya gustado el artículo y hasta la próxima.

Leave a Reply

Your email address will not be published. Required fields are marked *