Sintaxe e Conceitos Essenciais do Terraform
Arquivos de Configuração do Terraform
Os arquivos de configuração do Terraform suportam dois formatos principais: HCL (HashiCorp Configuration Language) e JSON. O formato HCL utiliza a extensão .tf, enquanto o JSON usa .tf.json. O HCL é mais legível para humanos, suporta comentários com // e é o formato recomendado para a maioria dos projetos. O formato JSON é frequentemente gerado ou manipulado por ferramentas, mas também pode ser editado manualmente. As configurações do Terraform são declaartivas, o que significa que referências a outros recursos e variáveis não dependem da ordem de definição.
Providers no Terraform
Os proviedrs são plugins que permitem ao Terraform interagir com APIs de provedores de nuvem ou outros serviços. Cada provider expõe recursos e fontes de dados específicos. É necessário declarar os providers no bloco required_providers, especificando sua origem e versão. A configuração de um provider envolve definir um bloco provider com parâmetros como credenciais e regiões. É possível configurar múltiplas instâncias do mesmo provider usando alias, permitindo, por exemplo, gerenciar recursos em diferentes regiões de um provedor.
Recursos (Resources)
Um recurso representa um componente de infraestrutura, como uma instância de computação ou um registro DNS. Recursos são definidos com a palavra-chave resource, seguida por um tipo e um nome local. Os atributos do recurso são configurados dentro do bloco para descrever suas propriedades. O nome do recurso deve começar com uma letra ou sublinhado e pode conter apenas caracteres alfanuméricos, sublinhados e travessões. Referências a atributos seguem o padrão resource.<nome>.<atributo>.
Fontes de Dados (Data Sources)
As fontes de dados permitem consultar informações sobre recursos existentes sem criá-los ou gerenciá-los. Elas são definidas com a palavra-chave data e permitem filtrar dados para uso em outras partes da configuração. É uma boa prática manter fontes de dados em arquivos seaprados quando há muitas consultas.
Expressões no Terraform
O Terraform inclui várias expressões para manipulação de dados. Expressões condicionais seguem o formato condição ? valor_verdadeiro : valor_falso. Expressões for permitem iterar sobre coleções para transformar dados, como listas ou mapas. A expressão splat oferece uma maneira simplificada de acessar atributos de listas de objetos.
Exemplos Práticos
Considere os seguintes arquivos de configuração para demonstrar variáveis, valores e saídas.
variables.tf
variable "area" {
type = string
description = "Define o nome da região"
}
variable "responsavel" {
type = string
description = "Define o nome do responsável"
}
variable "ambientes" {
type = list(string)
description = "Define a lista de ambientes"
}
variable "registros_dns" {
type = map(string)
description = "Define mapeamento de nomes DNS"
}
variable "especificacoes_ecs" {
type = list(map(string))
}
terraform.tfvars
area = "sao-paulo"
responsavel = ""
ambientes = ["desenvolvimento", "teste", "homologacao", "producao"]
registros_dns = {
"desenvolvimento" = "dev.example.com",
"teste" = "test.example.com",
"homologacao" = "staging.example.com",
"producao" = "prod.example.com"
}
especificacoes_ecs = [{
"nome" = "servidor01",
"sistema" = "linux"
}, {
"nome" = "servidor02",
"sistema" = "windows"
}]
output.tf
output "area_selecionada" {
value = var.area != "" ? var.area : "riodejaneiro"
}
output "responsavel_padrao" {
value = var.responsavel != "" ? var.responsavel : "admin"
}
output "lista_ambientes" {
value = var.ambientes
}
// Uso de expressão for para iterar sobre uma lista
output "ambientes_formatados" {
value = [for item in var.ambientes : "${item}"]
}
// Uso de expressão for com índice para lista
output "ambientes_com_indice" {
value = [for idx, item in var.ambientes : "${idx}-${item}"]
}
output "mapa_dns" {
value = var.registros_dns
}
// Uso de expressão for para iterar sobre um mapa
output "dns_formatado" {
value = [for chave, valor in var.registros_dns : "${chave} : ${valor}"]
}
output "lista_ecs" {
value = var.especificacoes_ecs
}
// Uso de expressão splat para acessar atributos
output "nomes_ecs" {
value = var.especificacoes_ecs[*].nome
}
Ao executar terraform plan, as saídas exibirão os valores processados, demonstrando o uso de expressões condicionais, loops e acesso a dados estruturados.
Módulos no Terraform
Módulos permitem reutilizar configurações, promovendo consistência e reduzindo duplicação de código. Um módulo é um conjunto de arquivos .tf em um diretório. Eles podem ser locais ou remotos. O comando terraform get baixa módulos, e terraform graph visualiza dependências. Referências a saídas de módulos seguem o padrão module.<nome>.<saída>. Módulos podem ser instanciados múltiplas vezes com nomes únicos.