Workbook Terraform - Ton guide d'Infra as Code (IaC)

Un compagnon pour créer et exécuter facilement des projets Terraform. Il fournit des explications simples et des exemples de contenu pour les fichiers Terraform courants, des liens utiles vers la documentation associée ainsi que des commandes de gestion essentielles.

Workbook Terraform - Ton guide d'Infra as Code (IaC)
Photo par Chris Karidis / Unsplash

Fichiers d'un projets Terraform

  • vars.tf - déclarations de variables par défaut
  • terraform.tfvars - définir ou remplacer les valeurs des variables par défaut
  • terraform.tf - déclarations des providers et backends pour le tfstate
  • version.tf - contraintes de version de Terraform
  • .terraform.lock.hcl - représente un snapshot des dépendances installées pour votre projet Terraform (essentiellement les versions des providers). Généré pour la première fois à l'initialisation de Terraform, ce fichier doit également être placé dans votre système de versioning de code source (Git par exemple) pour garantir que les autres utilisateurs utilisent les mêmes versions de providers.

Un projet Terraform contient également d'autres fichiers correctement nommés (par exemple, network.tf, database.tf, etc.) selon votre activité. Dans ces fichiers, vous utilisez des « modules » ou des « ressources » fournies par des providers spécifiques pour gérer votre infrastructure :

Exemple de fichier vars.tf

Contient les déclarations de variables par défaut.

# Default variables declarations

# String
variable "env" {
  type    = string

  # Optionally set a description
  description = "Environment of the platform"

  # Optionally set a default value
  default = "staging"

  # Redact value from Terraform CLI log output
  sensitive = true

  # Mask the variable from plan outputs 
  # and do not store it in tfstate
  ephemeral = true
}

# Map of string or object
variable "machine" {
  type = map(string)
  description = "Machine characteristics"
  default = {
    "machine_type"   = "e2-highmem-2"
    "image"          = "ubuntu-os-cloud/ubuntu-2404-lts"
    "data_disk_type" = "pd-standard"
  }
}

# "machine" variable is an object of string.
# We could also declare that variable as follows:

variable "machine" {
  type = object({
    machine_type   = string
    image          = string
    data_disk_type = string
  })

  # optionally set default values
  default = {
    machine_type   = "e2-highmem-2"
    image          = "ubuntu-os-cloud/ubuntu-2404-lts"
    disk_type      = "pd-standard"
  }
}

Exemple de fichier terraform.tvars

Utilisé pour définir ou remplacer les valeurs des variables par défaut.

# Set or override default variables values

# Override string type variables
env = "prod"

# Override map or object type variables
machine = {
  machine_type   = "e2-highmem-4"
  image          = "ubuntu-os-cloud/ubuntu-2404-lts"
  disk_type      = "pd-ssd"
}

Exemple de fichier terraform.tf

Contient le déclaration des providers Terraform ainsi que des backends pour stocker le tfstate.

Fichier Terraform.tf pour Microsoft Azure

# Tfstate backends and providers declarations (Azure)

terraform {
  backend "azstorageaccount" {
    storage_account_name = "my-azure-storage-account"
    container_name       = "tfstate"
    key                  = "prod.my-project.tfstate"
  }

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.46.0"
    }
  }

  provider "azurerm" {
    subscription_id = var.azure_subscription_id
    features {}
  }
}

Fichier Terraform.tf pour Google Cloud

# Tfstate backends and providers declarations (Google Cloud)

terraform {
  backend "gcloudstorage" {
    bucket = "mybucket"
    prefix = "myproject/prod"
  }

  required_providers {
    google = {
      source = "hashicorp/google"
      version = "~> 7.4.0"
    }
  }

  provider "google" {
    project = var.google_project_id
  }
}

Exemple de fichier version.tf

Contient des contraintes pour la version Terraform.

# Terraform version constraints

terraform {
  required_version = "~> 1.9"
}

Fichier de ressources Terraform

Nous y déclarons les ressources de l'infrastructure que Terraform va créer (machines virtuelles, bases de données gérées, etc.).

# File where you use modules or providers resources
# to create your infrastructure components

resource "google_sql_database_instance" "cloudsql-postgresql" {
(...)
  name     = "my-database-${var.env}"
  project  = var.gcp_project_id

  # Get value from the postgredb map(string) or object
  # type variable containing version as one of the keys
  database_version = var.postgredb.version

  # Set deletion_protection param value to true if
  # var.env value is "prod" otherwise set to false
  deletion_protection = var.env == "prod" ? true : false
(...)
}

Exécution de Terraform

Installation

Pour installer Terraform, jetez un œil à Installer Terraform.

Vous pouvez également utiliser la commutateur tf utilitaire pour faciliter le processus d'installation et de basculement entre différentes versions de Terraform :

# Installing the latest tfswitch version on Linux
# This will deploy the tfswitch binary at /usr/local/bin/tfswitch

# Be root in order to write to /usr/local/bin/
sudo su 

# Deploy tfswitch binary at /usr/local/bin/
curl -L https://raw.githubusercontent.com/warrensbox/terraform-switcher/master/install.sh | bash

# Go back to standard user
exit

# Run tfswitch and choose the Terraform version you want
tfswitch

# Configure your shell to find the newly
# installed terraform binaries for execution
export PATH="$PATH:${HOME}/bin"
bash # or invok your other shell (sh, zsh, etc)

# Verify
terraform version

Initialisation de Terraform

# Initialize the working directory

$ terraform init

Initializing the backend...
Initializing modules...
Initializing provider plugins...
- Reusing previous version of hashicorp/azurerm from the dependency lock file
- Using previously-installed hashicorp/azurerm v4.46.0

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see 
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

Tâches de lancement requises avant de pouvoir créer ou mettre à jour l'infrastructure :

  • Initialiser le backend : garantit l'accessibilité du fichier tfstate. Ce fichier peut être stocké localement ou à distance, selon votre cofiguration de backend .
  • Initialiser les modules : garantit que les modules Terraform que vous avez déclarés sont accessibles et disponibles localement
  • Initialiser les plugins des providers : garantit que les binaires des plugins des providers requis que vous avez déclarés sont accessibles et disponibles localement

Les prérequis téléchargés (modules, providers, etc.) seront disponibles dans le répertoire « .terraform ». Assurez-vous que votre système de versioning de code source les ignorent.

Terraform init reconfigure

# Reconfigure the backend
terraform init -reconfigure

Exécutez ceci lorsque vous apportez des modifications à la configuration du backend (nouveau chemin pour le tfstate ou modification du stockage distant).

Terraform init upgrade

# Upgrade providers versions and update the lock file
terraform init -upgrade

Vous pouvez éventuellement mettre à jour la version des plugins des providers en fonction des contraintes de version déclarées en utilisant l'option « -upgrade ». Le fichier de verrouillage de version « .terraform.lock.hcl » sera mis à jour en conséquence.

Terraform plan and apply

# Show the changes Terraform will make
terraform plan

# Apply the changes. Will again show you what
# will be performed and ask for a confirmation (yes or no)
terraform apply

Vous pouvez éventuellement afficher ou appliquer des modifications uniquement à des ressources spécifiques en utilisant l'option « -target ». Voici un exemple :

# Target specific resources for plan or apply
terraform plan -target=google_compute_instance.myinstance
terraform apply -target=google_compute_instance.myinstance

Manipulation du fichier d'état Terraform (tfstate)

# List resources inside Terraform state
terraform state list

# Show specific resources configurations from Terraform state
terraform state show <resource_id>

# Remove specific resources from Terraform state
terraform state rm <resource_id>

Déverrouillage forcé de Terraform

Parfois, il peut être utile de déverrouiller volontairement le fichier d'état de Terraform, par exemple après une exécution précédente qui ne s'est pas terminée correctement ou pour toute autre raison légitime.

Si le fichier d'état Terraform est verrouillé et que vous exécutez « terraform plan » ou « terraform apply », Terraform vous indiquera que le fichier d'état est verrouillé et vous donnera l'ID de verrouillage.

Pour déverrouiller le fichier d’état, exécutez simplement ceci :

terraform force-unlock -force <lock_id>

Terraform taint

Si vous souhaitez que Terraform considère qu'une ressource spécifique doit être détruite et recréée, vous pouvez utiliser la commande taint comme suit :

# Taint a resource : tell Terraform that a 
# resource should be destroyed and recreated
terraform taint <resource_id>

# Untaint the resource
terraform untaint <resource_id>

Vous souhaitez signaler une erreur, poser une question ou suggérer une amélioration ? N'hésitez pas à m'envoyer un e-mail à gmkziz@hackerstack.org.

Si vous aimez mes articles, pensez à vous inscrire à ma newsletter afin de recevoir les derniers articles dès qu'ils sont disponibles.

Prenez soin de vous, continuez à apprendre et à bientôt pour le prochain post 🚀