Utilisation d’un fichier de variables Terraform avec Azure Devops

Tanguy SCHOUBERT
Publié par Tanguy SCHOUBERT
Catégorie : DevOps / Terraform
13/12/2024

Contexte

 

Nous déployons des ressources avec Terraform depuis Azure Devops.

Dans un fichier Terraform main.tf, il est recommandé d’utiliser des variables. Les avantages sont multiples: réutilisabilité, centralisation de la configuration, simplification de la maintenance, plus de flexibilité, amélioration de la sécurité en séparant les données sensibles du code…

 

Deux manières de référencer des variables Terraform

 

Une manière de le faire est de lister directement ces variables en paramètres de la ligne de commande « terraform plan ». Par exemple :

 

terraform plan -var myVar="var_value" -out main.tfplan

 

Cependant, il y a un nombre limite de variables que l’on peut lister en ligne de commande. Heureusement, afin de ne pas être limité et en plus de faciliter la gestion de ces variables, on peut les stocker dans un fichier dédié puis référencer ce fichier en ligne de commande :

 

terraform plan -var-file terraform.tfvars -out main.tfplan

 

On peut assigner des valeurs à ces variables directement dans ce fichier. Cependant, une modification de leur valeur nécessitera un changement dans le code de notre repository, ce que nous voulons éviter. La solution pour éviter cela est la suivante : relier ces variables Terraform à des variables Devops, dans un pipeline ou dans un variable group. Pour cela, voici la marche à suivre.

 

Implémentation de la chaîne de CI-CD

 

D’abord il nous faut stocker ce fichier de variables que nous appellerons « terraform.tfvars » dans le repository avec les autres fichiers Terraform, dans un folder dédié :

 

 

Dans ce fichier, nous devons ensuite lier les variables Terraform à des variables Devops. Pour faciliter la compréhension et la maintenance, nous assignons le même nom aux variables Devops :

 

 

Dans notre pipeline de Build, nous avons besoin de deux tasks afin de générer en sortie l’artefact qui servira d’input au pipeline de Release :

 

- task: CopyFiles@2
  displayName: "Copy Files to: terraform"
  inputs:
    SourceFolder: HR/Terraform
    TargetFolder: "$(build.artifactstagingdirectory)/terraform"

- task: PublishPipelineArtifact@1
  displayName: "Publish Pipeline Artifact : terraform"
  inputs:
    targetPath: "$(build.artifactstagingdirectory)/terraform"
    artifact: terraform

 

Nous pouvons ainsi visualiser notre fichier de variables dans les artefacts générés :

 

 

Dans le pipeline de Release, une task doit être exécutée au préalable avant les instructions Terraform.

En effet il faut indiquer au processus qu’il faut interpréter les variables Devops comme telles dans le fichier. La task permettant de faire cela est la task « Replace tokens », configurée avec le bon Token pattern utilisé dans le fichier. Dans notre cas, « $( … ) » :

 

 

Ensuite, ne pas oublier deux choses :

  • Référencer le fichier de variables dans l’exécution de la commande « terraform plan » comme indiqué au début de l’article.
  • Avoir configuré les variables Devops directement dans le pipeline ou dans des variables groups auxquels le pipeline est lié.

 

Toute votre gestion de variables Terraform est maintenant gérée dans Devops.