Modéliser, déployer et gérer des ressources Azure avec Terraform de HashiCorp
Terraform est un outil proposé par HashiCorp pour construire, changer et gérer les versions d’infrastructures de manière efficace et sans risques. Terraform permet de gérer des infrastructures instanciées sur site ou chez différents fournisseurs de Cloud dont Microsoft Azure.
Ayant rencontré cet outil chez quelques uns de mes partenaires Azure, je me suis intéressé au sujet. Cet article a pour objectif d’expliquer comment déclarer un abonnement Azure dans l’outil Terraform afin de déployer de manière industrialisée des ressources dans le Cloud Microsoft.
1- Petits rappels sur Terraform
Les fonctionnalités clés de Terraform sont :
– Infrastructure as Code : Terraform permet de décrire des infrastructures avec une syntaxe très générique et de haut niveau (faisant abstraction des fournisseurs d’infrastructure). Cela permet de modéliser les ressources d’un datacenter ou d’une architecture applicative, mais aussi de versionner et traiter cette modélisation comme n’importe quel code produit par des développeurs. Ces modélisations peut être bien entendu partagé et ré-utilisées.
– Execution Plans : Terraform permet de simuler les modifications qui vont être appliquées sur une infrastructure afin de prévoir et limiter les mauvaises surprises ou erreurs.
– Resource Graph : Terraform construit un graph de toutes les ressources utilisées et parallélise la création et la modification de toutes les ressources indépendantes. Ainsi, les déploiements sont plus efficaces et les IT ont une vue sur les interdépendances de leurs infrastructures.
– Changement automatisé : des ensembles de modifications complexes peuvent être appliquées à une infrastructure avec peu d’interventions humaines et manuelles. Grâce au execution plans et au Resource Graph, il est facile de savoir quelles modifications seront effectuées par Terraform et dans quel ordre. La finalité étant donc de réduire les erreurs humaines toujours possibles.
A la différence de Chef, Puppet ou Ansible, Terraform n’est pas un outil de gestion de configuration (Configuration Management) mais il peut être utilisé en combinaison de ces outils. La force de Terraform, c’est sa capacité à bootstrapper et initialiser des ressources d’infrastructure. La configuration de ses ressources d’infrastructure peut donc se faire dans un second temps via les outils de Configuration Management de votre choix.
2- Terraform et le Cloud Microsoft Azure
Terraform peut être utilisé pour provisionner et gérer des ressources Azure de type ASM (Azure Service Management) qui est le mode de fonctionnement historique d’Azure ou de type ARM (Azure Resource Manager) qui est désormais le mode d’utilisation et de déploiement conseillé.
Dans la suite de cet article, je vais me concentrer sur la connexion de Terraform avec le provider Azure Resource Manager.
Pré-requis : Disposer d’un abonnement Azure et avoir un Azure Active Directory avec les privilèges suffisants.
3- Téléchargement et installation de l’outil Terraform
C’est excessivement simple : il suffit de récupérer le binaire Terraform sur la page de téléchargement (https://www.terraform.io/downloads.html). L’outil est disponible sur de nombreuses plateformes dont Windows.
Le téléchargement est une archive à décompresser dans le répertoire de votre choix.
Vérifier ensuite que c’est bien la dernière version qui est installé avec la commande : Terraform –version
Il suffit ensuite d’ajouter ce répertoire dans le PATH de Windows (ou de Linux si installé sur Linux).
par exemple via la commande PowerShell suivante :
[Environment]::SetEnvironmentVariable(“PATH”, $env:PATH + ({;C:\terraform},{C:\terraform})[$env:PATH[-1] -eq ‘;’], “User”)
Vérifier ensuite que le chemin a bien été ajouté :
4- Création d’un Service Principal dans Azure pour Terraform
Ici l’application Terraform va agir comme administrateur ou contributeur sur un abonnement Azure lors de la création ou gestion des ressources.
Il va lui falloir 4 informations à mettre dans les fichiers de configuration Terraform ( fichiers avec l’extension .tf):
Pour récupérer ces quatre informations, se connecter en tant qu’administrateur de son abonnement Azure (ou un compte avec des privilèges suffisants sur l’Azure Active Directory) sur le portail de gestion : https://portal.azure.com
La suite des opérations va consister à créer des crédentiels, c’est à dire les informations nécessaires à l’application Terraform pour s’authentifier auprès d’un abonnement Azure et y faire des opérations.
Cela nécessite de créer une application dans Azure Active Directory pour générer le client_id, le client_secret et le tenant_id.
Aller dans la partie Azure Active Directory, sélectionner l’Azure Active Directory concerné et cliquer sur App registrations
Puis cliquer sur Endpoints.
Sur la ligne OAUTH 2.0 AUTHORIZATION ENDPOINT, récupérer le GUID dans l’URL proposée. Cette valeur sera le Tenant_id.
Fermer la lame et cliquer sur Add… pour enregistrer une nouvelle application auprès d’Azure Active Directory.
Donner un nom et une URL (on peut écrire ce que l’on veut ici) et sélectionner Web app / API dans la zone Application Type. Cliquer sur Create.
Cliquer ensuite sur l’application qui vient d’être enregistrée. Dans l’interface, Application ID correspond à la valeur client_id.
Suite des opérations : créer une nouvelle clé pour cette application.
Saisir une description et choisir une expiration (1 an, 2 ans ou pas d’expiration).
Cliquer sur Save.
L’interface va alors dévoiler un secret qui ne sera exposé qu’une seule fois (penser à faire un copier coller avant de fermer la lame). Ce secret est la valeur client_secret.
Attention, après avoir fermé la lame, la valeur de la clé ne sera pas récupérable.
Dernier élément à récupérer : l’identifiant de l’abonnement Azure : subscription_id
Le subscription_id est facilement récupérable via le portail Web ou la ligne de commande (PowerShell ou Azure CLI).
Pour cela dans le portail, aller dans la zone subscription et récupérer la valeur.
Maintenant, il faut donner des droits à l’application créée sur l’abonnement Azure. Aller dans la zone Access Control (IAM).
Cliquer sur Add. Sélectionner Owner ou Contributor.
Dans la zone de recherche taper le début ou le nom complet de l’application.
A cet instant, on dispose des 4 informations nécessaires à donner à Terraform pour utiliser Azure comme plateforme Cloud où déployer des ressources.
Il est donc possible de créer un fichier .tf et de tester par exemple la création d’un groupe de ressources dans Azure.
Attention : un seul fichier .tf par répertoire.
Pour tester avant déploiement (Execution Plan), exécuter la commande : terraform plan
Pour déployer, exécuter la commande : terraform apply
Pour visualiser le résultat : terraform show
Il est possible de vérifier dans la console Azure:
Pour supprimer les éléments d’infrastructure créés par Terraform précédemment : terraform destroy
Voilà, Terraform peut piloter les déploiements dans Azure. Il ne reste plus qu’à utiliser les possibilités d’Infrastructure as code fournies par Terraform.
Si vous utilisez Visual Studio Code, il existe des extensions pour la correction syntaxique des fichiers .tf de Terraform 😉
Personnellement, je trouve le langage déclaratif utilisé dans les fichiers .tf super lisible et (presque) plus simple que les fichiers .json utilisés dans les modèles ARM Azure. Je pense donc utiliser de plus en plus cet outil et j’espère écrire quelques nouveaux articles sur le sujet !
Plus d’informations sur Terraform & Azure :
- Azure Resource Manager et Terraform : https://www.terraform.io/docs/providers/azurerm/index.html
Stan
J’étais un peu en avance:) mais désormais c’est même documenté sur le site de microsoft : https://docs.microsoft.com/en-us/azure/virtual-machines/linux/terraform-install-configure