Comment utiliser Terraform avec votre équipe

L’auteur a sélectionné le Fonds pour le Logiciel Libre et Open Source pour recevoir une donation dans le cadre du programme Écrire pour les Dons.

Introduction

Quand plusieurs personnes travaillent simultanément sur le même projet Terraform depuis différents endroits, il est important de gérer correctement le code d’infrastructure et l’état du projet pour éviter les erreurs d’écrasement. La solution consiste à stocker l’état à distance au lieu de localement. Un système distant est disponible pour tous les membres de votre équipe, et il est possible pour eux de verrouiller l’état pendant qu’ils travaillent.

Un tel backend distant est pg, qui stocke l’état dans une base de données PostgreSQL. Au cours de ce tutoriel, vous l’utiliserez avec une Base de Données Gérée par DigitalOcean pour garantir la disponibilité des données.

Terraform prend également en charge l’offre cloud officielle et gérée par Hashicorp appelée Terraform Cloud—une application propriétaire qui synchronise le travail de votre équipe en un seul endroit et offre une interface utilisateur pour la configuration et la gestion.

Dans ce tutoriel, vous allez créer une organisation dans Terraform Cloud à laquelle vous connecterez votre projet. Vous utiliserez ensuite votre organisation pour configurer des espaces de travail et des ressources. Vous stockerez votre état dans le cloud géré afin qu’il soit toujours disponible. Vous configurerez également le backend pg avec une base de données PostgreSQL gérée associée.

Prérequis

Remarque : Nous avons spécifiquement testé ce tutoriel en utilisant Terraform 1.1.3.

Stockage de l’état dans une base de données PostgreSQL gérée

Dans cette section, vous allez configurer un projet qui déploie un Droplet et stocke l’état dans une base de données PostgreSQL gérée par DigitalOcean en utilisant le fournisseur pg. Ce fournisseur prend en charge le verrouillage de l’état, de sorte que l’état ne soit jamais écrasé par deux ou plusieurs modifications se produisant simultanément.

Commencez par créer un répertoire nommé terraform-team-pg dans lequel vous stockerez le projet :

  1. mkdir ~/terraform-team-pg

Naviguez jusqu’à ce répertoire :

  1. cd ~/terraform-team-pg

Vous définirez d’abord le fournisseur, puis passerez la chaîne de connexion pour la base de données et le module digitalocean. Créez et ouvrez provider.tf pour l’édition :

  1. nano provider.tf

Ajoutez les lignes suivantes :

~/terraform-team-pg/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  backend "pg" {
    conn_str = "your_db_connection_string"
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Ici, vous avez besoin du fournisseur digitalocean et vous définissez le backend pg, qui accepte une chaîne de connexion. Ensuite, vous définissez la variable do_token et la passez à l’instance du fournisseur digitalocean.

N’oubliez pas de remplacer votre_chaîne_de_connexion_bd par la chaîne de connexion pour votre base de données gérée à partir de votre Panneau de contrôle DigitalOcean, que vous pouvez trouver en appuyant sur Actions, en sélectionnant Détails de connexion, et en choisissant Chaîne de connexion dans le menu déroulant. Ensuite, enregistrez et fermez le fichier

Avertissement : Pour continuer, dans les Paramètres de votre base de données, assurez-vous d’avoir l’adresse IP de la machine à partir de laquelle vous exécutez Terraform sur une liste blanche.

Initialisez le projet en exécutant :

  1. terraform init

La sortie sera similaire à ce qui suit :

Output
Initializing the backend... Successfully configured the backend "pg"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! ...

Terraform a réussi à initialiser le backend, ce qui signifie qu’il s’est connecté à la base de données.

Ensuite, définissez le Droplet dans un fichier appelé droplets.tf. Créez-le et ouvrez-le pour le modifier en exécutant :

  1. nano droplets.tf

Ajoutez les lignes suivantes :

~/terraform-team-pg/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

Ce code déploiera un Droplet appelé web-1 dans la région fra1, exécutant Ubuntu 20.04 sur 1 Go de RAM et un cœur de CPU. C’est tout ce que vous devez définir, donc enregistrez et fermez le fichier.

Vous aurez besoin de votre jeton DigitalOcean dans une variable d’environnement. Créez-en un, en remplaçant votre_token_do par votre jeton :

  1. export DO_PAT="your_do_token"

Pour vérifier que la connexion à la base de données fonctionne, essayez de planifier la configuration :

  1. terraform plan -var "do_token=${DO_PAT}"

La sortie sera similaire à ce qui suit :

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web sera créé + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Terraform n’a signalé aucune erreur et a planifié les actions comme d’habitude. Il s’est connecté avec succès à votre base de données PostgreSQL et a stocké son état. Plusieurs personnes peuvent maintenant travailler simultanément sur ce projet tout en restant synchronisées.

Stockage de l’état dans Terraform Cloud

Dans cette étape, vous allez créer un projet qui déploie un Droplet et utilise Terraform Cloud comme backend avec le fournisseur cloud. Cela implique de créer l’organisation et l’espace de travail dans Terraform Cloud, d’écrire le code d’infrastructure et de le planifier.

Création d’une Organisation

Terraform Cloud vous permet d’avoir plusieurs organisations, qui abritent vos espaces de travail et modules. Les organisations de plan payant peuvent avoir plusieurs équipes avec des fonctionnalités de contrôle des niveaux d’accès, tandis que le plan gratuit que vous utiliserez ne fournit qu’une seule équipe par organisation. Vous pouvez inviter des membres d’équipe à rejoindre l’organisation.

Commencez par vous rendre sur Terraform Cloud et connectez-vous. Si vous n’avez pas encore créé d’organisation, il vous demandera de le faire.

Entrez un nom d’organisation de votre choix et souvenez-vous qu’il doit être unique parmi tous les noms dans Terraform Cloud. Vous recevrez une erreur si le nom existe déjà. L’adresse e-mail devrait déjà être remplie avec l’adresse de votre compte. Une fois que vous avez terminé, cliquez sur le bouton Créer une organisation pour continuer.

Il vous demandera ensuite de sélectionner le type d’espace de travail.

Étant donné que vous interagirez avec Terraform Cloud en utilisant la ligne de commande, cliquez sur l’option Workflow piloté par CLI. Ensuite, saisissez un nom pour votre espace de travail et laissez la description vide.

Saisissez un nom d’espace de travail de votre choix (nous l’appellerons sammy), puis cliquez sur Créer un espace de travail pour finaliser le processus de création de l’organisation. Il vous dirigera ensuite vers une page de paramètres d’espace de travail.

Vous avez maintenant créé votre espace de travail, qui fait partie de votre organisation. Comme vous venez de le créer, votre espace de travail ne contient aucun code d’infrastructure. Au centre de l’interface, Terraform Cloud vous donne des instructions de démarrage pour vous connecter à cet espace de travail.

Avant de vous y connecter, vous devrez configurer la version de Terraform que le cloud utilisera pour exécuter vos commandes. Pour le faire, cliquez sur le menu déroulant Paramètres à côté de Aperçu et sélectionnez Général dans la liste. Lorsque la page s’ouvre, accédez au menu déroulant Version Terraform et sélectionnez 1.1.3 (pour ce tutoriel).

Ensuite, cliquez sur le bouton Enregistrer les paramètres pour sauvegarder les modifications.

Pour connecter votre projet à votre organisation et à votre espace de travail, vous devrez d’abord vous connecter à l’aide de la ligne de commande. Avant d’exécuter la commande, accédez à la page des jetons pour créer un nouveau jeton d’accès pour votre serveur, qui fournira l’accès à votre compte. Vous recevrez une invitation à créer un jeton API.

La description par défaut est bonne, donc cliquez sur Créer un jeton API pour le créer.

Cliquez sur la valeur du jeton, ou sur l’icône après celle-ci, pour copier le jeton API. Vous utiliserez ce jeton pour connecter votre projet à votre compte Terraform Cloud.

Dans la ligne de commande, exécutez la commande suivante pour vous connecter:

  1. terraform login

Vous recevrez la sortie suivante:

Output
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. ...

Terraform vous avertit que le jeton sera stocké localement. Entrez oui lorsqu’il vous le demande:

Output
--------------------------------------------------------------------------------- Open the following URL to access the tokens page for app.terraform.io: https://app.terraform.io/app/settings/tokens?source=terraform-login --------------------------------------------------------------------------------- Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value:

Collez le jeton que vous avez copié et confirmez avec ENTRÉE. Terraform affichera un message de succès:

Output
... - ----- - --------- -- --------- - ----- --------- ------ ------- ------- --------- ---------- ---- ---------- ---------- -- ---------- ---------- Welcome to Terraform Cloud! - ---------- ------- --- ----- --- Documentation: terraform.io/docs/cloud -------- - ---------- ---------- --------- ----- - New to TFC? Follow these steps to instantly apply an example configuration: $ git clone https://github.com/hashicorp/tfc-getting-started.git $ cd tfc-getting-started $ scripts/setup.sh

Vous avez configuré votre installation locale de Terraform pour accéder à votre compte Terraform Cloud. Vous allez maintenant créer un projet qui déploie un Droplet et le configurer pour utiliser Terraform Cloud pour stocker son état.

Configuration du projet

Tout d’abord, créez un répertoire nommé terraform-team-cloud où vous stockerez le projet :

  1. mkdir ~/terraform-team-cloud

Naviguez jusqu’à celui-ci :

  1. cd ~/terraform-team-cloud

Pour configurer votre projet, vous devrez :

  • définir et configurer le fournisseur cloud, qui interagit avec Terraform Cloud.
  • exiger que le fournisseur digitalocean soit capable de déployer des ressources DigitalOcean.
  • définir et initialiser les variables que vous utiliserez.

Vous stockerez les spécifications des exigences en fournisseurs et en modules dans un fichier nommé provider.tf. Créez-le et ouvrez-le pour l’édition en exécutant :

  1. nano provider.tf

Ajoutez les lignes suivantes :

~/terraform-team-cloud/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  cloud {
    organization = "your_organization_name"

    workspaces {
      name = "your_workspace_name"
    }
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Ici, vous spécifiez d’abord votre version Terraform. Ensuite, vous spécifiez le fournisseur digitalocean comme requis et définissez le backend sur cloud. Pour organization et workspaces.name, remplacez les valeurs surlignées par les noms que vous avez spécifiés.

Ensuite, vous définissez une variable appelée do_token, que vous transmettez au fournisseur digitalocean créé après lui. Vous avez maintenant configuré votre projet pour qu’il se connecte à votre organisation, alors enregistrez et fermez le fichier.

Initialisez votre projet avec la commande suivante :

  1. terraform init

La sortie sera similaire à ceci :

Output
Initializing Terraform Cloud... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.18.0... - Installed digitalocean/digitalocean v2.18.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform Cloud has been successfully initialized! ...

Étant donné que la définition de Droplet est la même que dans le projet précédent, vous pouvez la copier en exécutant :

  1. cp ../terraform-team-pg/droplets.tf .

Enfin, vous définirez les valeurs des variables. Le fournisseur cloud ne prend pas en charge le passage de valeurs aux variables via la ligne de commande, vous devrez donc les passer en utilisant des fichiers de variables ou les définir dans Terraform Cloud. Terraform lit les valeurs des variables à partir de fichiers portant un nom se terminant par .auto.tfvars. Créez et ouvrez un fichier appelé vars.auto.tfvars pour l’édition, dans lequel vous définirez la variable do_token:

  1. nano vars.auto.tfvars

Ajoutez la ligne suivante, en remplaçant votre_token_do par votre jeton d’API DigitalOcean :

vars.auto.tfvars
do_token = "your_do_token"

Lorsque vous avez terminé, enregistrez et fermez le fichier. Terraform lira automatiquement ce fichier lors de la planification des actions.

Votre projet est maintenant complet et configuré pour utiliser Terraform Cloud comme backend. Vous allez maintenant planifier et appliquer le Droplet et examiner comment cela se reflète dans l’application Cloud.

Application de la Configuration

Dans l’étape 1 de ce tutoriel, vous avez planifié un projet en utilisant la commande terraform plan. Étant donné que le projet Terraform Cloud a les mêmes ressources définies, vous pouvez éviter de le planifier à nouveau et l’appliquer directement à Terraform Cloud.

Vous appliquez le projet en exécutant la commande suivante pour le mettre à jour :

  1. terraform apply

Vous remarquerez que la sortie est différente lorsque vous utilisez local comme backend :

Output
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C will cancel the remote apply if it's still pending. If the apply started it will stop streaming the logs, but will not stop the apply running remotely. Preparing the remote apply... To view this run in a browser, visit: https://app.terraform.io/app/sammy-shark/sammy/runs/run-euVu9t1yUtuq5sy9 Waiting for the plan to start... Terraform v1.1.3 on linux_amd64 Configuring remote state backend... Initializing Terraform configuration... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web sera créé + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Lorsque vous utilisez le backend cloud, Terraform ne planifie pas ou n’applique pas la configuration depuis la machine locale. Au lieu de cela, il délègue ces tâches à Terraform Cloud et ne diffuse que la sortie sur la console en temps réel.

Entrez yes lorsque vous y êtes invité. Terraform terminera bientôt l’application de la configuration, et vous pourrez naviguer vers l’espace de travail sur le site web de Terraform Cloud pour constater qu’une nouvelle action a été appliquée.

Vous pouvez maintenant détruire les ressources déployées en exécutant la commande suivante :

  1. terraform destroy

Dans cette section, vous avez connecté votre projet à Terraform Cloud, rendant l’état de votre projet accessible à votre équipe dans un endroit centralisé. Cela permet de partager et de synchroniser l’état pour tous ceux qui ont accès au projet, ce qui améliore l’expérience.

Conclusion

Dans ce tutoriel, vous avez utilisé deux backends différents : Terraform Cloud, qui est l’offre cloud gérée par Hashicorp pour Terraform ; et pg, qui vous permet de stocker l’état du projet dans une base de données PostgreSQL. Vous avez utilisé une base de données PostgreSQL gérée par DigitalOcean, que vous pouvez provisionner et utiliser avec Terraform en quelques minutes.

Pour plus d’informations sur les fonctionnalités de Terraform Cloud, visitez la documentation officielle.

Ce tutoriel fait partie de la série Comment gérer l’infrastructure avec Terraform. La série couvre plusieurs sujets Terraform, de l’installation de Terraform pour la première fois à la gestion de projets complexes.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-within-your-team