En este artículo vamos a ver como desplegar nuestra infraestructura con Terraform desde una Release de Azure DevOps. Pero en este caso nuestro state de Terraform va a estar ubicado en Terraform Cloud.

El primer paso es tener una cuenta de Terraform Cloud, para ello vamos a la url  https://app.terraform.io/signup/account para registrar una nueva cuenta.

Una vez creada la cuenta lo que vamos a hacer es crear un token que nos va a hacer falta luego.

Para crear este token dentro del panel principal, pulsamos en nuestro Avatar y luego en User Settings

Una vez dentro de nuestros settings pulsar en Tokens

Damos un nombre a nuestro token, pulsamos en Generate Token y ya tenemos nuestro token generado.

Nos copiamos este token ya que lo vamos a usar luego.

También necesitamos crear un Service principal en Azure, el cuál es explicado en la página de Terraform:

https://www.terraform.io/docs/providers/azurerm/auth/service_principal_client_secret.html

Ahora nos vamos a crear nuestra release en Azure DevOps.  Lo primero a hacer es ir a https://dev.azure.com , hacer login y acceder a nuestra organización de  Azure DevOps. Una vez dentro accedemos a nuestro team.

Luego pulsamos en Pipelines–>Releases  y por último en el botón New Pipeline

Una vez dentro pulsamos en Empty Job y damos un nombre a nuestro Stage.

Ahora pulsamos en  Add an artifact

Ahora en mi caso selecciono GitHub porque es donde yo tengo mi código de Terraform. Pero en tu caso podría ser una build de Azure DevOps o de un repositorio directamente de Azure DevOps etc.. El código esta ubicado en Github cuya url es https://github.com/recetasdevops/TerraformExamples

Una vez seleccionado el repositorio, la rama etc.. pulsamos en Add.

Ahora pulsamos en Variables porque vamos a configurar los datos necesarios para poder desplegar nuestra infraestructura en Azure.

 

De momento vamos a añadir las siguientes  4 variables:

TF_ARM_CLIENT_ID : [AppId de la aplicacion que hemos creado en Azure]

TF_ARM_CLIENT_SECRET:[Client Secret de la aplicación de Azure creada]

TF_ARM_SUBSCRIPTION_ID: [Id de la subscripción de Azure]

TF_ARM_TENANT_ID: [Tenant Id  de Azure]

Las 2 primeras variables son la información del Service principal creado al principio del post.

Ahora tenemos que crear un fichero con nombre .terraformrc que va a contener las credenciales de nuestro Terraform Cloud Account. En Sistemas Operativos Windows de forma directa no podemos crear un fichero con este nombre .terraformrc, pero a través de Git Bash sí.

Por eso abrimos un terminal de Git bash desde la carpeta donde vamos a crear nuestro fichero y haciendo botón derecho ratón –> Git Bash Here

Dentro del terminal tecleamos touch .terraformrc y ya tenemos nuestro fichero creado

Ahora ya podemos editar nuestro fichero normalmente en Notepad, VS Code etc.. donde más rabia os de vamos. El contenido del fichero debe ser algo así:

En REPLACE_ME debemos poner el token generado al principio del post en nuestra cuenta de terraform.io

Una vez realizados los cambios al fichero volvemos a Azure DevOps, vamos a nuestra Release y pulsamos sobre Tasks.

Seleccionamos Agent Job y luego en +

Buscamos secure file, seleccionamos Download secure file y pulsamos en Add

Ahora pulsamos sobre el icono de la rueda.

En la ventana emergente pulsamos en Browse.. y seleccionamos el fichero creado en nuestro PC, es decir .terraformrc

 

Ahora en la parte de Output Variables ponemos un Reference name con valor secureFile

Ahora volvemos de nuevo a la parte de Variables de nuestra Release y agregamos la variable TF_CLI_CONFIG_FILE. El valor de esta variable va a ser la ruta donde esta ubicado el ficherro .terrefaormrc que hemos subido a nuestra release. Para ello referenciamos el valor de la siguiente manera $(securefile.secureFilePath). 

 

Una vez agregada esta variable volvemos a la parte de Tasks

Agregamos una nueva tarea

Buscamos bash y pulsamos en Add

Seleccionamos la tarea añadida para configurarla, y vamos a Advanced y luego pulsamos en Working Directory.

En la ventana emergente seleccionamos el folder donde está nuestro fichero main.tf, en este caso AzureWebApp. Luego pulsamos en OK

Ahora vamos a Script Path y seleccionamos Inline. Agregamos el siguiente contenido al script:

terraform init

terraform plan

terraform apply -auto-approve

 

Ahora nos queda en la parte de Environment Variables poner las siguientes variables con los siguientes valores:

Variable Valor
TF_ARM_CLIENT_ID $( TF_ARM_CLIENT_ID)
TF_ARM_CLIENT_SECRET $(TF_ARM_CLIENT_SECRET)
TF_ARM_TENANT_ID $(TF_ARM_TENANT_ID)
TF_ARM_SUBSCRIPTION_ID $(TF_ARM_SUBSCRIPTION_ID)
TF_CLI_CONFIG_FILE $(TF_CLI_CONFIG_FILE)

 

Ahora vamos a configurar el tipo de agente que va a ejecutar nuestra Release. Para ello pulsamos en Agent job y seleccionamos nuestro Agent pool, en nuestro caso Hosted Ubuntu 1604. Lo bueno de este agente es que ya tiene instalado Terraform de serie y encima la versión más actualizada¡¡¡

Ahora damos un nombre a nuestra release y pulsamos en Save

 

Ahora ya sólo queda pulsar en Create Release y en Create y ver que se despliega correctamente nuestra infraestructura.

Una vez la release ha ido bien, vamos a https://app.terraform.io y accedemos a nuestro workspace,

Si pulsamos dentro del nombre del workspace, podemos ver nuestro cambio de estado de Terraform.

Por último, comentar que si nuestro State de terraform no está en terraform cloud y está por ejemplo en un Blob Storage de Azure, podemos usar tareas ya configuradas para realizar el despliegue con Terraform desde Azure DevOps. Una de estas tareas son https://marketplace.visualstudio.com/items?itemName=petergroenewegen.PeterGroenewegen-Xpirit-Vsts-Release-Terraform

El porqué de hacer este artículo era cómo desplegar haciendo uso del State de Terraform Cloud.

Espero os guste mi artículo¡¡¡

 

Referencias:

https://www.terraform.io/docs/enterprise/free/index.html

https://www.terraform.io/docs/commands/cli-config.html

 

 

Leave a Reply

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