Aller au contenu

Fondamentaux OpenTofu

Providers, resources, data sources, variables et outputs : les briques de base de l'IaC.


Qu'est-ce qu'OpenTofu

OpenTofu est un fork open source de Terraform, maintenu par la Linux Foundation. Il utilise le langage HCL pour décrire l'infrastructure de manière declarative. OpenTofu est compatible avec les providers et modules Terraform existants.

Workflow

tofu init      # Telecharger les providers et initialiser le backend
tofu plan      # Previsualiser les changements
tofu apply     # Appliquer les changements
tofu destroy   # Supprimer toutes les ressources

Providers

Les providers sont des plugins qui permettent à OpenTofu d'interagir avec les APIs des services cloud et outils.

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

provider "google" {
  project = var.project_id
  region  = "europe-west1"
}

Bloc terraform

OpenTofu utilise le bloc terraform (pas opentofu) pour la compatibilité avec l'écosystème Terraform existant.

Resources

Une resource représenté un objet d'infrastructure a créer et gérer.

resource "google_compute_instance" "webserver" {
  name         = "webserver-01"
  machine_type = "e2-medium"
  zone         = "europe-west1-b"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }

  network_interface {
    network = "default"
    access_config {}  # IP publique
  }

  tags = ["http-server"]
}

Data sources

Les data sources permettent de lire des informations existantes sans les gérer.

data "google_compute_image" "debian" {
  family  = "debian-12"
  project = "debian-cloud"
}

resource "google_compute_instance" "webserver" {
  # ...
  boot_disk {
    initialize_params {
      image = data.google_compute_image.debian.self_link
    }
  }
}

Variables

# variables.tf
variable "project_id" {
  type        = string
  description = "ID du projet GCP"
}

variable "environment" {
  type    = string
  default = "dev"
  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "Environment doit etre dev, staging ou prod."
  }
}

variable "instance_count" {
  type    = number
  default = 1
}

Fichier de valeurs :

# terraform.tfvars
project_id  = "my-project"
environment = "prod"

Outputs

Les outputs exposent des valeurs après tofu apply.

# outputs.tf
output "instance_ip" {
  value       = google_compute_instance.webserver.network_interface[0].access_config[0].nat_ip
  description = "IP publique du serveur web"
}

output "instance_name" {
  value = google_compute_instance.webserver.name
}
# Afficher les outputs
tofu output
tofu output instance_ip

Locals

Les locals sont des valeurs calculees internes.

locals {
  common_tags = {
    environment = var.environment
    managed_by  = "opentofu"
    project     = var.project_id
  }
  name_prefix = "${var.project_id}-${var.environment}"
}

Structure de projet recommandee

mon-projet/
├── main.tf           # Resources principales
├── variables.tf      # Declarations de variables
├── outputs.tf        # Outputs
├── providers.tf      # Configuration des providers
├── terraform.tfvars  # Valeurs (gitignore si sensible)
└── versions.tf       # Contraintes de version

Installation

# Linux / macOS
brew install opentofu

# Verification
tofu version

Pour les autres méthodes, consultez la documentation officielle.