Quel est l’intérêt de l’Infrastructure as Code ? #Terraform et #Packer

Publié le

L’IaC (Infrastructure as Code) permet de définir chaque élément d’infrastructure et leurs interactions sous la forme de code. L'avantage principal d'utiliser du code est de permettre d’automatiser l’installation de l’infrastructure et de ses différents services.

La mise au point du code nécessite au départ plus de temps, mais permet par la suite d'en gagner énormément : pour recréer l’infrastructure, la dupliquer, et surtout, éviter les erreurs ou oublis par rapport à une installation manuelle.

Maintenir son infrastructure devient aussi beaucoup plus facile. Par exemple, ajouter un nœud à un cluster Kubernetes pourrait se résumer à modifier une variable dans la base de code.

En plus de ces avantages, on utilise un gestionnaire de code, comme git, ce qui permet de garder l'historique des évolutions de l'infrastructure, et de faciliter le travail en équipe. Il est tout à fait possible de rendre une infrastructure testable depuis une CI, avec des outils comme terratest par exemple (spécifique à Terraform).

Comment mettre en place le concept d’Infrastructure as Code ?

Il existe de nombreux outils pour faire de l’IaC. Parmi ces outils, on peut citer : Terraform, CloudFormation (spécifique à Amazon Web Services), Ansible, etc.

Chacun de ces outils répond à des problématiques précises, principalement :

  • La mise en place de l’infrastructure (les serveurs, réseaux, etc.)
  • Le déploiement des services de base (installer un runtime, un service de base de données, etc.)
  • Le déploiement des applications finales

C’est pour cette raison qu’on utilise parfois plusieurs de ces outils. Par exemple, j’ai l’habitude d’utiliser Terraform pour provisionner l’infrastructure de base chez un cloud provider. J’utilise ensuite Ansible pour mettre en place les services et configurer les applications à déployer. Dans beaucoup de cas simples, on peut exécuter toute la mise en place de l'infrastructure directement avec Terraform.

Les infrastructures immutables

Les infrastructures immutables sont des infrastructures dans lesquelles on ne modifie pas les composants, mais à la place, on en crée de nouveaux et supprime les anciens. Pour les machines virtuelles, on aura tendance à utiliser un outil comme Packer pour mettre au point une image de base. Avec l’aide de quelques scripts, on pourra toujours ajuster quelques paramètres via cloud-init au moment de déployer ces machines virtuelles.

Le cas de Terraform

Nous utiliserons Terraform et Packer prochainement dans des tutoriels. Terraform a un fonctionnement assez simple en théorie, mais c’est un outil très puissant quand il est correctement utilisé.

Terraform fonctionne suivant une approche déclarative:

  • On conserve un état de l’infrastructure (le « state » de Terraform, qui se matérialise sous la forme d’un fichier, ou encore d’un objet dans S3, ou sous d’autres formes). Au départ cet état est vide, puisqu’il n’y a pas encore d’infrastructure.
  • On édite un ensemble de règles qui définissent l’infrastructure, au moyen d’un langage déclaratif, le HCL (HashiCorp Configuration Language). À partir de ces définitions, on initialise Terraform, qui va alors télécharger les « providers » nécessaires au fonctionnement du code. Ces providers sont des plugins qui appellent une API spécifique. L’initialisation se fait à partir de la commande « terraform init ».
  • On peut ensuite demander à Terraform de mettre au point un plan d’exécution (commande « terraform plan »). Ce plan décrit l’ensemble des actions à exécuter pour obtenir le résultat requis par le code. Il est mis au point en comparant l’état de l’infrastructure courant (le « state ») et l’état désiré, décrit dans le code.
  • On peut ensuite exécuter le plan (commande « terraform apply »), ce qui réservera effectivement les ressources au moyen des providers. Le « state » est mis à jour à ce moment-là.
  • On peut aussi détruire l’infrastructure complètement (commande « terraform destroy »).

Terraform est capable de gérer les dépendances entre les différentes parties de l’infrastructure, et il est capable de travailler avec de nombreux providers à différents niveaux : infrastructure (AWS, GCS, etc.), plate-forme (Kubernetes, etc.), et même certains services (Cloudflare par exemple). On peut aussi se connecter aux serveurs et exécuter des commandes par SSH, ce qui étend les possibilités pratiquement à l’infini. C'est un outil très puissant.

Packer

Packer permet de produire des images de machines virtuelles automatiquement en suivant un fichier de définition au format HCL ou json. Ces images contiennent les services dont on a besoin. Par exemple, on peut créer des images de machines virtuelles qui embarquent MariaDB, ou un autre service de bases de données. On peut aussi créer des images de machines virtuelles pour préparer un déploiement de Kubernetes, etc.

Une fois ces images prêtes, on peut les utiliser avec notre cloud-provider afin de les déployer. Comme ces images contiennent déjà toutes les mises à jour et les services nécessaires, on gagne un temps considérable lors du déploiement. Cet outil facilite la mise en place d'infrastructures immutables.

Conclusion

Nous avons vu comment l’IaC permet de rendre fiable le développement d’infrastructure en automatisant les tâches. Nous avons aussi vu dans les grandes lignes comment fonctionnent Terraform et Packer, deux outils de la suite Hashicorp.

Nous aurons l’occasion de mettre en œuvre ces deux outils dans les tutoriels à venir. Un exemple d'utilisation est visible dans le projet sur la mise en place de Kubernetes chez Exoscale.

PHILIPPE CHEPY

Administrateur Système et Développeur