chevron up
8 minutes de lecture
Infrastructure as Code sur Azure DevOps via terraform
Sengdao - il y a 3 mois
Nous apprendrons ce qu’est l’Infra as Code et pourquoi il s’agit d’une pratique à maîtriser. Nous verrons ensuite ce qu’est l’outil Terraform et ce qu’il apporte de plus.

Table of contents

Les points forts :

Cas d’usage communs

Comment gérer et déployer des infrastructures sur Azure avec l’IaC ?

Azure Resource Manager (ARM)

Azure DevOps

Terraform

Terraform CLI

1.png

Qu’est-ce que l’ ”Infrastructure as code” ?

L’Infrastructure as code (IaC) est une pratique permettant de mettre en place et gérer des infrastructures informatiques (serveurs, base de données, réseaux, etc…) en utilisant des fichiers de définitions contenant du code au lieu de faire des actions manuelles. Cette approche permet d’appliquer les principes du développement logiciel sur de l’infrastructure (Versioning de code source, livraison/déploiement continu, etc…).

Les points forts :

  • Cohérence : On garantit que l’infrastructure qui est déployée sera configurée de manière consistante. Nous sommes sûrs que si l’on déploie à nouveau l’infrastructure avec le même fichier IaC, la configuration sera la même, réduisant les risques d’erreurs.
  • Rapidité et agilité : En utilisant les principes du DevOps, l’IaC permet le déploiement rapide d’infrastructure, réduisant le time-to-market de nouvelles applications et fonctionnalités.
  • Rentabilité : On peut paramétrer et optimiser les ressources directement depuis le code, voir activer certaines fonctionnalités d’autoscaling ou d’arrêt automatique de ressources non utilisées.
  • Collaboration : IaC, c’est du code. On peut donc appliquer les mêmes méthodes et utiliser les mêmes outils que l’on emploie pour la collaboration sur des projets informatiques. (Versioning de code source, gestion des conflits de code, etc…)

Cas d’usage communs

Si on ramène IaC dans les problématiques les plus communes du déploiement d’infrastructure Cloud, il s’agit principalement de la capacité de réplication d’une infrastructure pour réaliser de la CI/CD en multi-environnement dédié : DEV/QAL/PROD.

Sans l’IaC, il faut passer par des commandes et clics manuels pour configurer les différentes briques qui composent une infrastructure. Multipliez ces tâches par le nombre d’environnement que vous voulez déployer, la liste devient assez longue, ce qui revient à laisser la porte grande ouverte aux erreurs d’inattention. Pour éventuellement remédier à ça, on pourrait documenter le mode opératoire pour déployer à la main un nouvel environnement. Cependant, cela reviendrait à devoir maintenir une documentation en cas d’évolution de l’infra qui devra d’ailleurs être modifiée manuellement sur chaque environnement. Avec l’IaC, c’est simple, pas besoin de documentation.

Le code étant dans un langage déclaratif, l’infrastructure se décrit elle-même au travers du code. Si nous souhaitons faire évoluer notre infrastructure sur tous les environnements, pas besoin de répéter toute une liste d’action X fois, il suffit d’autoriser les déploiements sur l’outil de CI/CD.

Pour résumer, adopter l’IaC, c’est gagner en agilité, rentabilité et fiabilité sur l’approvisionnement en infrastructure informatique en appliquant les principes du développement et déploiement logiciel à l’infrastructure.

Comment gérer et déployer des infrastructures sur Azure avec l’IaC ?

Azure Resource Manager (ARM)

Comme évoqué dans l’article pour créer une connexion de service entre Azure DevOps et Azure Resource Manager, la gestion des ressources sur Azure se fait au travers d’Azure Resource Manager. L’IaC sur Azure consiste donc à utiliser Azure Resource Manager pour définir les ressources que l’on souhaite déployer.

2.png

Azure DevOps

3.png

  • Azure DevOps est un ensemble de modules/services proposé par Microsoft Azure afin de mettre en place les pratiques DevOps au sein des entreprises. Pour faire un petit tour des principales fonctionnalités que l’on utilise :
  • Azure Boards : Une liste d’outils de gestion de projets Agile. On l’utilise pour planifier, suivre et récupérer des feedbacks sur ce qu’on l’on appelle des Work Items. Ils sont utilisés pour décrire des bugs, user stories et fonctionnalités.
  • Azure Repos : Un outil de gestion de version de code source. Il permet de travailler avec Git et/ou Team Foundation Version Control (TFVC).
  • Azure Pipelines : Un service de CI/CD permettant de compiler, tester et déployer automatiquement du code applicatif sur plusieurs plateformes Cloud et environnements.
  • Azure Test Plans : Un ensemble d'outils pour le test et la QA, qui permet entre autres de faire des plans de tests automatisés.
  • Azure Artifacts: Ce service permet de gérer et partager des paquets/bibliothèques dans une équipe/entreprise à travers un feed privé NuGet/npm/Maven.

Pour résumer, Azure DevOps permet de gérer et monitorer tout le cycle de développement d'une application jusqu'à sa mise en production grâce à des outils conçus pour répondre aux besoins de chaque étape de la chaîne. Dans notre cas, pour l'IaC, il s’agira surtout d’exploiter les services Azure Repos et Azure Pipelines, qui permettront de gérer notre code et déployer nos infrastructures cibles. Notez qu'il faudra au préalable avoir créé une connexion de service entre votre Azure DevOps et la souscription Azure sur laquelle vous souhaitez déployer vos infra.

Terraform

Les fichiers IaC pour ARM sont par défaut les ARM templates en JSON, mais il est possible d'utiliser d'autres formats moyennant l'utilisation d'autres outils. Ici on va parler de Terraform. Terraform est un outil open-source IaC publié par HashiCorp permettant de concevoir et provisionner des ressources sur des Cloud comme Azure, AWS ou GCP. C’est en l’incluant dans une toolchain CI/CD que l’on va pouvoir l’exploiter au maximum. Le langage utilisé par Terraform est le HashiCorp Configuration Language (HCL).

Terraform CLI

Terraform met à disposition une interface de ligne de commande (CLI) qui permet de faire plusieurs choses. Les principales sous-commandes que l'on va utiliser au sein de nos pipelines CI/CD sont les suivantes :

  • terraform init : on prépare le dossier de travail de terraform en installant les plugins et modules nécessaires pour l’exécution du fichier.
  • terraform validate : on va valider la conformité de l’infra décrite, vérifier s’il n’y a pas d’incohérences pour des configurations manquantes, ou si l’infrastructure décrite ne respecte pas les règles imposées sur la création de certaines ressources.
  • terraform plan : terraform va planifier les modifications qu’il va appliquer pour atteindre l’infrastructure souhaitée en comparant le code avec l’état de l’infrastructure. Dans le cas où l’on modifie une infra existante, cette commande va générer un plan d’action impactant le moins possible l’existant.
  • terraform apply : cette commande va appliquer les modifications qui ont été au préalable définies par la commande “plan” et donc déployer l’infrastructure.

Donc sur Azure DevOps, on va utiliser terraform init et validate dans un pipeline de CI pour vérifier que notre description d’infrastructure est cohérente. On va ensuite déployer cette infrastructure avec une pipeline de CD qui va faire un init, puis un plan et pour finir un apply.

Parmi les fonctionnalités clés de Terraform, on peut noter la possibilité de créer des modules de définition. Ceux-ci permettent de créer une couche d’abstraction à l’IaC et de ne laisser la main que sur ce qui doit vraiment être modifiable. Par exemple, on peut faire en sorte que la RAM de toutes les VM qui seront créées à travers le module soit au minimum. Les personnes qui vont utiliser le module n’auront alors qu’à renseigner quelques paramètres de contexte pour que la ressource soit créée.

On vient de parler de paramètres de contexte. Vous l’aurez compris, on peut également variabiliser le contenu du fichier terraform, pour lui passer des paramètres et réexploiter du code existant, comme par exemple, déployer une infrastructure identique pour créer un nouvel environnement identique. Il est également possible de stocker le fichier d’état dans un stockage externe pour faciliter la collaboration et comme mentionné au début, terraform permet de travailler avec plusieurs fournisseurs de Cloud.

Terraform est donc un outil que l'on va intégrer dans un pipeline de CI/CD afin de déployer de l'infra-as-code. De ce fait terraform permet de répondre à plusieurs problématiques de la gestion d'infrastructures sur le Cloud grâce la possibilité d'utiliser des outils de contrôle de version de code, déclarer des dépendances entre différentes briques pour les déployer dans le bon ordre, définir des variables, qui pourront devenir des paramètres pour des modules.

L’ensemble va donc permettre :

  • De faciliter et d'accélérer le processus de déploiement d’infra
  • Garantir l’idempotence entre les différents environnements d’une même infra
  • Faciliter la collaboration en stockant le state dans le Cloud
  • Éviter les risques de surcoûts liés à l’infra en limitant les configurations possibles
  • Appliquer des règles de nommage sur les briques que l’on souhaite déployer
  • Être capable de faire du multicloud
  • Le code est déclaratif donc l’effort de documentation est réduit

Vous l’aurez compris, il n’y a que des avantages à faire de l’IaC.