O Terraform não é exclusivo para cloud, os providers local e null permitem provisionar recursos no sistema de arquivos local e executar scripts, sendo úteis para testes, geração de arquivos de configuração e automações.
Provider local
Gerencia arquivos e diretórios no sistema de arquivos:
terraform {
required_providers {
local = {
source = "hashicorp/local"
version = "~> 2.0"
}
}
}
# Cria um arquivo local
resource "local_file" "config" {
filename = "${path.module}/output/config.json"
content = jsonencode({
ambiente = var.ambiente
versao = "1.0.0"
debug = var.ambiente != "prod"
})
}
# Lê um arquivo existente (data source)
data "local_file" "secrets" {
filename = "${path.module}/secrets.txt"
}Provider null
O null_resource executa provisioners sem criar nenhum recurso real na infraestrutura:
terraform {
required_providers {
null = {
source = "hashicorp/null"
version = "~> 3.0"
}
}
}
resource "null_resource" "setup_banco" {
provisioner "local-exec" {
command = "psql -h ${var.db_host} -U admin -f ./migrations/setup.sql"
}
# Re-executa se o hash do script mudar
triggers = {
script_hash = filemd5("${path.module}/migrations/setup.sql")
}
}Exemplo completo: gerador de configuração por ambiente
# main.tf
variable "ambientes" {
default = ["dev", "staging", "prod"]
}
variable "db_hosts" {
type = map(string)
default = {
dev = "localhost:5432"
staging = "staging-db.interno:5432"
prod = "prod-db.interno:5432"
}
}
resource "local_file" "configs" {
for_each = toset(var.ambientes)
filename = "${path.module}/configs/${each.key}.env"
content = <<-EOT
AMBIENTE=${each.key}
DB_HOST=${var.db_hosts[each.key]}
DEBUG=${each.key != "prod" ? "true" : "false"}
EOT
}
output "arquivos_gerados" {
value = [for f in local_file.configs : f.filename]
}Após terraform apply, os arquivos configs/dev.env, configs/staging.env e configs/prod.env são criados.
Quando usar localmente
- Prototipagem de módulos antes de apontar para cloud real
- Geração de arquivos de configuração como parte de um pipeline CI/CD
- Execução de scripts de migração/setup junto ao provisionamento de infraestrutura
Ver também: terraform-providers | terraform-resources | terraform