Terraform — Uma pequena introdução

Update [21/03/2021]

Esse conteúdo está um pouco desatualizado. Se você quiser pode acessar uma nova versão aqui e uma explicação extra aqui.

Por fim você pode acompanhar também o curso em vídeo que eu estou colocando no YouTube ou comprar o curso completo la no Udemy!

Introdução

O significado da palavra “terraform” é basicamente modelar um planeta, lua ou qualquer outra estrela para que a atmosfera, temperatura, topografia ou ecologia desse lugar fique similar com o ambiente da Terra.

Terraform é uma ferramenta open source de provisionamento de infraestrutura, criada pela HashiCorp, que permite que definamos nossa infraestrutura como código(IaC), usando uma linguagem simples e declarativa.

Com o Terraform é possível gerenciar nossa infraestrutura entre uma variedade de provedores de nuvem, sejam eles públicos ou privados. Mas tome muito cuidado com essa última frase. Ser é muito diferente de permitir que você migre toda sua infraestrutura de um provedor para o outro de forma simples!

Na versão atual, 0.10, o terraform foi dividido em diversos “plugins” que são baixados de acordo com a necessidade do seu código. Cada um deles permite a integração com um provedor diferente e tem suas peculiaridades em funcionalidades e variam um pouco de sintaxe.

O formato do arquivo que o terraform espera é “.tf” , além do arquivo .tfstate que vamos discutir mais a frente. Diferente de outras ferramentas de IaC, não é preciso se preocupar com a estrutura de pastas, o que é diferente de não organizar seu código, já que o terraform vai compilar todos os arquivos .tf do diretório atual e suas sub pastas, antes de executá-lo.

Nesse post vamos utilizar como provedor apenas a Digital Ocean para passar e entender os estágios de planejamento, criação e destruição de um servidor utilizando o terraform.

Terraform init

A sintaxe para utilizar o Digital Ocean é simples, como de qualquer outro provedor. O terraform se comunica via API com o D.O.(DigitalOcean). Para que isso aconteça corretamente, precisamos adicionar o nosso . Caso não tenha um basta criar aqui. Vamos agora criar nosso arquivo main.tf com o seguinte conteúdo.

provider “digitalocean” {
token = “GwkxhRgYNnrrn6nJN*JNwREGZPdhwftvNDwY”
version = “0.1”
}

É importante adicionar a versão do plugin, caso contrário o terraform sempre fará o download do mais recente, o que pode acabar quebrando seu código em um futuro .

Agora vamos iniciar nosso código, baixando o plugin do provider. Para isso, basta ir até a pasta e executar o comando terraform init .

figura 1 — terraform init

Terraform plan

Agora que já rodamos o init, podemos começar a escrever nosso código para criar o nosso primeiro droplet.

Figura 2 — main.tf

Essa é a sintaxe declarativa do terraform, vamos aproveitar para entender como funciona esse nosso código. Na linha 6 estamos chamando a função e nomeando esse como “web-app-01”. Caso precisemos referenciar esse no código mais pra frente, e vamos precisar, é por esse nome que o referenciaremos. Da linha 7 até a 11, são os seguintes:

  • image = Nome da imagem que deseja utilizar. Esse nome deve ser pego no site da DO, e não um nome qualquer;
  • size = Tamanho da máquina, são pré definidas pela própria DO;
  • name = Esse campo é realmente o nome que daremos a máquina;
  • region = Onde essa máquina deverá rodar, no nosso caso no 3 servidor em New York;
  • ssh_keys = Você pode passar um array com os “ids” das suas chaves ssh cadastradas no DO, assim não precisa de senha para acessar por ssh.

Agora que já entendemos nosso código, vamos planejar a execução dele para sabermos se tudo está correto e também gerarmos nosso arquivo de execução.

Figura 3 — terraform plan

Podemos ver na Figura 3, o retorno do nosso planejamento e no fim um resumo. Vamos adicionar 1 recurso, não modificaremos nenhum e também não destruiremos nenhum.

Terraform apply

Agora que sabemos exatamente o que nosso código vai alterar, podemos executá-lo e aguardar a criação do nosso droplet. Isso pode levar desde alguns segundos até poucos minutos, dependendo do tamanho da sua infraestrutura.

Figura 4 — terraform apply

Agora que executamos o terraform podemos ver que ele levou aproximadamente 40 segundos para criar nosso . Não vamos nos preocupar com configuração dessa máquina no momento.

Apesar do código ter exibido que a criação foi completa, vamos verificar no painel da DO se tudo ocorreu normalmente.

Figura 5 — painel da digital ocean

Se quisermos acessar a máquina, podemos copiar o endereço IP e digitarmos o seguinte no terminal

ssh root@104.131.6.155

Caso você não consiga se logar na máquina, verifique se o ip foi copiado corretamente e se realmente cadastrou sua chave ssh na DigitalOcean.

Uma outra opção, caso não queira ficar entrando no painel de controle da D.O., é criar um arquivo de output, e pedir o próprio terraform para imprimir na tela o ip do droplet criado.

Vamos fazer isso, crie um arquivo output.tf com o seguinte código

output “droplet_ip” {
value = “${digitalocean_droplet.web-app-01.ipv4_address}”
}

Estamos criando uma “variável” e colocando o valor do atributo correspondente ao web-app-01. Basta rodar o terraform apply novamente e deverá ver uma saída parecida com a seguinte:

Figura 6 — output das variaveis

Arquivo de Estado

Se você prestar bastante atenção na pasta onde o nossos arquivos .tf estão, vai perceber que o terraform criou um arquivo chamado terraform.tfstate. Esse arquivo é muito importante na utilização do terraform, é nele que armazenamos o estado atual da nossa infraestrutura.

Figura 7 — terraform.tfstate

O arquivo é tão importante que é considerado por muitos, um problema do terraform. No caso de perdermos esse arquivo, a princípio, quando rodarmos novamente o terraform apply novas máquinas serão criadas, mesmo que já existam máquinas criadas. Pois o terraform não vai ter conhecimento de que foi ele que as criou. E isso é válido também para o terraform destroy que não conseguiria destruir sua infra pelo mesmo motivo.

Também é um certo problema caso precise utilizar o terraform de forma distribuída, entre os membros da sua equipe. Existe uma solução muito boa para isso: utilizar o Consul ou AWS S3 como backend para o terraform. Mas isso fica para um próximo post.

Terraform destroy

Vamos agora ver como podemos fazer para destruir nossa máquina, mas antes de destruirmos, precisamos verificar se realmente estamos destruindo apenas as máquinas que queremos e que não vamos fazer nenhuma besteira na nossa infra. Para isso basta executar o planejamento da nossa destruição.

Figura 8 — terraform plan -destroy

Agora temos certeza de que iremos destruir apenas a máquina que queremos, então vamos em frente e executar o

terraform destroy

Por se tratar de um comando crítico, que pode causar muitos problemas, ele tem um passo extra. Ele vai te mostrar exatamente o que será destruído e em seguida pergunta se tem certeza que deseja destruir o que foi mostrado. Já que temos certeza vamos digitar “yes”, apertar enter e aguardar.

Figura 9 — terreform destroy

Conclusão

Agora, você já tem o básico de como funciona o Terraform. Caso deseje utilizar um outro é só seguir a documentação que pode ser encontrada aqui.

Caso tenha alguma dúvida ou sugestão fique a vontade para dar um pio la no twitter!