Pourquoi les modules ?
Un module est un ensemble de fichiers .tf reutilisables. C'est l'equivalent d'une fonction pour l'infrastructure.
Structure d'un module
modules/
└── web-server/
├── main.tf # Ressources du module
├── variables.tf # Entrees du module
└── outputs.tf # Sorties du module
Definir un module
# modules/web-server/variables.tf
variable "name" {
type = string
}
variable "instance_type" {
type = string
default = "t2.micro"
}
# modules/web-server/main.tf
resource "aws_instance" "this" {
ami = data.aws_ami.ubuntu.id
instance_type = var.instance_type
tags = { Name = var.name }
}
# modules/web-server/outputs.tf
output "instance_id" {
value = aws_instance.this.id
}
output "public_ip" {
value = aws_instance.this.public_ip
}
Utiliser un module
# main.tf (racine du projet)
module "web_dev" {
source = "./modules/web-server"
name = "web-dev"
instance_type = "t2.micro"
}
module "web_prod" {
source = "./modules/web-server"
name = "web-prod"
instance_type = "t2.large"
}
output "dev_ip" {
value = module.web_dev.public_ip
}
output "prod_ip" {
value = module.web_prod.public_ip
}
Sources de modules
# Module local
source = "./modules/web-server"
# Module du registry
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
# Module Git
source = "git::https://gitlab.com/mon-org/modules.git//web-server"
Bonne pratique : Creez un module des qu'un pattern se repete 2+ fois. Versionnez vos modules dans un repo Git dedie.