Terraform Vs Ansible

Contexte

Pour les entreprises qui hébergent principalement leurs services dans des systèmes "legacy", le mouvement vers l'Infrastructure-as-code pose la question du choix des outils. Terraform et Ansible sont des outils couramment utilisés dans ce domaine. Mais, quand, comment utiliser Terraform, Ansible? Et devons-nous utiliser les deux?


Remarque importante : cet article ignore intentionnellement Kubernetes et les outils de provisionnement cloud natifs et leur couche d'infrastructure abstraite avancée.


Tout d'abord, remontons un peu dans le temps.


Infrastructure-as-Code


Wikipedia:

"Infrastructure as code (IaC) is the process of managing and provisioning computer data centers through machine-readable definition files, rather than physical hardware configuration or interactive configuration tools. The IT infrastructure managed by this process comprises both physical equipment, such as bare-metal servers, as well as virtual machines, and associated configuration resources…"


Depuis l'origine, le but de l'IaC est de déployer une infrastructure avec des fichiers (description déclarative) représentant des ressources (c'est-à-dire des composants, des variables, etc.). Idéalement, pour suivre les modifications, les fichiers se trouvent dans un dépot de code source.


De nombreux outils existent pour effectuer cette tâche, Ansible et Terraform en font partie.

Mais, avant de comparer, revenons rapidement sur les paradigmes couramment mentionnés dans l'IaC


Mutable / Immutable

Lorsqu'on souhaite changer un élément d'une infrastructure existante.


Mutable Dans une infrastructure Mutable : on le met à jour.

Immutable Dans une infrastructure Immutable : on le detruit et on le recrée

Imperatif / Declaratif

Imperatif Specifie le Comment faire? C'est un workflow, une procédure

Declaratif Décrit le Quoi faire? C'est un modéle

Fichiers exemple

Terraform est un outil déclaratif : il atteindra l'état souhaité. Vous trouverez ci-dessous un exemple de provisionnement d'un conteneur Nginx avec Docker et Terraform:

Terraform HCL:



Ansible est un outil impératif, au niveau du module. Il fournit, à plus grande échelle, l'orchestration de modules. Boucle, condition de test, attendre, répétition, détection d'erreur... sont possibles. De la même manière que le langage de codage.

Ansible Yaml :





Comment fonctionnent-ils?

Terraform

Terraform charge tous les fichiers, binaires, configurations et modules requis. Une fois que tout est configuré, Terraform compare l'état persisté et les objets dans l'infrastructure réelle. Ensuite, Terraform exécute les commandes à appliquer sur cette infrastructure. Enfin, un nouvel état est enregistré.


La communication entre l'interface de ligne de commande Terraform et les hôtes ciblés dépend des fournisseurs. Le protocole entre Terraform et les plugins fournisseurs est gRPC. Les plugins fournisseurs utilisent leur propre API pour interagir avec l'infrastructure.

Ansible

Ansible obtient les dépendances requises pour chaque playbook. Ensuite, il récupère la liste des hôtes cibles à partir de l'inventaire et joue les commandes. Il n'y a pas d'état centralisé, un mécanisme de mise en cache permet l'optimisation et la relecture eventuelle.


La communication avec les hôtes se fait par défaut à l'aide du protocole SSH. Pour le cloud, les plugins Ansible (aws, azure, gcp,...) communiquent avec l'infrastructure de la même manière que les fournisseurs Terraform (via les services web).