Terraform sur Microsoft Azure | 2 – Notions fondamentales

CLOUD & INFRA
Temps de lecture : 8 minutes
Julien CORIOLAND
Senior Software Engineer & Cloud Architect chez Microsoft

« Je suis ingénieur logiciel senior et architecte du Cloud, vivant à Paris et travaillant pour Microsoft depuis 2015. Avant de rejoindre Microsoft, j’ai été développeur et formateur pendant 7 ans, principalement sur les technologies Microsoft .NET, Web et cloud. »

 

Terraform sur Microsoft Azure | 2 - Notions fondamentales

Ce billet de blog fait partie d’une série d’articles sur l’utilisation de Terraform sur Microsoft Azure :

Dans cette partie, vous sera présenté les aspects fondamentaux de Terraform et comment démarrer facilement pour déployer une infrastructure sur Azure.

Télécharger et installer Terraform

Terraform est basé sur une architecture de plugins. Pour commencer, téléchargez le fichier exécutable principal et installez-le sur votre machine. Celui-ci se chargera de télécharger le ou les plugins adaptés en fonction des plateformes/fournisseurs avec lesquels vous travaillez. L’installation est très simple : décompressez le fichier binaire que vous avez téléchargé et placez-le de sorte qu’il soit accessible depuis votre PATH.

Pour vérifier votre installation, exécutez la commande terraform –version :

PS C:\workspaces\hello-tf-azure> terraform --version
Terraform v0.12.7

Créer un projet Terraform basique

Un projet/contexte Terraform est spécifique à un répertoire. Créez un répertoire et nommez-le hello-tf-azure. Ajoutez un fichier main.tf à ce répertoire, avec le contenu suivant :

provider "azurerm" {
version = "~>1.33"
}

 

resource "azurerm_resource_group" "rg" {
name     = "hello-tf-azure-rg"
location = "francecentral"
}

Ce fichier est vraiment simple :

  • la directive provider indique que nous voulons utiliser la version 1.33 du fournisseur azurerm, c’est-à-dire que nous allons utiliser le fournisseur Terraform Azure Resource Manager, l’un des plugins disponibles pour Terraform qui permet de déployer des ressources sur Azure. Il faut toujours préciser la version du fournisseur que vous voulez utiliser, afin d’éviter des mises à niveau implicites de versions entre les exécutions. Pour savoir comment préciser la version, consultez cette page.
  • la directive resource indique que nous allons créer une nouvelle ressource, du type azurerm_resource_group avec deux paramètres name et location. Ainsi, Terraform crée un groupe de ressources nommé hello-tf-azure-rg dans la région Azure France Central.

Remarque : si vous utilisez Visual Studio Code, vous pouvez télécharger les extensions Azure Terraform et Terraform. Ces deux extensions vous aideront à travailler avec Terraform, avec coloration syntaxique et IntelliSense !

Votre premier projet Terraform est terminé ! Voyons comment le déployer sur Microsoft Azure.

 

Rapport Magic Quadrant 2019 de Gartner – systèmes de bases de données

Lisez les dernières études pour faire des choix informés sur les solutions de systèmes de gestion de base de données sur ce marché de plus en plus concurrentiel.

Télécharger

Initialisation de Terraform

Tout d’abord, vous devez initialiser le répertoire de votre projet. Pour cela, exécutez la commande terraform init dans le répertoire.

PS C:\workspaces\hello-tf-azure> terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "azurerm" (hashicorp/azurerm) 1.33.1...

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

L’objectif de cette commande est de télécharger tous les plugins nécessaires pour déployer votre template. Dans ce cas, elle télécharge la version du fournisseur Azure Resource Manager Terraform correspondant au filtre de version que vous avez défini dans la directive provider.

Votre projet est maintenant prêt à être déployé sur Microsoft Azure ! Enfin, presque.

Terraform et authentification Microsoft Azure

Vous devez d’abord gérer l’authentification. Lorsque vous travaillez avec Terraform, vous pouvez vous authentifier sur Microsoft Azure de plusieurs façons :

  • Azure CLI : Terraform utilisera simplement vos identifiants Azure CLI pour travailler avec Azure. Dans ce cas Azure CLI doit être installé et vous devez déjà avoir effectué une connexion azure login avant de travailler avec Terraform. Pour en savoir plus sur cette méthode d’authentification, cliquez ici.
  • Azure Managed Service Identity (identités managées) : Terraform peut utiliser une MSI disponible sur la machine virtuelle qui exécute le déploiement. Pour en savoir plus sur cette méthode d’authentification, cliquez ici.
  • Principal de service et certificat client : vous pouvez utiliser un principal de service avec un certificat client affecté. Pour en savoir plus sur cette méthode d’authentification, cliquez ici.
  • Principal de service et clé secrète client : vous pouvez utiliser un principal de service et sa clé secrète client pour vous authentifier. Pour en savoir plus sur cette méthode d’authentification, cliquez ici

Remarque : Lorsque vous exécutez le déploiement Terraform sur votre machine, pour des besoins de test/développement, il est plus simple d’utiliser l’authentification Azure CLI. Étant donné qu’elle nécessite une connexion interactive, elle n’est pas recommandée pour l’automatisation. Vous préférerez utiliser l’authentification avec un principal de service, ou mieux encore, avec les identités managées. Ce sujet sera abordé plus tard dans cette série de billets de blog.

Déploiement de Terraform

Bien, vous êtes donc connecté à votre compte Azure. Vous pouvez maintenant effectuer un déploiement en utilisant la commande terraform apply :

PS C:\workspaces\junk\hello-tf-azure> terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ creat

Terraform will perform the following actions:

# azurerm_resource_group.rg will be created
+ resource "azurerm_resource_group" "rg" {
+ id       = (known after apply)
+ location = "francecentral"
+ name     = "hello-tf-azure-rg"
+ tags     = (known after apply)
}

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value:

Cette commande se connectera à votre compte Azure pour vérifier quelles ressources existent déjà et générer un plan d’exécution. Elle affiche les actions sur le point d’être exécutées sur votre compte Azure. Dans ce cas particulier, elle créera un groupe de ressources. Tapez yes à l’invite puis Enter. Le déploiement démarre…

Remarque : pendant le déploiement, vous pouvez explorer la palette de commandes de Visual Studio Code pour découvrir toutes les commandes Terraform disponibles avec les extensions :

Le déploiement doit être terminé maintenant :

azurerm_resource_group.rg: Creating...
azurerm_resource_group.rg: Creation complete after 2s 
[id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Si vous regardez dans votre répertoire, un fichier d’état nommé terraform.tfstate a été généré. Ce fichier est important car il contient toutes les informations d’état relatives aux déploiements sur Azure :

{
"version": 4,
"terraform_version": "0.12.7",
"serial": 1,
"lineage": "9fe982b1-7d77-f5f6-940d-4add634605f4",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "azurerm_resource_group",
"name": "rg",
"provider": "provider.azurerm",
"instances": [
{
"schema_version": 0,
"attributes": {
"id": "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg",
"location": "francecentral",
"name": "hello-tf-azure-rg",
"tags": {}
}
}
]
}
]
}

Remarque : le prochain billet de blog de cette série expliquera en détails comment gérer l’état Terraform et le stocker à distance pour le partager entre les exécutions de déploiement continu et/ou les membres de votre équipe. Pour en savoir plus sur ce sujet, consultez la documentation officielle de Terraform.

Si vous effectuez un autre terraform apply dans votre répertoire, vous verrez que le plan d’exécution n’a pas d’action à exécuter (tout est déjà déployé) :

PS C:\workspaces\hello-tf-azure> terraform apply
azurerm_resource_group.rg: Refreshing state... 
[id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg]

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Travailler avec un plan d’exécution

Il est aussi possible d’exécuter la commande terraform plan avant terraform apply. La commande plan génère un plan d’exécution et permet de le stocker dans un fichier. Ce fichier peut alors être utilisé comme paramètre de la commande apply.

Ajoutons une autre définition de groupe de ressources dans le fichier du modèle Terraform :

provider "azurerm" {
version = "~>1.33"
}
resource "azurerm_resource_group" "rg" {
name     = "hello-tf-azure-rg"
location = "francecentral"
}
resource "azurerm_resource_group" "rg2" {
name     = "hello-tf-azure-2-rg"
location = "francecentral"
}

Et exécutez la commande terraform plan ‑out out.plan comme suit :

PS C:\workspaces\junk\hello-tf-azure> terraform plan -out out.plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
azurerm_resource_group.rg: Refreshing state... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg]

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:
# azurerm_resource_group.rg2 will be created
+ resource "azurerm_resource_group" "rg2" {
+ id       = (known after apply)
+ location = "francecentral"
+ name     = "hello-tf-azure-2-rg"
+ tags     = (known after apply)
}

Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------

This plan was saved to: out.plan

To perform exactly these actions, run the following command to apply:
terraform apply "out.plan".

Terraform vérifie les éléments déjà existants et les actions à exécuter. Dans ce cas, seul le deuxième groupe de ressources doit être créé. Le nouveau plan d’exécution a été sauvegardé dans le fichier out.plan.

Vous pouvez appliquer le plan en exécutant la commande terraform apply « out.plan » :

PS C:\workspaces\hello-tf-azure> terraform apply "out.plan"
azurerm_resource_group.rg2: Creating...
azurerm_resource_group.rg2: Creation complete after 1s
[id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.

State path: terraform.tfstate

Le deuxième groupe de ressources a été créé et le fichier d’état local a été mis à jour.

Vous pouvez visualiser l’état en utilisant la commande terraform show dans votre répertoire :

PS C:\workspaces\hello-tf-azure> terraform show
# azurerm_resource_group.rg:
resource "azurerm_resource_group" "rg" {
id       = "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg"
location = "francecentral"
name     = "hello-tf-azure-rg"
tags     = {}
}

# azurerm_resource_group.rg2:
resource "azurerm_resource_group" "rg2" {
id       = "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg"
location = "francecentral"
name     = "hello-tf-azure-2-rg"
tags     = {}
}

Supprimer l’infrastructure

Enfin, vous pouvez tout supprimer en utilisant la commande terraform destroy :

PS C:\workspaces\junk\hello-tf-azure> terraform destroy
azurerm_resource_group.rg2: Refreshing state... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg]
azurerm_resource_group.rg: Refreshing state... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:

# azurerm_resource_group.rg will be destroyed
- resource "azurerm_resource_group" "rg" {
- id       = "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg" -> null
- location = "francecentral" -> null
- name     = "hello-tf-azure-rg" -> null
- tags     = {} -> null
}

# azurerm_resource_group.rg2 will be destroyed
- resource "azurerm_resource_group" "rg2" {
- id       = "/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg" -> null
- location = "francecentral" -> null
- name     = "hello-tf-azure-2-rg" -> null
- tags     = {} -> null
}

Plan: 0 to add, 0 to change, 2 to destroy.

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value:

Comme pour la commande apply, elle générera un plan d’exécution qui affichera toutes les actions sur le point d’être exécutées. Dans ce cas, la suppression des deux groupes de ressources. yes et Enter pour valider le plan et attendez la fin de l’opération de suppression.

azurerm_resource_group.rg: Destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg]
azurerm_resource_group.rg2: Destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg]
azurerm_resource_group.rg2: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg, 10s elapsed]
azurerm_resource_group.rg: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg, 10s elapsed]
azurerm_resource_group.rg2: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg, 20s elapsed]
azurerm_resource_group.rg: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg, 20s elapsed]
azurerm_resource_group.rg2: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg, 30s elapsed]
azurerm_resource_group.rg: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg, 30s elapsed]
azurerm_resource_group.rg: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-rg, 40s elapsed]
azurerm_resource_group.rg2: Still destroying... [id=/subscriptions/SUBSCRIPTION_ID/resourceGroups/hello-tf-azure-2-rg, 40s elapsed]
azurerm_resource_group.rg2: Destruction complete after 46s
azurerm_resource_group.rg: Destruction complete after 46s

Destroy complete! Resources: 2 destroyed.

Conclusion

Vous connaissez maintenant l’essentiel pour démarrer avec Terraform sur Microsoft Azure. Le prochain billet de cette série portera sur la gestion de l’état d’un déploiement avec Terraform.

 

< Partie 2 : Introduction

Partie 3 : Gestion de l’état des déploiements >

Apprenez à déployer une plateforme Windows Virtual Desktop

Dans ce 1er webinar en 6 parties, nous verrons comment configurer tous les prérequis pour mettre en service un tenant Windows Virtual Desktop et déployer un premier pool d’hôtes Windows 10 avec Office 365.

Je regarde