RousselTMLEARNING

Automatisation

Le langage HCL : ressources, variables, sorties, données et expressions

Écrire du Terraform : blocs terraform, provider, resource et data, variables typées avec validation, locals, outputs, expressions, fonctions, count, for_each, blocs dynamiques et méta-arguments.

1. Les blocs #

La structure d'une configuration.

Exemple #

Blocs Terraform
L'ordre des fichiers et des blocs n'a pas d'importance.
terraform {
  required_version = ">= 1.7"
  required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } }
}

provider "aws" { region = var.region }

variable "region" {
  type    = string
  default = "eu-west-3"
}

variable "environnement" {
  type = string
  validation {
    condition     = contains(["recette", "prod"], var.environnement)
    error_message = "recette ou prod uniquement."
  }
}

locals {
  etiquettes = { environnement = var.environnement, gere_par = "terraform" }
}

data "aws_availability_zones" "zones" { state = "available" }

resource "aws_s3_bucket" "rapports" {
  bucket = "rapports-${var.environnement}-${random_id.suffixe.hex}"
  tags   = local.etiquettes
}

resource "random_id" "suffixe" { byte_length = 4 }

output "bucket" { value = aws_s3_bucket.rapports.bucket }

2. Répéter des ressources #

count, for_each, dynamic.

count ou for_each ? #

Méta-argumentQuand l'utiliser
countN copies identiques ; adressées par index (fragile si on retire un élément du milieu)
for_eachUne ressource par clé d'une map ou d'un set : adresses stables
variable "files" { default = { facturation = 3, expedition = 5 } }

resource "aws_sqs_queue" "file" {
  for_each                   = var.files
  name                       = "commandes-${each.key}"
  visibility_timeout_seconds = each.value * 10
}

resource "aws_security_group" "web" {
  name = "web"
  dynamic "ingress" {
    for_each = [80, 443]
    content {
      from_port   = ingress.value
      to_port     = ingress.value
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    }
  }
}

3. Expressions et fonctions #

Calculer des valeurs.

Utiles #

BesoinExemple
Conditionnellevar.env == "prod" ? 3 : 1
Boucle for[for z in data.aws_availability_zones.zones.names : upper(z)]
Fusion de mapsmerge(local.etiquettes, { role = "web" })
Encodagejsonencode({...}), yamldecode(file("x.yaml"))
Modèle de fichiertemplatefile("init.sh.tftpl", { port = 8080 })
terraform console
> cidrsubnet("10.0.0.0/16", 8, 2)
"10.0.2.0/24"
> [for i in range(3) : "web-${i}"]

Articles liés

Terraform : principes, architecture et flux de travail

Comprendre Terraform : infrastructure as code déclarative, architecture (cœur, fournisseurs, état), flux init…

L'état Terraform : backends distants, verrouillage, import et refactorisation

Gérer l'état Terraform : rôle du fichier d'état, données sensibles, backends distants (S3, azurerm, gcs, HCP …

Les modules Terraform : concevoir, versionner et réutiliser

Structurer Terraform avec des modules : module racine et modules enfants, entrées et sorties, sources (local,…

Pour aller plus loin

Soutenir

♥ SOUTENIR

Soutenez RousselTM Learning

Les formations, articles, TP et attestations restent gratuits et sans publicité intrusive. Une contribution libre, du montant de votre choix, finance l’hébergement, les environnements de TP et l’écriture de nouveaux contenus.

Contribuer avec PayPal Montant libre · carte bancaire ou compte PayPalEn savoir plus
QR code PayPal
Ou scannez ce QR code avec votre téléphone

Merci, chaque contribution compte !