Blog ACENSI
Code terraform

Infrastructure as Code & Terraform

L’infra as Code, c’est quoi au juste ?

L’Infrastructure as code (IaC) (littéralement : « infrastructure en tant que code ») est un ensemble de mécanismes permettant de gérer, par des fichiers descripteurs ou des scripts (code informatique), une infrastructure (informatique) virtuelle. (source : Wikipedia)

En d’autres termes, cela veut dire que chaque élément de l’infrastructure (machine virtuelle, interface réseau, serveur applicatif, instance de base de données, etc..) peut être décrit dans un langage et provisionné par un outil capable d’interpréter sa description.

L’IaC s’est construit sur les défauts historiques du SysOps : la difficulté de connaître l’historique et l’existant, des opérations fastidieuses, les risques d’erreurs humaines et une faible capacité à capitaliser sur ce qui a déjà été fait.

Cela apporte plusieurs avantages :

  • Documentation automatique : si l’infrastructure est décrite par du code, alors ce dernier est une représentation exhaustive de l’existant, aussi bien sur l’aspect quantitatif (ex : nombre de disques attachés à une MV), que qualitatif (ex : taille des disques).
  • Gestion de version des sources : l’autre avantage majeur d’utiliser du code, c’est de pouvoir capitaliser sur toutes les années de bonnes pratiques logicielles dans ce domaine. Ainsi le code sera versionné, chaque changement sera historisé et les mêmes processus de vérification que pour du code applicatif peuvent exister (revue de code avant déploiement, tests automatisés et analyse de code par des robots). Dans le cas d’un problème, le retour arrière sera facilité par le fait qu’un état de l’infrastructure correspond à une version du code bien précise.
  • Déploiement automatisé et sécurisé : la création des ressources est plus rapide et automatisée. La réduction des interventions humaines permet de réduire les risques ce qui offre une infrastructure plus cohérente.
  • Réutilisabilité du code : la duplication des ressources pour la mise en place d’un environnement différent (passage en production par exemple) peut se faire très rapidement et sûrement puisqu’il s’agit de copier du code qui a été validé auparavant. De plus, cela ouvre la porte à une scalabilité facile des ressources.

Aujourd’hui, l’écosystème “IaC” est déjà large et comprend des outils bien connus du monde DevOps tel que Ansible, Vagrant, Puppet et donc … Terraform.

Figure 1: Les outils IaC et leurs domaines d’application

Terraform, mais encore ?

Terraform est un outil développé en Go (langage de programmation compilé) par HashiCorp (aussi à l’origine de Packer, Vagrant, Vault…) qui se concentre uniquement sur la création, la gestion et la destruction des éléments de l’infrastructure. Il peut non seulement créer de nouvelles ressources, mais peut également importer l’infrastructure existante.

Terraform utilise un langage dédié HCL (HashiCorp Configuration Language) pour gérer la configuration.

Figure 2 : Exemple de code HCL

Les principales caractéristiques de l’outil :

  • Utilise un langage déclaratif : on décrit uniquement le “quoi” et pas le « comment ». Ex : description d’un conteneur nginx en figure 2
  • À état / Idempotent : Terraform maintient l’état de l’existant et la première action lors d’une modification sera de calculer les nouvelles créations, mises à jour et destructions par rapport à l’état actuel. Ex : Je veux 5 conteneurs nginx. La première fois, j’aurai la création de 5 conteneurs. La deuxième, il ne se passera rien (= pas de nouvelle création)
  • Architecture : client / push : le client Terraform va pousser les modifications distantes. Il n’y a pas besoin d’agent sur les éléments de l’infrastructure opérés dans Terraform.
  • Multi plateforme : c’est l’atout principal de l’outil. Comme nous allons le voir par la suite, Terraform est capable de gérer des infrastructures sur une très grande variété de plateforme.

Mais pourquoi Terraform ?

La principale raison de choisir Terraform est qu’il s’agit d’un outil de provisionnement open source, dont le développement est géré par Hashicorp, un acteur qui s’est imposé comme un leader du DevOps. De plus, l’ouverture voulue du produit permet d’intégrer une très large communauté rassemblant de grands groupes ainsi que des acteurs plus modestes.

C’est la force de Terraform. L’outil s’articule autour de connecteurs appelés “provider” qui permettent de matérialiser la grande diversité d’objets externes en artefact Terraform appelés “ressources”.

Ainsi, Terraform peut gérer une infrastructure sur des acteurs Tier 1 du cloud (GCP, AWS, Azure, etc..) mais le champ d’action est bien plus vaste. K8S, vSphere, gitlab, github, fortios… sont autant de produits ouverts à Terraform, rendant possible la gestion de son infrastructure “on premise”.

La liste des providers est disponible ici : https://registry.terraform.io/browse/providers

Par exemple, il y a aujourd’hui 45 connecteurs différents dans le domaine de l’orchestration de conteneur.

Figure 3 : Providers Terraform pour l’orchestration de conteneurs

Terraform en action

Si on reprend le code de la Figure 2, il s’agit de déployer un conteneur nginx en local.

Il suffit d’installer Terraform (un simple paquet sous Linux par exemple), d’écrire le fichier descripteur de notre infra puis de le versionner.

La suite est très simple. Exécuter les commandes “terraform fmt” puis “terraform validate” pour respectivement formater notre code correctement et le valider syntaxiquement.

Vient le moment du déploiement. Pour cela, on utilise la commande “terraform apply”.

Figure 4 : plan de déploiement

Terraform va générer un “plan de déploiement” : Toutes les actions qui vont être appliquées.

Après une dernière validation, notre infrastructure va changer d’état :

Figure 5 : résultat du déploiement

Une instance nginx est désormais disponible à l’adresse http://localhost:8000

Pour modifier cette infra, il suffit de modifier le code et de commiter sa nouvelle version. Puis d’exécuter une nouvelle fois la commande “terraform apply”.

Exemple : je veux changer le port de 8000 à 8080

Le code devient :

Le résultat de la commande apply :

L’instance nginx a été recréée et est désormais disponible sur http://localhost:8080

It’s a wrap !

Voila ! J’espère vous avoir donné un bon aperçu des avantages de l’IaC, des possibilités offertes alors que le besoin en infrastructure est exponentiel et de la nécessité d’utiliser des outils adaptés.

Terraform est sans conteste l’un d’eux. C’est un outil développé par l’un des leaders des produits DevOps, l’un de ceux qui définissent à quoi ressembleront les métiers de SysAdmin/DevOps dans les années à venir.

Pourquoi ce blog ?

Pour permettre à nos consultants et experts techniques de partager leurs connaissances et retours d’expérience autour des sujets qui les passionnent. Ce blog, intégralement écrit par eux, a pour vocation d’être un véritable lieu d’échanges et d’apprentissage.

Alors n’hésitez pas à commenter nos articles pour rejoindre la conversation !

Une suggestion ?

Si vous avez des idées pour améliorer ce blog, nous sommes à l’écoute de vos remarques. Vous pouvez nous écrire via le formulaire de contact qui se trouve en bas de page.

Bonne visite !