Introdução
Imagine que você está pedindo um café. Se o cardápio disser apenas "Café", talvez você receba café preto todas as vezes. Mas, se o cardápio oferecer opções como "Tamanho" ou "Tipo de leite", você poderá personalizar o pedido sem que o barista precise aprender uma receita nova para cada combinação.
No Terraform, as variáveis tornam as configurações reutilizáveis, permitindo alterar os valores de entrada sem reescrever o arquivo inteiro.
Os valores de saída permitem que o Terraform informe valores importantes gerados após a execução, como IDs, nomes ou endereços. Juntos, variáveis e valores de saída tornam as configurações do Terraform mais modulares e práticas.
Ao final deste laboratório, você terá uma configuração flexível do Terraform capaz de criar contêineres com nomes diferentes conforme a necessidade.
As variáveis separam a lógica da configuração dos dados específicos de cada ambiente. Os valores de saída fazem o caminho inverso: publicam valores úteis gerados pela execução para o usuário ou para uma automação posterior.
Criar o arquivo de variáveis
Bons chefs organizam os ingredientes antes de começar a cozinhar. No Terraform, é uma boa prática manter suas opções personalizadas (variáveis) em um arquivo separado da receita principal.
O nome padrão desse arquivo é variables.tf. Criá-lo não altera o funcionamento do Terraform: ele lê todos os arquivos .tf da pasta como se fossem um único arquivo. Ainda assim, separar os arquivos ajuda a manter tudo organizado.
Esse princípio de organização é importante em IaC porque as configurações reais crescem rapidamente. Separar claramente variáveis, recursos e valores de saída facilita muito a manutenção posterior.
Acesse a pasta do projeto e crie esse arquivo.
cd ~/project
touch variables.tf
Agora temos um arquivo vazio pronto para receber nossas definições. Na próxima etapa, adicionaremos conteúdo a ele.
Definir uma variável
Agora precisamos declarar quais opções estão disponíveis. É como adicionar um campo "Nome" a um formulário de pedido.
Abra variables.tf usando nano:
nano variables.tf
Adicione este bloco. Ele informa ao Terraform: "Existe uma opção chamada container_name, ela aceita texto (string) e, se o usuário não informar nada, use o nome 'ExampleNginxContainer'."
variable "container_name" {
description = "Value of the name for the Docker container"
type = string
default = "ExampleNginxContainer"
}
Salve e saia do nano (Ctrl+O, Enter, Ctrl+X).
Agora que o campo do formulário existe, precisamos usá-lo em nossa receita. Criaremos um arquivo main.tf que usará essa variável.
Crie main.tf:
nano main.tf
Cole o código a seguir. Preste atenção a name = var.container_name. É assim que inserimos a variável na configuração.
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.1"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
name = var.container_name
ports {
internal = 80
external = 8000
}
}
Lembre-se de salvar e sair do nano.
Ao usar var.container_name, estamos dizendo: "Não use um nome fixo; consulte o valor armazenado na variável container_name e use-o."
Definir valores de saída
Quando você compra algo, recebe um recibo. No Terraform, os valores de saída funcionam como esse recibo: eles mostram detalhes importantes sobre o que acabou de ser criado.
Isso é muito útil para obter informações que não poderiam ser conhecidas antes da criação do recurso, como um ID aleatório atribuído pelo sistema ou um endereço IP público.
Os valores de saída são especialmente úteis quando uma parte da infraestrutura precisa fornecer informações a um operador humano, a outro módulo do Terraform ou a uma etapa posterior de automação.
Vamos criar um arquivo chamado outputs.tf para organizar esses valores retornados. Abra-o com nano:
nano outputs.tf
Adicione este bloco. Ele informa ao Terraform: "Quando terminar, exiba o ID do contêiner nginx."
output "container_id" {
description = "ID of the Docker container"
value = docker_container.nginx.id
}
Salve e saia do nano.
Agora vamos executar nosso código!
Primeiro, inicialize o projeto. Essa etapa baixa o provider do Docker:
terraform init
Em seguida, aplique a configuração. Não especificaremos um nome para o contêiner, portanto o valor padrão (ExampleNginxContainer) será usado. Usamos -auto-approve para ignorar a confirmação "yes" e economizar tempo.
terraform apply -auto-approve
Observe a parte final da saída. Você deverá ver Outputs:, seguido de container_id.
Substituir valores de variáveis
O verdadeiro poder das variáveis está em alterá-las sem reescrever o código. Imagine que você queira iniciar um segundo contêiner com um nome diferente. Não é necessário editar main.tf.
Você pode simplesmente informar ao Terraform que deseja substituir o valor padrão usando a opção -var. É como dizer ao barista: "Na verdade, faça esse pedido no tamanho Large."
Execute este comando:
terraform apply -var="container_name=MyDynamicContainer" -auto-approve
Observe atentamente a saída. O Terraform informará: docker_container.nginx must be replaced.
Por quê? No Docker, não é fácil renomear um contêiner em execução. Para alterar o nome, o Terraform decide que precisa Destruir o contêiner antigo (-) e Criar um novo (+) com o novo nome. Esse é um princípio importante da infraestrutura imutável: substituímos os recursos em vez de fazer alterações pontuais neles.
Verifique se o novo contêiner está em execução:
docker ps --format "{{.Names}}"
Você deverá ver MyDynamicContainer.
Resumo
Parabéns! Você tornou seu código do Terraform dinâmico com sucesso.
Neste laboratório, você aprendeu:
- Variáveis: como usar
variables.tfpara criar "campos de formulário" flexíveis no código. - Referência: como usar
var.variable_namepara inserir esses valores na configuração principal. - Valores de saída: como usar
outputs.tfpara exibir dados importantes (o "recibo") após uma execução. - Substituições: como informar novos valores pela linha de comando usando
-var, permitindo reutilizar o mesmo código em situações diferentes.



