Introdução ao OpenTofu: o fork open source do Terraform

1. Contexto e Origem do OpenTofu

Em agosto de 2023, a HashiCorp anunciou a mudança de licenciamento do Terraform de MPL 2.0 (Mozilla Public License) para BSL (Business Source License), uma licença menos permissiva que restringe o uso comercial do software. Essa decisão gerou forte reação na comunidade DevOps, que via o Terraform como uma ferramenta fundamental e aberta para Infraestrutura como Código (IaC).

A resposta foi rápida: a OpenTF Foundation foi criada por empresas como Gruntwork, Spacelift e Harness, com o objetivo de manter o Terraform verdadeiramente open source. Em setembro de 2023, o fork foi oficialmente nomeado OpenTofu, e em janeiro de 2024, a versão 1.6 foi lançada sob licença Apache 2.0, com governança da Linux Foundation.

As diferenças fundamentais incluem:
- Licenciamento: OpenTofu usa Apache 2.0, permitindo uso comercial irrestrito.
- Governança: Comunitária e transparente, com RFCs (Request for Comments) públicas.
- Filosofia: Foco em inovação aberta, sem restrições de funcionalidades para versões pagas.

2. Instalação e Primeiros Passos

A instalação do OpenTofu é simples e pode ser feita por diversos métodos:

# Linux (Ubuntu/Debian)
curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install.sh | sh

# macOS via Homebrew
brew install opentofu

# Docker
docker pull ghcr.io/opentofu/opentofu:latest

Um projeto básico consiste em arquivos .tf com sintaxe HCL (HashiCorp Configuration Language). Exemplo de main.tf:

terraform {
  required_version = ">= 1.6"
  backend "local" {}
}

provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "example" {
  bucket = "meu-bucket-opentofu-2024"
  tags = {
    Name        = "Meu bucket OpenTofu"
    Environment = "dev"
  }
}

Comandos essenciais:

# Inicializar o diretório do projeto
tofu init

# Visualizar o plano de execução
tofu plan

# Aplicar as mudanças
tofu apply

# Destruir os recursos
tofu destroy

3. Compatibilidade com o Ecossistema Terraform

Um dos maiores diferenciais do OpenTofu é sua compatibilidade quase total com o ecossistema Terraform. Providers e módulos escritos para Terraform funcionam sem alterações no OpenTofu, pois ambos utilizam a mesma sintaxe HCL e o mesmo protocolo de providers.

Diferenças sutis incluem:
- Formato de estado: O OpenTofu adicionou campos extras no estado para suportar criptografia nativa, mas é compatível com estados existentes do Terraform.
- Sintaxe HCL: Pequenas extensões, como a função templatefile() com suporte a arquivos YAML.

Para migrar um projeto Terraform existente:

# 1. Substitua os binários do Terraform pelo OpenTofu
# 2. Execute tofu init para reconfigurar os backends
tofu init -migrate-state

# 3. Verifique o plano
tofu plan

# 4. Aplique sem alterações no estado
tofu apply

4. Recursos Exclusivos do OpenTofu

O OpenTofu introduziu funcionalidades inovadoras que não existem no Terraform:

Criptografia de Estado Nativa

terraform {
  backend "s3" {
    bucket         = "meu-bucket-estado"
    key            = "terraform.tfstate"
    region         = "us-east-1"
    encrypt        = true
    kms_key_id     = "arn:aws:kms:..."
  }
}

A criptografia é aplicada no lado do cliente antes de enviar o estado ao backend, garantindo segurança adicional.

Framework de Testes Integrado

# tests/example_test.tftest.hcl
run "test_bucket_creation" {
  command = plan

  assert {
    condition     = aws_s3_bucket.example.bucket == "meu-bucket-opentofu-2024"
    error_message = "O nome do bucket está incorreto"
  }
}

Execute com tofu test.

Gerenciamento de Providers Aprimorado

# cache de plugins para acelerar init
tofu providers cache --directory ~/.tofu/providers

5. Gerenciamento de Estado e Backends

O OpenTofu suporta todos os backends populares:

# Backend S3 com DynamoDB para lock
terraform {
  backend "s3" {
    bucket         = "tofu-state-bucket"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "tofu-locks"
    encrypt        = true
  }
}

Workspaces para isolamento de ambientes:

# Criar workspace para produção
tofu workspace new prod

# Listar workspaces
tofu workspace list

# Selecionar workspace
tofu workspace select dev

Bloqueio de estado remoto:

# Forçar desbloqueio (apenas em casos de falha)
tofu force-unlock <LOCK_ID>

6. Integração com CI/CD e Automação

Exemplo de pipeline com GitHub Actions:

# .github/workflows/tofu.yml
name: OpenTofu Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup OpenTofu
        uses: opentofu/setup-opentofu@v1
        with:
          tofu_version: 1.7.0

      - name: Tofu Init
        run: tofu init
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      - name: Tofu Plan
        run: tofu plan -var-file=environments/prod.tfvars

      - name: Tofu Apply
        if: github.ref == 'refs/heads/main'
        run: tofu apply -auto-approve -var-file=environments/prod.tfvars

Boas práticas de parametrização:

# environments/prod.tfvars
environment = "prod"
instance_type = "t3.large"
min_size = 3
max_size = 10

7. Considerações Finais e Roadmap

A governança comunitária do OpenTofu é transparente: todas as propostas de funcionalidades passam por RFCs públicas no repositório oficial. O roadmap inclui:

  • Suporte nativo a módulos OCI (Open Container Initiative)
  • Melhorias no test framework com suporte a mocking
  • Provider Registry próprio independente do Terraform Registry

Quando escolher OpenTofu vs. Terraform:
- OpenTofu: Se você valoriza licenciamento open source, governança comunitária e novas funcionalidades como criptografia de estado.
- Terraform: Se sua organização já tem investimento em Terraform Cloud/Enterprise e precisa de suporte comercial da HashiCorp.
- Alternativas: Pulumi (multi-linguagem), Terragrunt (abstração sobre Terraform/OpenTofu).

O OpenTofu não é apenas um fork — é um movimento da comunidade para garantir que IaC permaneça acessível, inovador e verdadeiramente aberto.

Referências