Passer au contenu principal

Introduction (Terraform)

Installation et configuration

Terraform ne nécessite qu'un binaire unique sur le poste de travail ou le serveur CI. L'installation est simple, mais la gestion des versions mérite attention : les providers et les modules Terraform sont versionnés et une incompatibilité de version peut bloquer un plan.

Installation

# Debian/Ubuntu — dépôt HashiCorp
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

# Vérifier
terraform version

Pour gérer plusieurs versions de Terraform (recommandé en équipe), utiliser tfenv :

git clone https://github.com/tfutils/tfenv.git ~/.tfenv
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

tfenv install 1.7.0
tfenv use 1.7.0
terraform version

Structure d'un projet Terraform

mon-projet/
├── main.tf          # ressources principales
├── variables.tf     # déclaration des variables d'entrée
├── outputs.tf       # valeurs exposées en sortie
├── providers.tf     # configuration des providers
├── versions.tf      # contraintes de versions
├── terraform.tfvars # valeurs des variables (hors git si secrets)
└── .terraform.lock.hcl  # lockfile des providers (à versionner)

versions.tf : contraintes de versions

terraform {
  required_version = ">= 1.6.0, < 2.0.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
    proxmox = {
      source  = "bpg/proxmox"
      version = ">= 0.50.0"
    }
  }
}

Le fichier .terraform.lock.hcl est généré par terraform init et fixe les versions exactes des providers téléchargés. Il doit être versionné dans Git pour garantir la reproductibilité entre les membres de l'équipe.

providers.tf : configuration du provider

provider "aws" {
  region = var.aws_region

  default_tags {
    tags = {
      ManagedBy   = "terraform"
      Environment = var.environment
    }
  }
}

provider "proxmox" {
  endpoint = var.proxmox_url
  username = var.proxmox_user
  password = var.proxmox_password
  insecure = false
}

Variables et tfvars

# variables.tf
variable "aws_region" {
  type        = string
  description = "Région AWS cible"
  default     = "eu-west-1"
}

variable "environment" {
  type        = string
  description = "Environnement (prod, staging, dev)"
  validation {
    condition     = contains(["prod", "staging", "dev"], var.environment)
    error_message = "L'environnement doit être prod, staging ou dev."
  }
}
# terraform.tfvars
aws_region  = "eu-west-1"
environment = "prod"
# Utiliser un fichier tfvars alternatif
terraform plan -var-file="prod.tfvars"

# Passer une variable en ligne de commande
terraform plan -var="environment=staging"

Autocomplétion

terraform -install-autocomplete
# Recharger le shell
exec $SHELL