Desplegar con Terraform desde una release de Azure DevOps usando como state Terraform cloud.
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