Blog | WeScale

Atlantis, le Terraform collaboratif

Rédigé par Jonathan Forget | 11/01/2019

Terraform est sûrement l’un des meilleurs amis du DevOps, sans lui nous serions perdus. Comme vous le savez sûrement, Terraform permet d'écrire de l’Infrastructure as Code (IaC), de déployer facilement des configurations et des environnements et de garder un état de notre infrastructure.
Tout ceci est bien beau mais lorsqu’on commence à travailler à plusieurs sur un même projet Terraform, cela devient moins évident. Le suivi des modifications, les reviews et par la suite l’application de modifications deviennent vite compliqués à gérer.

C’est là qu’intervient Atlantis !

Atlantis  est un service compatible avec Github, Gitlab et Bitbucket qui, lors de l’ouverture d’une Pull Request, va vérifier si des changements ont eu lieu au niveau du code terraform, et si c’est le cas, va faire un plan sur votre infrastructure pour voir clairement les modifications à apporter.

Installation

C’est un projet open source, il faut donc l'héberger soi-même. Il existe plusieurs méthodes d’installation, je vous conseille de faire un tour sur leur documentation pour choisir la solution la plus appropriée à votre infrastructure.

Fonctionnement sur Github

Par défaut Atlantis va tout simplement exécuter un terraform plan. Vous pouvez aussi lui donner des commandes à exécuter si vous avez une architecture un peu plus complexe (layers, workspaces…).
Une fois le plan terminé, le résultat sera affiché dans la PR. Il sera désormais possible d’appliquer ce plan directement depuis la PR si le résultat vous convient.

Cela représente un workflow assez simple, mais Atlantis nous permet d’aller plus loin. Il est possible d’activer une option qui nous permet de choisir un workspace spécifique, d’avoir différents workflows par projet (par exemple, selon l’environnement) mais aussi d'être sûr que la PR a été vue et acceptée par un ou plusieurs membres de la team avant de pouvoir appliquer les modifications.
Tout cela en ayant juste un fichier de configuration YAML à la base du repository, dont voici  un exemple :

version: 2
projects:
- name: my-project-name   				# Nom du Projet
  dir: .			        			# Dossier ou les .tf sont présents
  workspace: default					# Workspace Terraform
  terraform_version: v0.11.0			# Version de terraform
  autoplan:						
    when_modified: ["*.tf", "../modules/**.tf"]		# Regex sur les fichiers qui doivent
                                                    # démarrer un plan s’ils sont modifiés

    enabled: true					# Démarre un plan automatiquement
  apply_requirements: [mergeable, approved]	# Condition requise avant d’appliquer
  workflow: myworkflow				# Workflow à utiliser
workflows:						    # Déclarations des différents workflow
  myworkflow:						# Déclaration d’un workflow
    plan:						    # Déclaration du plan
      steps:
      - run: my-custom-command arg1 arg2
      - init
      - plan:
          extra_args: ["-lock", "false"]
      - run: my-custom-command arg1 arg2
    apply:						# Déclaration de l’apply
      steps:
      - run: echo hi
      - apply

Votre workflow Terraform peut désormais être entièrement géré depuis des PR, et c’est plutôt cool. La collaboration, c’est bien !

Exemple d’un workflow atlantis standard

1ère étape : ouvrir une Pull Request

2ème étape : Atlantis lance automatiquement un terraform plan et écrit le résultat dans un commentaire de la Pull Request

3ème étape : quelqu’un dans votre équipe peut voir le résultat et accepter la Pull Request

4ème étape : commenter atlantis apply dans la Pull Request

5ème étape : Atlantis exécute un terraform apply et écrit le résultat dans un commentaire sur la Pull Request

6ème étape : merge de la Pull Request

Ainsi s'achève ma présentation d'Atlantis. De mon point de vue, il s'agit d'un must have quand on utilise Terraform en équipe.
Si vous souhaitez en savoir plus, je vous conseille d’aller voir directement sur le site d’atlantis. La documentation est simple et claire !