Parmi les pratiques DevOps, on retrouve souvent le principe d’Infrastructure As Code (IaC) qui consiste à coder les étapes de provisionnement et de configuration d’infrastructure au lieu de les effectuer manuellement.

L’ Infrastructure As Code aide à automatiser le processus de déploiement de l’infrastructure d’une manière répétable et cohérente, et qui a pour avantages :

  • Les déploiements sont plus rapides et plus efficaces de l’environnement de développement à la production.
  • L’IaC standardise complètement la configuration de l’infrastructure afin de réduire les risques d’erreurs ou d’écarts.
  • L’IaC permet à votre entreprise d’utiliser des techniques d’intégration continue et de déploiement continu tout en minimisant l’introduction d’erreurs humaines après la phase de développement.
  • Ce code peut être versionné et contrôlé dans un gestionnaire de code source comme par exemple Git.

Pour en savoir plus sur l’infra As Code, je vous recommande la lecture de notre From Zero to hero sur sur le sujet de l’Infrastructure As Code.
Ainsi que cette vidéo sur les bénéfices de l’IaC : https://channel9.msdn.com/Blogs/DevOps-Gamification/Infrastructure-as-Code–Benefits-of-Infrastructure-as-Code

Maintenant que nous avons abordé la question de l’Infra as code, regardons d’un peu plus près comment mettre en pratique ce concept grâce à Terraform.

 

Qu’est ce que Terraform ?

Chaque fournisseur de Cloud utilise son propre langage d’Infrastructure As Code, pour Azure il s’agit de fichier Json appelé ARM Templates, pour AWS c’est CloudFormation, etc.

Terraform est une solution développée par HashiCorp. C’est un outil en ligne de commande qui utilise le même langage, la même syntaxe pour déployer sur plusieurs fournisseurs de Cloud.
Ce langage est appelé HCL pour HashiCorp Configuration Language. Il est de type déclaratif et il est simple à lire pour un humain.

En voici d’ailleurs un exemple :

Avec Terraform, vous n’avez qu’à déclarer les ressources et la façon dont vous voulez qu’elles soient configurées, puis il établira les dépendances et créera le tout pour vous !

Terraform est un outil open source écrit en Go dont le code source est disponible ici https://github.com/hashicorp/terraform, il se compose d’un exécutable qui s’installe sur toutes les plateformes (Linux, Windows, etc.). La solution est maintenue par une communauté très active.

Terraform permet aussi :

  • Une exécution d’un mode ‘dry run’ (plan) qui permet de visualiser les changements sur l’infrastructure avant de les appliquer réellement.
  • La parallélisation des opérations.
  • La possibilité de générer un graph des ressources décrite dans le code.

 

Installation de Terraform

L’installation de Terraform se fait très simplement, il suffit de télécharger le binaire correspondant à votre système d’exploitation à partir de la page de téléchargement : https://www.terraform.io/downloads.html.
Puis de configurer la variable d’environnement PATH.

Si vous êtes dans un contexte d’automatisation, il est aussi possible de l’installer via un script.

Par exemple, sur Linux :

Pour Windows, en utilisant le gestionnaire de package Chocolatey (lien du package) avec la commande suivante :

Pour vérifier que Terraform est bien installé, exécuter la commande terraform ou terraform –version dans votre terminal.

Terraform

 

Configuration d’Azure pour Terraform

Une fois Terraform installé, nous somme prêt a l’utiliser pour déployer notre infrastructure Azure.

Cependant pour pouvoir gérer des ressources Azure au travers d’un outils tiers nous avons besoin d’un prérequis qui est la création d’un Service principal dans Azure AD.
Pour créer ce service principal, vous pouvez soit le faire via le portail Azure, la documentation détaillée est ici, soit en utilisant les lignes de commandes de l’Azure Cli.

 

A l’issue de cette configuration, vous obtenez les informations suivantes du Service Principal :

  • Le Client ID (ou Application ID) ;
  • Le Client Secret ;
  • Le Tenant ID.

Ces 3 informations vont permettre à Terraform de s’authentifier et de manipuler des ressources dans une souscription Azure.

Cette configuration est terminée quand est attribué le rôle de Contributeur à ce Service Principal sur la souscription dans laquelle les ressources vont être créées.

La configuration de Azure étant faite, nous allons pouvoir écrire notre code Terraform.

 

Le code Terraform

Pour écrire notre code Terraform, il suffit de créer un fichier qui porte l’extension .tf , exemple main.tf, avec n’importe quel éditeur de code (nous verrons dans un prochain article pourquoi VSCode est cependant le mieux adapté pour le code Terraform).

Dans ce fichier, nous allons commencé par déclarer notre provider qui sert d’authentification à Azure :

 

  • L’Id de la Souscription est celle de la souscription dans laquelle les ressources ont été créées.
  • Les Client Id, Client Secret et Tenant Id sont les informations du Service principal.

Puis, il faut écrire les ressources que nous voulons provisionner, avec un par exemple pour créer un Resource Group. Voici le code nécessaire :

 

Une ressource Terraform est donc composée :

  • Du type de la resource ex: azurerm_resource_group
  • Un id interne à Terraform ex: rg
  • Une liste de propriétés qui composent la ressource. Exemple : name, location, tags, etc.

La liste complète des ressources Terraform pour Azure est disponible sur la documentation officielle qui est très bien fournie.

 

Exécution du code Terraform

L’exécution du code Terraform s’effectue en 3 étapes :

 

Étape 1 : L’init

Cette étape permet d’initialiser l’environnement d’exécution avec le téléchargement des différents plugins et modules.

Elle s’effectue lors de la première exécution grâce à la commande : terraform init à la racine de notre répertoire.

terraform init

 

Etape 2 : Le plan

Le plan permet d’afficher les modifications qui seront apportées à l’infrastructure Azure. C’est le mode “dry drun” de Terraform. Grâce à cette visualisation, il est possible de vérifier et de contrôler les changements avant de les appliquer réellement.

La commande à exécuter est : terraform plan

terraform plan

 

Le résultat final du plan indique le nombre de ressources qui seront créées, ainsi que celles qui seront modifiées et enfin celles qui seront détruites.

 

Etape 3 : L’apply

C’est l’étape qui permet d’appliquer les changements décris dans le code Terraform sur l’environnement Azure.

Son exécution se fait avec la commande : terraform apply

terraform apply

Et voila, nous venons de provisionner des ressources Azure avec Terraform.

Quant aux lignes de commande de Terraform, elles sont bien plus complètes que ces 3 exemples, je vous invite d’ailleurs à lire la documentation pour voir toutes les options possibles.

Voici aussi un exemple de code Terraform qui provisionne une Virtual Machine et son réseau associé (Vnet, Subnet) en utilisant plusieurs fichiers, des variables, et un fichier qui contient les valeurs spécifiques pour un environnement

 

Pour conclure sur cette introduction à Terraform

Dans cet article, nous avons vu comment provisionner une infrastructure Azure simple avec Terraform, il est évidement que cela ne se limite pas qu’à ça. Il y a d’autres points non abordés ici comme les fichiers d’états (tfstate) et les remotes backends, les modules, la gestion des données sensibles comme les identifiants fournie au provider, etc. Tous ces sujets seront abordés dans un prochain article.

A suivre donc !

 

livre blanc From Zero to Hero 1 Infra as code