Passer au contenu principal

Introduction (Terraform)

Terraform et l'Infrastructure as Code

Provisionner un serveur à la main, c'est rapide pour un. Pour dix, c'est du copier-coller. Pour cent, c'est une source permanente de divergence entre les environnements. L'Infrastructure as Code (IaC) résout ce problème en décrivant l'infrastructure dans des fichiers versionnables, reproductibles et auditables.

Qu'est-ce que l'Infrastructure as Code

L'IaC traite l'infrastructure comme du code source : elle est décrite dans des fichiers texte, versionnée dans Git, revue en pull request, et appliquée via un pipeline automatisé. L'état cible est déclaré, pas scripté : on décrit ce que l'infrastructure doit être, pas les commandes pour y arriver.

Trois propriétés fondamentales :

  • Idempotence : appliquer la configuration deux fois produit le même résultat.
  • Reproductibilité : recréer un environnement identique à partir du code source.
  • Traçabilité : l'historique Git est l'historique de l'infrastructure.

Terraform dans l'écosystème IaC

Plusieurs outils coexistent, avec des philosophies différentes :

  • Terraform / OpenTofu : déclaratif, multi-provider, state explicite. Le standard de facto pour le provisioning d'infrastructure cloud et on-premise.
  • Ansible : procédural/déclaratif, orienté gestion de configuration et déploiement applicatif. Complémentaire à Terraform, pas concurrent.
  • CloudFormation : déclaratif, AWS uniquement. Puissant dans l'écosystème AWS, inexploitable ailleurs.
  • Pulumi : IaC en langages de programmation classiques (Python, Go, TypeScript). Alternative à HCL pour les équipes qui préfèrent un vrai langage.

Terraform et Ansible sont souvent utilisés ensemble : Terraform provisionne l'infrastructure (VM, réseau, DNS, stockage), Ansible configure les OS et déploie les applications.

HCL : HashiCorp Configuration Language

Terraform utilise HCL, un langage déclaratif conçu pour être lisible par les humains et parseable par les machines. Syntaxe de base :

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"

  tags = {
    Name        = "web-server"
    Environment = "prod"
  }
}

variable "instance_type" {
  type    = string
  default = "t3.micro"
}

output "public_ip" {
  value = aws_instance.web.public_ip
}

HCL ressemble à JSON mais est bien plus lisible : pas de guillemets obligatoires sur les clés, commentaires avec #, interpolation de variables avec ${}.

OpenTofu : le fork open-source

En 2023, HashiCorp a changé la licence de Terraform de Mozilla Public License (open-source) vers Business Source License (propriétaire au-delà d'un certain usage). La communauté a répondu avec OpenTofu, un fork open-source maintenu par la Linux Foundation. OpenTofu est compatible HCL avec Terraform 1.5, les deux outils évoluent désormais en parallèle. Les concepts de cette formation s'appliquent aux deux.