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