Provisionner plusieurs VMs Microsoft Azure avec Terraform


Terraform est un outil open source qui permet de définir, de concevoir, et de déployer une infrastructure avec toutes ses composantes nécessaires (stockage, réseau, serveurs, etc.) sur le cloud avec du code, on parle alors d'infrastructure as code

Terraform utilise donc le langage HCL (HashiCorp Configuration Langage) pour décrire le desiered state d'une infrastructure lambda sur le cloud.

Le code Terraform dépend du fournisseur de l'infrastructure en cloud. Par exemple, un code Terraform défini pour une topologie AWS ne peut pas être réutilisé pour une topologie Microsoft Azure.

 Dans cet article nous verrons comment faire le provisionnement de plusieurs VMs via Terraform


Prérequis :

avant de commencer, il est à noter que vous devez installer certains outils nécessaires sur votre environnement de travail :

Terraform : lien de téléchargement ; https://www.terraform.io/downloads

Azure Cli : lien de téléchargement : https://docs.microsoft.com/en-us/cli/azure/install-azure-cli

Les deux outils sus cités devraient aussi être accessible via ligne de commande en configurant les variables d'environnement si vous êtes sous Windows.

Vous pouvez cloner le code utilisé dans ce tutoriel depuis ce lien GitHub :

https://github.com/hocinewalid/terraform-multiple-vms

Architecture de l'infrastructure déployée


Conformément à l'architecture illustrée ci-dessus, il y a deux vm ainsi que deux disques gérés par azure, un seule vnet dans lequel y a deux sous réseaux (subnet) dans lequel y a deux cartes réseaux chacune affécté a une vm avec une IP publique attachée à ces dernières.

En effet, ces données sont à prendre en considération lors de l'écriture du code de l'infrastructure déployée afin d'éviter des erreurs durant le dépoloiment, dont certaines erreurs serait directement lié à ce que des ressources similaires sont dejà deployé sous le même nom, 

pour éviter cela, et en plus de définir le méta argument "count = 2" pour définir le déploiement de deux ressources, on utilise cet argument comme variable pour le nom de la ressource avec un index qui sera incrémenté automatiquement lors d'un deuxième déploiement puis de faire une "concaténation" a une chaine de caractère qui décrit la ressource déployée.

example :

resource "azurerm_network_interface" "rg"

   count = 2  
   name                = "AzVM-NIC-${count.index}"


code utilisé : 

terraform {
   required_providers {
     azurerm = {
       source = "hashicorp/azurerm"
       version = "2.97.0"
     }

     
   }


   required_version = ">= 1.1.0"
 }
 provider "azurerm" {

     features {
       
     }
 }
 resource "azurerm_resource_group" "rg" {
   name     = "terraform-multiplevm-poc"
   location = "westus"
 }
 resource "azurerm_virtual_network" "rg" {
   name                = "rg-network"
   address_space       = ["10.0.0.0/16"]
   location            = azurerm_resource_group.rg.location
   resource_group_name = azurerm_resource_group.rg.name
 }
 resource "azurerm_subnet" "rg" {
   name                 = "internal"
   resource_group_name  = azurerm_resource_group.rg.name
   virtual_network_name = azurerm_virtual_network.rg.name
   address_prefixes     = ["10.0.3.0/24"]
 }
 resource "azurerm_network_interface" "rg" {
   count = 2  
   name                = "AzVM-NIC-${count.index}"
   location            = azurerm_resource_group.rg.location
   resource_group_name = azurerm_resource_group.rg.name
 ip_configuration {
     name                          = "internal"
     subnet_id                     = azurerm_subnet.rg.id
     private_ip_address_allocation = "Dynamic"
   }
 }
 resource "azurerm_windows_virtual_machine" "rg" {
   count = 2  
   name                = "AzVM-${count.index}"
   resource_group_name = azurerm_resource_group.rg.name
   location            = azurerm_resource_group.rg.location
   size                = "Standard_B2ms"
   admin_username      = "adminusername"
   admin_password      = "123@abc@superpass"
   network_interface_ids = [
     azurerm_network_interface.rg.*.id[count.index],
   ]
 os_disk {
     caching              = "ReadWrite"
     storage_account_type = "Standard_LRS"
   }
 source_image_reference {
     publisher = "MicrosoftWindowsServer"
     offer     = "WindowsServer"
     sku       = "2022-Datacenter"
     version   = "latest"
   }
 }


étape de déploiement

connexion à la souscription azure 

az login

une fois la ligne exécutée vous devez vous authentifier via votre compte Microsoft lié a la souscription azure.


Pour sélectionner une souscription sur laquelle interagir sur le Az CLI saisissez la commande suivante :

az account set --subscription id_de_votre_souscription_azure

terraform init 

La commande init examine vos fichiers de configuration et détermine quels fournisseurs et modules elle doit télécharger à partir du registre public de terraform pour permettre à votre configuration de fonctionner correctement.




terraform plan

La commande terraform plan vas créer un plan d'exécution qui permettra de prévisualiser les changements que Terraform prévoit d'apporter à l'infrastructure. Par défaut, lorsque Terraform crée un plan, il fera un check sur le "current state" de tout composant déjà existant sur une infrastructure cible  pour s'assurer que l'état de Terraform est à jour.



Validation de la syntaxe du code Terraform

terraform validate



Appliquer les changements listés dans le plan terraform avec l'option d'approbation automatique.

terraform apply --auto-approve



Le résultat du déploiement via le code terraform est visible sur notre souscription Azure comme illustré dans l'image ci-dessous.


On peut aussi visualiser les ressources déployées via le visualiseur de ressources Azure comme illustré ci-dessous et qui correspond à l'architecture définie au début du tutoriel. 


Si vous n'avez plus besoin de l'infrastructure déployée, il est possible de détruire l'infrastructure déployée via la ligne de commande :

terraform destroy




Enregistrer un commentaire

Plus récente Plus ancienne