Aujourd’hui je vous propose de configurer un pipeline Azure DevOps pour exécuter un script Terraform afin de provisionner un cluster Azure Kubernetes Services (AKS) !
Pour la prise en main de Terraform et la compréhension de son contenu je vous invite à consulter cet article qui servira de base à notre tuto du jour 🙂 Pour une approche plus globale de Terraform avec Azure je vous renvoie à cette vidéo (et sa suite) de Stanilas Quastana.
Les élements présentés ici sont tous disponible dans ce répo GitHub.
Terraform
Importer les fichiers
Dans mon projet Azure DevOps fraichement créé, onglet Repos j’importe les 6 fichiers disponibles :
Nous avons :
- output.tf : permet de spécifier les informations renvoyés par Terraform à l’issu du déploiement
- provider.tf : spécifie le provider cible : ici azurerm
- variables.tf : la définition des variables utilisées dans le script
- variables.tfvars : l’affectation de ces même variables
- main.tf : le script Terraform en lui même
Le contenu précis de ces fichiers est expliqué ici. Voyons maintenant les parties importantes de ces scripts pour notre automatisation.
Les variables
Dans le fichier .tfvars nous avons ceci :
On set les variables avec des valeurs assez abstraites pour le moment, nous y reviendrons tout à l’heure !
Le main.tf
Ce script contient un certain nombres de choses.
La description du Backend pour le stockage du tfstate :
La description du ressource group qui contiendra nos ressources Azure :
La définition d’un Azure Container Registry :
La définition du cluster Azure Kubernetes Services :
On remarque dans ce script l’utilisation des variable définies dans le tfvars au moyen de : ${var.nomDeLaVariable}
Configurer Azure DevOps
Service Connection
Avant de créer notre pipeline Azure DevOps nous aller configurer un service connection à notre tenant Azure. Pour cela dans les Project settings sélectionner l’onglet Service Connections.
Puis ajouter votre service connexion. Vous devrez renseigner les informations suivantes :
Pour créer un service principal vous pouvez utiliser cette commande dans une fenêtre powershell ou le shell du portail Azure :
az ad sp create-for-rbac --name ServicePrincipalName
Pour obtenir le tenantId et le subscriptionId utilisé actuellement vous pouvez utiliser cette commande :
az account show
Le pipeline
Il faut maintenant créer notre Pipeline pour exécuter ce script Terraform. Dans l’onglet Pipeline, choisir New Pipeline :
Mon code est ici stocké dans mon repo Azure DevOps mais il pourrait tout à fait être utilisé depuis mon repo GitHub.
Je choisi mon repository local :
Ici le pipeline est déja écrit, il faut donc le réutiliser :
Et sélectionner le fichier yml correspondant, ici nommé sobrement azure-pipelines.
Les variables du pipeline
Maintenant que notre pipeline est créé et avant de le détailler et de l’exécuter nous allons lui fournir les variables dont il aura besoin à l’execution. Pour cela, sélectionner Variables :
Vous allez devoir créer et valoriser l’ensemble de ces variables :
Ici vous avez du remarquer que toutes mes variables déclarées ont le même nom que la valeur affectée à la variable Terraform dans mon fichier tfvars modulo les deux underscores positionnés avant et après le nom :
aks-cluster-name = __aks-cluster-name__
Nous verrons très vite comment le lien entre ces variables AzureDevOps et le Terraform s’opère.
Le contenu du pipeline
Si on s’intéresse maintenant au pipeline en lui même on y trouve tout d’abord la copie des fichiers dans un espace de travail temporaire :
Gestion des variables
Etapes très importante ! Ici nous allons parcourir les fichiers tfvars et provider.tf pour y trouver __ positionnées autour d’un nom de variable. Exemple :
__aks-cluster-name__
Quand on en trouve un on remplace le aks-cluster-name
par la valeur renseignée précédemment dans la variable du pipeline :
Ainsi __aks-cluster-name
__ devient “clustervacd”.
On passe ensuite à la récupération de la dernière version de Terraform précisée dans une variable également :
Il est maintenant temps de voir les 3 étapes nécessaire à Terraform pour déployer mon infra.
Init
Le Init permet de tester la connexion à l’environnement cible, ici ma souscription Azure et mon backend. Ce backend, un storage account Azure doit bien sur avoir été créé au préalable.
Plan
Le plan permet de comparer le contenu décrit dans le script à son infra actuelle (via le tfstate). Ainsi Terraform obtient une liste d’élément à supprimer / modifier / créer.
Apply
L’étape Apply permet de réaliser le déploiement de notre infrastructure sur Azure. Ici aussi j’ai besoin de passer dans commandOptions le nom de mon fichier de variables.
Une fois mon pipeline enregistré, un build démarre :
Le pipeline est en cours d’execution :
Si vous cliquez sur l’étape Deploy vous obtiendrez les détails de l’exécution du traitement :
Une fois l’execution achevée, vous pourrez vérifier sur le portail Azure le bon déploiement de votre ressource group contenant un Azure Container Registry et un cluster Azure Kubernetes Services :
Et c’est terminé pour cette automatisation du déploiement d’un cluster AKS avec Terraform et Azure DevOps !
Dans un prochain article, nous verrons comment configurer un pipeline d’intégration / déploiement continu d’une application sur ce cluster AKS fraichement créé !
A bientôt !
Thomas