Construire une machine virtuelle Windows Azure avec Terraform : Étape par étape

Avez-vous déjà créé une machine virtuelle Azure via le portail Azure auparavant ? Si oui, combien de clics cela a-t-il pris pour le faire ? Pouvez-vous le faire encore et encore en fournissant les mêmes valeurs d’entrée exactes pour vous assurer de respecter une norme spécifique ? Probablement pas. Vous devez automatiser le processus. Créez des machines virtuelles Azure avec Terraform !

Terraform par HashiCorp est un utilitaire qui crée une infrastructure simple à complexe sur site ou dans le cloud. Terraform est un fichier binaire unique qui lit les fichiers de configuration, crée un état et s’assure ensuite que votre infrastructure est créée et reste dans cet état.

Dans cet article, vous allez apprendre comment commencer avec Terraform en créant une machine virtuelle Azure. Ce tutoriel sera un excellent exemple d’utilisation de Terraform avec Azure.

Prérequis

Si vous souhaitez suivre ce tutoriel, assurez-vous d’avoir les éléments suivants en place :

Tout au long des étapes, ce tutoriel utilisera macOS exécutant PowerShell Core, bien que le même processus puisse être suivi sur Windows 10 avec PowerShell Core, Windows PowerShell ou même l’invite de commande Windows.

Installation de Terraform

Pour commencer, vous devrez d’abord télécharger Terraform. Il existe de nombreuses façons de le faire selon vos préférences. Ce tutoriel utilise macOS, donc vous pouvez utiliser HomeBrew en exécutant brew install terraform. Vous pouvez également aller directement à la page de téléchargement de Terraform ou, si vous êtes sous Windows, vous pouvez utiliser Chocolatey également.

Saviez-vous que Azure Cloud Shell a Terraform pré-installé?

Une fois que vous avez téléchargé Terraform, copiez-le dans un dossier de votre chemin d’accès et exécutez terraform. Vous devriez voir quelques instructions d’utilisation comme indiqué ci-dessous. Si vous voyez cela, vous êtes prêt à continuer.

Terraform Usage Instructions

Authentification à Azure

Terraform utilise des fournisseurs pour communiquer avec différents fournisseurs sur site et dans le cloud. Dans ce cas, vous devez configurer le fournisseur Azure Terraform. En supposant que vous avez installé Azure CLI et que vous êtes déjà authentifié à Azure, vous devez d’abord créer un principe de service. Terraform utilisera le principe de service pour s’authentifier et accéder à votre abonnement Azure.

Créer un Principe de Service

Dans votre console, créez un principe de service en utilisant Azure CLI. Pour ce faire:

Tout d’abord, trouvez votre ID d’abonnement en utilisant la commande az account list ci-dessous.

> az account list --query [*].[name,id]

Une fois que vous avez l’ID d’abonnement, créez un principal de service en utilisant le rôle Contributeur affecté à votre abonnement.

$subscriptionId = 'xxxx-xxxxx-xxxxx'
$sp = az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/$subscriptionId" -n TerraformTesting | ConvertFrom-Json

Le CLI Azure se connectera à Azure et créera une application Azure AD avec un mot de passe comme indiqué ci-dessous. Comme vous affectez la sortie indiquée ci-dessous à la variable $sp ci-dessus, vous aurez les valeurs appId et password stockées dans la variable pour une utilisation ultérieure.

Azure ID Application with a Password

Définissez les variables d’environnement

Terraform doit connaître quatre éléments de configuration différents pour se connecter avec succès à Azure.

  • L’ID d’abonnement Azure
  • L’ID de l’application Azure AD du principal de service
  • Le mot de passe du principal de service
  • Le locataire Azure AD

Une façon de fournir ces informations à Terraform est d’utiliser des variables d’environnement. Comme ce tutoriel fonctionne dans une console PowerShell, vous pouvez définir ces variables d’environnement en utilisant $env:. Vous verrez ci-dessous chacune des variables d’environnement que Terraform recherchera lorsqu’il essaiera de se connecter à Azure.

Étant donné que la sortie de az ad sp create-for-rbac a été enregistrée dans la variable $sp précédemment, vous pouvez simplement faire référence aux propriétés au lieu de les copier et de les coller.

$env:ARM_SUBSCRIPTION_ID = $subscriptionId
$env:ARM_CLIENT_ID = $sp.appId
$env:ARM_CLIENT_SECRET = $sp.password
$env:ARM_TENANT_ID = $sp.tenant

Une fois que vous avez défini les variables d’environnement, Terraform est prêt à se connecter à Azure!

Créez un fichier de configuration

Toutes les configurations Terraform sont créées dans un seul dossier généralement par un nom de module. Dans ce tutoriel, vous ne créez pas un module mais vous suivrez la même pratique.

Dans votre console PowerShell, créez un dossier appelé TerraformTesting où vous le souhaitez, puis changez vers ce répertoire.

mkdir TerraformTesting
cd TerraformTesting

Ensuite, créez le fichier de configuration main.tf. C’est là que la configuration pour construire la machine virtuelle Azure avec Terraform sera stockée. Il s’agit du fichier de configuration que la plupart appellent le fichier de configuration « principal ». Il contient les déclarations de fournisseur et de ressource pour toute l’infrastructure que la configuration gérera.

Si vous souhaitez en savoir plus sur la syntaxe (HCL), Michael Levan et moi avons un excellent chapitre sur Terraform dans notre Livre électronique No BS Azure and DevOps.

Créez un nouveau fichier main.tf à l’intérieur du répertoire Terraformtesting qui ressemble à ce qui suit.

## <https://www.terraform.io/docs/providers/azurerm/index.html>
provider "azurerm" {
  version = "=2.5.0"
  features {}
}

## <https://www.terraform.io/docs/providers/azurerm/r/resource_group.html>
resource "azurerm_resource_group" "rg" {
  name     = "TerraformTesting"
  location = "eastus"
}

## <https://www.terraform.io/docs/providers/azurerm/r/availability_set.html>
resource "azurerm_availability_set" "DemoAset" {
  name                = "example-aset"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html>
resource "azurerm_virtual_network" "vnet" {
  name                = "vNet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/subnet.html> 
resource "azurerm_subnet" "subnet" {
  name                 = "internal"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefix       = "10.0.2.0/24"
}

## <https://www.terraform.io/docs/providers/azurerm/r/network_interface.html>
resource "azurerm_network_interface" "example" {
  name                = "example-nic"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

## <https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html>
resource "azurerm_windows_virtual_machine" "example" {
  name                = "example-machine"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_F2"
  admin_username      = "adminuser"
  admin_password      = "P@$$w0rd1234!"
  availability_set_id = azurerm_availability_set.DemoAset.id
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2016-Datacenter"
    version   = "latest"
  }
}

Initialisez Terraform

Terraform a besoin de savoir quels fournisseurs vous utiliserez une fois qu’il tentera de créer des ressources. Il doit le savoir à l’avance car il télécharge ces fournisseurs dans le même dossier dans lequel vous travaillez.

Téléchargez le fournisseur de ressources azurerm tel que défini dans le fichier de configuration principal en exécutant terraform init. Une fois que vous l’avez fait, vous devriez alors voir une sortie similaire à celle ci-dessous.

Downloading the azurerm

Validez la configuration

La configuration que vous avez créée pourrait ne pas être parfaite. Je sais, difficile à croire, n’est-ce pas ? Terraform doit valider la configuration pour détecter d’éventuelles erreurs de syntaxe. Pour ce faire, exécutez la commande terraform plan. Cette commande lit les fichiers de configuration dans le répertoire et signale toute erreur.

Assurez-vous de corriger toutes les erreurs que terraform plan détecte avant de tenter de provisionner réellement l’infrastructure !

Construisez la machine virtuelle Azure avec Terraform

Enfin, il est temps de construire réellement la machine virtuelle Azure en exécutant terraform apply. Lorsque vous exécutez terraform apply, Terraform lit tous les fichiers de configuration que vous avez dans le répertoire et vous demande confirmation. Une fois que vous tapez « yes », il contactera Azure et commencera à construire la machine virtuelle et toutes les ressources associées.

Buildign Azure VM

Si vous voyez le texte lumineux et brillant en vert Apply complete ! en bas, Terraform a construit les ressources avec succès !

Nettoyez

Étant donné qu’il s’agissait simplement d’une démonstration et que vous ne prévoyez probablement pas de conserver cette machine virtuelle, assurez-vous de vous rendre service et supprimez tout ce que vous avez fait.

Vous avez créé un principal de service pour que Terraform s’authentifie auprès d’Azure. Vous pouvez le supprimer avec la commande az ad sp delete ci-dessous.

$spId = ((az ad sp list --all | ConvertFrom-Json) | Where-Object { '<http://TerraformTesting>' -in $_.serviceprincipalnames }).objectId
az ad sp delete --id $spId

Ensuite, supprimez la machine virtuelle Azure que vous venez de créer et toutes les autres ressources dans le fichier de configuration en utilisant terraform destroy. Si vous souhaitez valider la configuration et tester ce qui se passerait si vous exécutiez terraform destroy, vous pouvez également exécuter terraform plan -destroy.

Conclusion

Terraform est un outil formidable et gratuit pour construire une infrastructure dans de nombreux domaines différents. Apprendre la syntaxe de HCL est la partie la plus difficile de Terraform, mais honnêtement, HCL est un langage intuitif. Si vous envisagez d’utiliser un outil comme Terraform ou des modèles ARM, par exemple, apprenez Terraform!

Terraform est maintenant un outil industriel populaire avec un excellent support communautaire et beaucoup de personnes pour vous aider!

Source:
https://adamtheautomator.com/terraform-azure-vm/