Introduction à Terraform

Terraform est un outil Open source, développé par HashiCorp, permettant de faire de l'Infrastructure as Code (IaC). C’est à dire de gérer une infrastructure via des fichiers de configuration, plutôt qu’au travers d’une interface graphique. En pratique, cela permet de créer, modifier et gérer des ressources de manière cohérente et de pouvoir répliquer une infrastructure chez différents fournisseurs, tels que Azure, AWS…​ On parle d’abstraction des ressources.

Terraform est comparable à Azure Ressource Manager (ARM), mais il offre des avantages :

  • Utilisable pour différents Cloud providers

  • Langage déclaratif propriétaire HashiCorp Configuration Language (HCL) pour écrire les fichiers de configuration. Moins courant que le JSON utilisé par ARM, mais réputé plus lisible. Les fichier HCL portent l’extension .tf

  • Séparation de la planification (simulation) de l’exécution.

  • Parallélisation de la création des ressources lorsqu’il n’y a pas de contrainte de dépendance (cf. Resource Graph)

Resource Graph

À partir des fichiers de configuration, Terraform construit un graph de dépendances, qui permettra de planifier le déploiement en prenant en compte les dépendances.

graph
Figure 1. Exemple de graph pour la création d’un resource group

State

Terraform stocke les informations de l’infrastructure dans un fichier state. Créé lors de l’utilisation de la commande apply, ce fichier garde la trace des instances réelles créées chez le Cloud providers. Lors de la planification, Terraform compare l’infrastructure existante au fichier state, afin de savoir ce qui doit être créé, modifié ou supprimé. Le fichier state porte l’extension .tfstate.

Le fichier state est stocké localement lors du développement. En production il est préférable de le mettre dans un environnement partagé nommé backend, par exemple un storage account.
Il est préférable de ne pas modifier le contenu d’un fichier state manuellement, à la place privilégier la commande terraform taint.

Interpolation

Les expressions sont utilisées pour référencer ou calculer les valeurs présentent dans les fichiers de configuration. Parmi les différents types d’expressions, on trouve l’interpolation. Elle permet de référencer les variables, arguments (ex: vm_size pour le dimensionnement d’une machine virtuelle) ou attributs (ex: l’adresse IP d’une VM déployée) d’autres ressources. La chaîne interpolée est bornée par les caractères ${}.Pour récupérer l’état d’une variable on utilisera, par exemple : ${var.foo}. Pour conditionner un état : ${var.env == "production" ? var.prod_subnet : var.dev_subnet}.

Providers

Pour interagir avec les fournisseurs d’infrastructure, Terraform s’appuie sur les providers. Ce sont des plugins référencés dans les fichiers de configuration, qui vont permettre de gérer les ressources. Dans le cadre de Microsoft on peut en distinguer 3 :

  • AzureRM pour gérer les ressources Azure via Azure Resource Manager

  • AzureAD pour Azure Active Directory (AAD)

  • AzureDevops pour les ressources DevOps

Le registry permet de parcourir les providers existants. Une fois référencés dans les fichiers de configuration, les providers sont automatiquement installés lors de l’initialisation de l’espace de travail : terraform init.

Pour éviter les problèmes liés aux mises à jour des providers, il faut fixer les versions utilisées dans les fichiers de configuration.

Workflow

Le langage HCL est dit déclaratif, par opposition à l’impératif. Le déclaratif permet de décrire l’état souhaité, pour laisser ensuite Terraform gérer les moyens à mettre en oeuvre pour y parvenir.

Workflow Terraform
Figure 2. Workflow Terraform

3 commandes Terraform sont utilisées pour réaliser ce cycle :

  • init: Installation des plugins utilisés. A ne relancer qu’en cas de changement de configuration du backend ou d’un module

  • plan: Prévisualisation des modifications qui seront effectuées en prenant en compte la configuration

  • apply: Mise à jour des ressources

A noter également l’option destroy, applicable à plan et apply, qui permet de supprimer les ressources distantes.

Les fichiers de configuration

La configuration Terraform s’effectue au travers des fichier .tf et/ou .tf.json présent dans le répertoire courant. Cette configuration peut être séparée en plusieurs fichiers, qui seront fusionnés lors du chargement de la configuration.