Home >> Blog >> Terraform Vs Ansible

Terraform Vs Ansible

12 octobre 2021

By Stéphane Métairie.

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).

Fonctionnalités les dépots publics

Les deux outils disposent d’un registre public pour étendre leur capacité.

Terraform Registry est recent avec approximativement 1500 fournisseurs.

Ansible Galaxy dispose d’un grand nombre d’extensions (rôles, plugins, collections,…), avec environ 30 000 éléments.

Structure de fichiers

Terraform a une structure légère. Des conventions simples sont appliquées.

Ansible a une structure de dossiers/fichiers yml pouvant mener à un projet complexe.

La priorité des variables dans Ansible témoigne de la structure complexe que vous pouvez atteindre.

Comparaison Générale

Ansible Terraform
Objectif de l’outil Aider la configuration d’infrastructure à partir de code. Gerer une infrastructure pour atteindre consistence et predictabilité des déploiements
Infrastructure Mutable: Immutable possible.Depend des modules et de la manière de coder Immutable: Mise-à-jour de l’infra possible également
Language Yaml, JSON HCL (DSL Hashicorp), JSON
Provisioning Oui Oui
Configuration Oui Oui
Orchestration Oui, bonne capacité d’orchestration des ressources Oui, partiellement automatique: Depend de l’implémentation des fournisseurs
Etat Non: Un etat existe par module, il est découver pendant l’execution Oui centralisé: Il est toujours possible d’utiliser Terraform sans état.
Idempotence Depend des modules Oui
Sans Agent Oui Oui
Cooperation avec d’autres outils Oui Oui
Language Source Python Go
Installation Facile, plusieurs binaires Facile, un binaire
Source Code https://github.com/ansible/ansible  https://github.com/hashicorp/terraform 
Language (voir Pulumi qui supporte Python, Go…) Yaml HCL or JSON
Documentation Excellente Excellente
OSS Licence Apache MPL
Popularité (google trends) Bon Bon
Activité (Github) Commiters (5K) Stars (50K) Commiters (1.5K) Stars (30K)
Last month: Last month:
16 merged Pull Request 67 merged Pull Request
25 closed issues 93 closed issues
Commits/y last 1y: Commits/y last 1y:
1230 (24 commits/week) 1636 (31 commits/week)

Google Trend : global Search

Google Trend : par pays

Lifecycle phases

  • Comment developper ?
  • Comment integrer dans une chaine CICD ?

Ansible Terraform
Editeur (VSCode) ​Plugin Ansible RedHat (5K installed) Plugin Terraform Hashicorp (+1.2M installed)
Dependency Management Lors de l’utilisation de modules prêts à l’emploi ou du développement d’éléments : Collections améliore la gestion des dépendances. Aucun depot spécifique n’est nécessaire, les Collections prennent en charge Git et le controle de version  Les fournisseurs publics et les modules sont bien gérés. Meme si Git est pris en charge pour les Modules, pour déployer, un registre privé reste utiler (c’est-à-dire Cloudsmith, Terraform Cloud,…) JFrog, Nexus ne supportent pas encore Terraform
Build and run Préférable d’utiliser les containers Préférable d’utiliser les containers
Orchestration Vous pouvez enchaîner les tâches Ansible, manuellement. De nombreuses possibilités de controles existent Terraform gère automatiquement la dépendance et l’orchestration,… jusqu’à ce que vous ayez besoin de lier explicitement des tâches
Google Cloud GCP ​GCP Ansible Plugin a 171 fonctions supportées GCP Terraform Providers a 929 fonctions supportées (ce n’est pas 100% de couverture)
GCP BigQuery ​Ansible implémente SEULEMENT 2 objets: dataset, table Terraform implémente pratiquement toute l’API: connection, dataset, dataset_access, dataset_iam, data_transfer, job, routine, reservation, table, table_iam
AWS Ansible offre un support faible d’AWS, SEULS ~30 services Terraform implémente 800 fonctions couvrant bien les services AWS
BigIp Bon support Bon support
OpenStack Bon support Bon support

Integration

Ansible Terraform
Test Jinja test: Outils externes no test: Outils externes: Terratest
Securité pas de RBAC c’est un CLI. Vault builtin existe pour faire de l’encryption pas de RBAC c’est un CLI. Les données sensibles peuvent etre masquées.Attention à la commande "terraform destroy" qui peut supprimer toute une infrastructure
CICD Jenkins Ansible & Tower / AWX GitLab GitHub actions (Lint…) GitLab Jenkins GitHub actions (Lint, Test…)
Interface Web (collaboration, audit, jobs,…) Tower (AWX version Open Source) Terraform Cloud (jusqu’à 5 utilisateurs). Terraform Enterprise

En production

Terraform et Ansible sont des CLI, il est recommandé d’exécuter le code dans l’outil CICD et/ou dans un conteneur pour lier au contexte de l’entreprise (droits d’accès, configurations, secrets…)

Terraform autorise de détruire toute l’infrastructure en une seule commande : « terraform destroy », il est fortement recommandé de protéger l’accès à l’interface de ligne de commande.

Points Forts , Points faibles

FORCE

ANSIBLE

  • Large périmétre de l’infrastructure à l’application
  • Fonctionnalités riches
  • Flexibilité et capacités d’orchestration
  • Courbe d’apprentissage
  • Packaging des Collections

TERRAFORM

  • Immutabilité
  • État persistant
  • Gestion et graphe des dépendances
  • Prise en charge des fournisseurs de cloud
  • GitOps
  • Gestion des verrous

FAIBLESSE

ANSIBLE

TERRAFORM

  • Gestion des Données (exemple: inventaire)
  • Structurer du code est laborieux
  • Debuging

Conclusion?

Comment choisir le bon outil?

Elément 1 : Cloud

C’est la première question à se poser : à quelle couche voulez-vous dédier votre outil?

  • Terraform est dédié aux fournisseurs de cloud et fonctionne bien au niveau de la couche Infrastructure & Réseau
  • Ansible opère de l’infrastructure et du réseau à la couche Middleware

Terraform est le meilleur outil pour la gestion des ressources Cloud

Elément 2 : pour le "legacy"

Evaluer vos besoins:

  • Vérifiez que le fournisseur de module repond a votre besoin,
  • Vérifiez l’outil qui aura la meilleure performance

Ansible a plus de flexibilité et un énorme support sur les systèmes "legacy".

Elément 3 : GitOps

Êtes-vous prêt à adopter des pratiques édictées dans GitOps?

  • Si c’est le cas, Terraform est clairement l’outil le plus proche de cette philosophie : par sa capacité de comparer l’infrastructure réelle et l’état persistant, appliquer des actions pour converger vers le nouvel état souhaité
  • pour plus de GitOps, l’observabilité, l’auto-orchestration sont nécessaires. Les chaines de CICD traditionnelles ne sont pas suffisantes pour fournir cette étape
  • Ansible est davantage utilisé de manière traditionnelle, car plus flexible

Terraform n’est pas suffisant pour implémenter GitOps, Ansible est en retrait, notamment sans implémention d’état centralisé.

Elément 4 : utiliser les deux

Le scénario pour avoir les deux ensemble est également couramment utilisé.

Exemple "reconstruire une infrastructure entière à partir de zéro" :

  • Terraform initialise l’infrastructure, ajoute du réseau, stockage, les ressources de bas niveau… etc. Enregistrement de l’état
  • Ansible ajoute des configurations personnalisées du système d’exploitation (utilisateurs, droits, sso…), ajoute une base de données et injecte des jeux de données,…
  Edit this page