Gerenciamento do estado

DockerBeginner
Pratique Agora

Introdução

Nos laboratórios anteriores, você atuou como o Chef, escrevendo cardápios (configurações) para o Robô (Terraform) preparar (criar). Mas como o robô se lembra do que já preparou?

Imagine que você tivesse um depósito, mas perdesse a lista de inventário. Você não saberia o que tem, onde está cada item nem se algo foi roubado.

No Terraform, essa lista de inventário é chamada de estado. Ela é a memória do Terraform. O estado registra os recursos que ele criou e relaciona os objetos da configuração aos objetos reais da infraestrutura.

O estado é o que torna prática a administração declarativa. Sem ele, o Terraform poderia ler seus arquivos, mas não teria uma memória confiável para saber quais objetos reais correspondem a essas declarações.

O estado é uma das ideias mais importantes do Terraform. Sem ele, o Terraform não saberia o que já existe, o que mudou nem o que precisa ser atualizado ou recriado.

Neste laboratório, você verá como o Terraform usa esse estado para manter sua infraestrutura íntegra. Você assumirá o papel do "Caos", causando problemas manualmente, e observará o Terraform detectar o dano e "curar" o sistema automaticamente.

Inspecionar o estado

Este ambiente já foi pré-configurado. Existe um arquivo main.tf, e terraform apply já foi executado. Isso significa que a infraestrutura — um contêiner Docker — já está em execução.

Primeiro, confirme se o contêiner está em execução:

sudo docker ps

Você deverá ver um contêiner chamado tutorial.

Agora, liste os arquivos do diretório atual. Você verá terraform.tfstate.

ls -l

Esse arquivo é o "Diário Secreto" do Terraform. Ele registra tudo o que o Terraform faz. Vamos consultar seu conteúdo.

cat terraform.tfstate

A saída está em um formato chamado JSON. No início, ela pode parecer complicada, mas é apenas uma forma estruturada de registrar informações para os computadores.

Em algum trecho desse texto, você verá docker_container e o ID do contêiner em execução. Isso comprova que o Terraform "conhece" esse contêiner específico.

Regra crítica: nunca edite esse arquivo manualmente. Se você alterá-lo, o Terraform pode perder informações e acabar excluindo ou corrompendo sua infraestrutura por engano. Sempre deixe o Terraform gerenciar o próprio diário.

Esse aviso é importante porque o estado contém metadados autoritativos, e não apenas um registro de atividades. Se ele for corrompido, o Terraform poderá tomar decisões destrutivas ou confusas mais tarde.

Criar um desvio

O Terraform espera ser o único responsável por gerenciar esses recursos. Mas, no mundo real, problemas acontecem. Talvez um servidor falhe ou um colega exclua algo manualmente por engano.

Essa situação é chamada de desvio. Isso significa que a "Realidade" não corresponde mais ao "Plano".

Desvios são comuns em ambientes compartilhados porque pessoas, scripts, falhas e sistemas externos podem alterar a infraestrutura fora do ciclo normal de controle do Terraform.

Vamos causar um pouco de caos. Vamos ignorar o Terraform e excluir o contêiner diretamente usando comandos do Docker.

sudo docker rm -f tutorial

Confirme que o contêiner realmente foi removido:

sudo docker ps

Neste momento, temos um problema:

  • Realidade: o contêiner está parado e foi removido.
  • Arquivo de estado: o Terraform acredita que o contêiner ainda está ativo, porque ninguém informou o contrário.

Detectar o desvio

Agora, vamos verificar se o Terraform percebe a remoção.

Quando você executa terraform plan, a primeira coisa que o Terraform faz é uma "atualização" (Refresh). Ele consulta o Docker e pergunta: "O contêiner com o ID XYZ ainda existe?"

Execute o comando de planejamento:

terraform plan

Observe atentamente a saída. Você deverá ver: docker_container.nginx: Refreshing state...

Em seguida, o Terraform exibirá um plano com um sinal de + verde, indicando uma criação.

Terraform will perform the following actions:

  ## docker_container.nginx will be created
  + resource "docker_container" "nginx" { ... }

O Terraform descobriu o problema! Ele raciocinou: "Meu plano diz que deveria existir um contêiner. A realidade diz que não existe nenhum. Portanto, preciso criar um novo contêiner para alcançar o estado desejado."

Esse comportamento de reconciliação é uma das propriedades operacionais mais importantes do Terraform. Ele compara o estado desejado, o estado registrado e a realidade atual para decidir qual correção é necessária.

Recuperar a infraestrutura

Essa é a capacidade de "autocorreção" da Infraestrutura como Código. Como nosso código define o Estado Desejado — um contêiner em execução —, o Terraform pode corrigir automaticamente qualquer desvio que ocorra.

Execute apply para corrigir o problema:

terraform apply

Digite yes quando for solicitado.

Quando a execução terminar, verifique o Docker novamente:

sudo docker ps

O contêiner voltou! Talvez ele tenha um novo ID e seja uma nova instância, mas, funcionalmente, sua infraestrutura voltou a ficar exatamente como foi definida no blueprint.

Resumo

Neste laboratório, você testemunhou o poder do estado.

Você aprendeu:

  • O arquivo de estado: a memória do Terraform sobre o que existe (terraform.tfstate).
  • Detecção de desvios: como o Terraform percebe quando algo muda sem que ele seja informado, como em uma exclusão manual.
  • Autocorreção: como terraform apply restaura automaticamente os recursos ausentes para que correspondam ao seu código.

É por isso que o Terraform é confiável para gerenciar infraestruturas críticas. Mesmo quando ocorrem desastres, o Terraform ajuda você a retornar rapidamente a um estado conhecido e íntegro.