Terraform? OpenTofu? Porque? O que é? Como me pode ajudar?

Nota do Autor: Entre a altura que este post foi originalmente escrito e agora, houve um fork do Terraform para o OpenTofu que por motivos óbvios recomendo.

Olá a todos,

Hoje trago aqui a vós um post sobre IaaS, IaC, ou como provisionar infraestrutura em massa utilizando código para o efeito.
Quem está na industria sabe que há um defacto para isso. Ou até a pouco tempo havia um defacto para isso. O terraform. Agora devido a mudança do tipo de licenciamento por parte dos fabricantes do Terraform, surgiu um fork chamado OpenTofu.

OpenTofu

O OpenTofu é uma ferramenta que permite gerir infraestrutura como código. Isso significa que podemos definir a nossa infraestrutura usando uma linguagem declarativa (lembram-se da explicação sobre linguagens declarativas quando fiz o post sobre puppet?), e então o OpenTofu aplicará essas alterações na nossa infraestrutura, garantindo que ela esteja sempre no estado desejado. Neste post, exploraremos o que é , como  funciona e por que é uma ferramenta tão poderosa para gerir a nossa infraestrutura.

Mas afinal o que é o OpenTofu?

O OpenTofu é uma ferramenta de código aberto que permite gerenciar a infraestrutura como código. É um fork do produto original criado pela HashiCorp, a mesma empresa que criou outras ferramentas populares como Vagrant, Packer e Consul e que vive agora através de um fork no código original, mantendo as suas raízes do opensource e da comunidade.
O OpenTofu foi pensado para funcionar com uma enorme variedade de providers de infraestrutura, incluindo providers públicos como a AWS, Azure, GCP e tecnologias on-premise como a libvirt, openvm, e muito mais. Isto significa que podemos usar uma única ferramenta e interface para gerenciar a nossa infraestrutura em vários providers, e no nosso datacenter on premise, ou no nosso próprio homelab.

Olhando em high level, o OpenTofu/Terraform funciona definindo a nossa infraestrutura (e configuração da mesma) usando uma linguagem específica de domínio (DSL) chamada HCL (HashiCorp Configuration Language). Nós escrevemos o código HCL para definir os recursos que desejamos criar e, em seguida, o Terraform usa esse código para criar ou modificar os recursos conforme necessário. Essa abordagem é conhecida como infraestrutura como código (IaC) e a capacidade e entendimento de como escrever código assim faz desta uma das hardskills mais procuradas atualmente.

E porque? Qual o beneficio? Um dos principais benefícios de usar o Terraform é que ele permite que tratemos a infraestrutura como código. Não precisamos de saber cada passo de configuração em cada um dos portais de providers, ou cada canto obscuro nos menus.
Significa que podemos usar as mesmas práticas recomendadas que usaria ao escrever código de software. Por exemplo, podemos usar o controle de versão (em git) para fazer tracking a alterações no nosso código de infraestrutura e usar testes automatizados para garantir que nosas infraestrutura esteja sempre em bom estado e como planeamos que esteja.
Outra vantagem é a possibilidade de deployments em massa. Poderá não interessar para instancias de 2 ou 3 vm’s no nosso homelab, mas quando escalamos isto a 400 ou 500 servidores por projeto a coisa toma outra figura.

Como o Terraforma funciona?

Para usar o Terraform, primeiro precisamos definir sua infraestrutura usando HCL. HCL é uma linguagem declarativa, o que significa que você descreve o que deseja criar, em vez de como criá-lo. Por exemplo, aqui está um código HCL que cria uma instância de EC2 na AWS:

recurso "aws_instance" "exemplo" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}

Neste exemplo, estamos a usar o recurso `aws_instance` para criar uma instância de EC2 na AWS. Especificamos o ID da AMI e o tipo de instância que queremos usar. Também damos um nome ao recurso (`exemplo`) para que possamos referenciá-lo posteriormente.

De forma muito high level, depois de definir a nossa infraestrutura em HCL, podemos utilizar a ferramenta de linha de comando `terraform` para a gerir e executar. A ferramenta `terraform` possui vários subcomandos, incluindo `init`, `plan`, `apply` e `destroy`.

O comando `init` é usado para inicializar sua configuração do Terraform. Este comando fará o download de todos os plug-ins necessários do registry e configurará seu workspace. Tipicamente só é necessário executar este comando uma vez por projeto do Terraform.

O comando `plan` é usado para visualizar as alterações que o Terraform fará na nossa infraestrutura. Ao executar este comando, o Terraform analisará o nosso código HCL e o comparará com sua infraestrutura existente fazendo o equivalente a um diff. Após este passo, ele criará um plano que mostra quais mudanças o Terraform fará.
Este é um recurso muito útil porque permite que vejamos exatamente o que o Terraform fará antes de ser executado.

O comando `apply` é usado para aplicar as mudanças na nossa infraestrutura. Ao executar este comando, o Terraform executará o plano criado na etapa anterior. Ele criará ou modificará os recursos conforme necessário para colocar a nossa infraestrutura no estado desejado.

Finalmente, o comando `destroy` é usado para destruir sua infraestrutura. Ao executar este comando, o Terraform apagará todos os recursos que criou.

Por que o OpenTofu é uma ferramenta tão poderosa e com tanta expressão hoje em dia no campo de gestão de infraesturtura?

  1. Linguagem declarativa
    Como pudemos ver, o OpenTofu usa uma linguagem declarativa para definir a infraestrutura como código. Isso facilita a leitura agnóstica de plataforma, gravação e manutenção do nosso código de infraestrutura. Ele também permite que usemos o controle de versão e testes automatizados, assim como faria com se de código de software aplicacional se tratasse.
  2. É agnóstico do vendedor da plataforma
    O OpenTofu foi projetado para funcionar com uma ampla variedade de provedores de infraestrutura, incluindo AWS, Azure, GCP e tantos mais, em public cloud e on-premise.
    Isto significa que você podemos usar uma única ferramenta para gerir a nossa infraestrutura em vários provedores. Ajuda enormemente a alternar facilmente entre provedores, se necessário, o que torna migrações as-is ou replicações de datacenters para DR’s um sonho.
  3. Dependências e ordenação de recursos
    O OpenTofu é capaz de gerir dependências e pedidos de recursos. Isto significa que podemos especificar dependências entre recursos e o OpenTofu os criará na ordem correta. Por exemplo, se desejarmos criar um grupo de segurança e anexá-lo a uma instância do EC2, o Terraform garantirá que o grupo de segurança seja criado antes da instância. Mesma coisa se necessário for on-prem provisionar um storage group para um projeto novo.
  4. Gestão do estado
    O OpenTofu acompanha o estado da nossa infraestrutura. Isto significa que ele sabe quais recursos existem, qual é seu estado atual e quais mudanças precisam ser feitas para colocá-los no estado desejado. Isto permite que o OpenTofu faça alterações de forma incremental, modificando apenas o que precisa ser alterado. Mas também significa que o OpenTofu pode detectar desvios do padrão, que é quando o estado real de sua infraestrutura diverge do estado desejado.
  5. Reutilização
    Este é um dos campos mais fundamentais para quem trabalha com infraestruturas grandes. O OpenTofu permite criar módulos, que são unidades reutilizáveis de código de infraestrutura. Isso significa que você podemos escrever código de infraestrutura uma vez e reutilizá-lo em vários projetos. Pode compartilhar módulos com a comunidade mais ampla – através do registry –  o que irá economizar tempo e esforço a todos na comunidade.
  6. Escalabilidade
    O Terraform foi projetado para trabalhar com infraestruturas em grande escala. Ele pode gerir milhares de recursos em vários provedores simultaneamente, tornando-o adequado para gerenciamento de infraestrutura em nível empresarial e global.

Chegamos assim á evidencia que o OpenTofu é uma ferramenta poderosa para gerira a nossa infraestrutura como código. Ele permite que possamos definir a nossa infraestrutura usando uma linguagem declarativa e, em seguida, aplicarmos essas alterações à nossa infraestrutura de maneira controlada e automatizada.
É independente e agnóstico do fornecedor, o que significa que podemos o utilizar para gerir a nossa infraestrutura em vários providers simultaneamente, e não necessitar de conhecer em profundidade todos os menus de configuração nos mesmos.
O OpenTofu possui também  recursos como dependências e ordenação de recursos, gerenciamento de estado e reutilização, o que o torna uma ferramenta fundamental para o gerenciamento de infraestrutura em larga escala.

Se ainda não estiverem a usar o OpenTofu, nem ainda o terem experimentado no vosso homelab com integrações com o libvirt ou proxmox, façam a vocês próprios um favor e experimentem.
É algo que definitivamente vale a pena considerar como uma forma de simplificar o gestão de infraestrutura e aumentar a produtividade.
O vosso datacenter, e a vossa carreira irá vos agradecer.

Até ao próximo post, e já sabem, se notarem alguma coisa errada, sabem onde me encontrar.

Abraço
Nuno