Terraform 37: Terraform Módulos 5: El repo de módulos comunes
easy⏱ 5 mincourseterraform
Un repo, muchos módulos reutilizables
Un repo terraform-common agrupa módulos por proveedor/tema (azure/tags, azure/monitoring, azure/key-vault). Los servicios los consumen por source de git con un ?ref= fijado, así un arreglo a tags se propaga solo cuando cada servicio sube su ref — propagación controlada y revisable.
# a shared tags module lives at terraform-common//azure/tags
module "tags" {
source = "git::https://git.example.com/myorg/terraform-common.git//azure/tags?ref=v1.4.0"
# per-service overrides on top of the org defaults
tags = {
Service = "orders"
Owner = "orders-team@myorg.example"
}
}
# every resource then reuses the merged set
resource "azurerm_resource_group" "rg" {
name = "myorg-orders-dev-rg"
location = "westus2"
tags = module.tags.tags
}
El módulo dueño del estándar; el invocador solo overridea
Dentro del módulo tags, merge(local.base_tags, var.tags) superpone los overrides del invocador sobre los defaults de la organización. El conjunto base (ManagedBy = terraform, departamento, centro de costos) se define una sola vez, de forma central — los invocadores pasan solo lo específico suyo.
# terraform-common//azure/tags/main.tf
locals {
base_tags = {
ManagedBy = "terraform"
Department = "platform"
CostCenter = "cc-1000"
}
tags = merge(local.base_tags, var.tags)
}
output "tags" {
value = local.tags
}
Versioná el repo común como una librería
Tratá terraform-common como una librería publicada: etiquetá releases (v1.4.0), mantené un changelog y nunca hagas force-push a un tag. Un consumidor fijado a v1.4.0 debe obtener el mismo código de módulo, byte por byte, para siempre — eso hace los planes reproducibles entre equipos.
Implementá la fusión de tags
Reflejá el merge(base_tags, overrides) del módulo: escribí buildTags(overrides) que parta de { ManagedBy: "terraform", Department: "platform" } y deje que overrides gane en conflictos. Logueá JSON.stringify(buildTags({ Service: "orders", Department: "payments" })) — ManagedBy sigue terraform, Department pasa a payments.