[Azure DevOps] Terraform et Azure DevOps CI/CD - Part 1

3 minute(s) de lecture

Azure DevOps (anciennement VSTS) permet le déploiement automatisé de ressources, quelles soient en template ARM (JSON), en PowerShell, CLI, Terraform, etc.

Aujourd’hui, je vais me concentrer sur l’intégration avec Terraform. Attention, je ne rentrerai pas dans les détails Terraform ici, vous devez donc connaitre un minimum la technologie. La tarification concernant Azure DevOps est disponible ici: https://azure.microsoft.com/en-us/pricing/details/devops/azure-pipelines/

Par défaut, vous avez le droit à 5 utilisateurs de façon gratuite.

Avant de commencer, assurez-vous d’avoir une organisation Azure DevOps dans votre subscription:

Ouvrez via l’URL votre Azure DevOps et créez un nouveau projet en cliquant sur Create project:

Donnez lui un nom, et cliquez sur Create:

Une fois le projet créé, vous pouvez inviter des personnes, etc. :

Sur la gauche, allez dans Repos > Files et ajoutez un ou plusieurs fichiers dans le répertoire. Vous pouvez ajouter le README par exemple pour initialiser le projet, en cliquant sur Initialize:

Une fois l’initialisation terminée, vous aurez au moins un fichier dans votre répertoire:

Ici, créez un dossier, ainsi que 2 fichier, main.tf et variables.tf:

Ici, je vais déployer 1 VNet dans Azure, avec 2 sous-réseaux. Comme vous pouvez le voir, pour quelques variables, j’utilise des __ pour utiliser des variables directement depuis Azure DevOps. Voici le code utilisé:

main.tf:

terraform {
  required_version = ">= 0.11"
  backend "azurerm" {
    storage_account_name = "__terraformstorageaccount__"
    container_name       = "terraform"
    key                  = "terraform.tfstate"
    access_key           = "__storagekey__"
  }
}

resource "azurerm_resource_group" "rg" {
  name     = "__resource_group__"
  location = "__location__"
}

resource "azurerm_virtual_network" "vnet" {
  name                = "${var.virtual_network_name}"
  location            = "__location__"
  address_space       = ["${var.address_space}"]
  resource_group_name = "${azurerm_resource_group.rg.name}"
}

resource "azurerm_subnet" "subnetfrontend" {
  name                 = "${var.subnetname_prefixfrontend}"
  virtual_network_name = "${azurerm_virtual_network.vnet.name}"
  resource_group_name  = "${azurerm_resource_group.rg.name}"
  address_prefix       = "${var.subnet_prefixfrontend}"
}

resource "azurerm_subnet" "subnetbackend" {
  name                 = "${var.subnetname_prefixbackend}"
  virtual_network_name = "${azurerm_virtual_network.vnet.name}"
  resource_group_name  = "${azurerm_resource_group.rg.name}"
  address_prefix       = "${var.subnet_prefixbackend}"
}

variables.tf:

variable "virtual_network_name" {
  description = "The name for the virtual network."
  default     = "FLOAPP-vNet-Terra"
}

variable "address_space" {
  description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created."
  default     = "10.0.0.0/16"
}

variable "subnetname_prefixfrontend" {
  description = "The shortened abbreviation to represent your resource group that will go on the front of some resources."
  default     = "Frontend"
}

variable "subnetname_prefixbackend" {
  description = "The shortened abbreviation to represent your resource group that will go on the front of some resources."
  default     = "Backend"
}

variable "subnet_prefixfrontend" {
  description = "The address prefix to use for the subnet."
  default     = "10.0.10.0/24"
}

variable "subnet_prefixbackend" {
  description = "The address prefix to use for the subnet."
  default     = "10.0.20.0/24"
}

Nous allons maintenant créer la Build, qui permettra de vérifier si les ressources ont été modifiés dans un dossier en particulier, et donc, de créer une nouvelle build pour notre futur release. Cliquez sur Pipelines > Builds > New pipeline:

Ici, choisissez d’où viennent les sources et validez:

Choisissez ensuite le template, vide dans mon cas:

Donnez un nom, et choisissez un pool où un agent est installé. Ce pool peut être déployé sur une de vos VMs, pour limiter les coûts:

Ajoutez un job de type Copy Files. Donnez un nom, choisissez le dossier que vous avez créé avec vos fichier main et variables dedans, et choisissez de copier tout le contenu. Le dossier cible doit être le suivant: $(build.artifactstagingdirectory)/Terraform

Ajoutez un job de type Publish Build Artifacts et laissez le avec les paramètres par défaut:

Cliquez maintenant sur Triggers pour activer le CI (Continuous Integration) pour lancer cette build, à chaque modification d’un fichier qu’il y a dans la branch master:

Sauvegardez et exécutez la build:

Après quelques secondes, notre build c’est bien exécuté:

Vous recevez également un mail pour vous signifier que tout c’est bien passé pour votre build:

Et avec le CI activé, la raison de l’exécution de cette nouvelle build est Continuous integration:

Dans la deuxième partie, nous verrons comment faire l’intégration avec la release, pour déployer notre VNet avec Terraform, automatiquement.

Laisser un commentaire