Pular para conteúdo

Aula 17 - Infrastructure as Code (IaC) com Terraform e Ansible 🏗️

Objetivo Pedagógico

Objetivo: Projetar infraestruturas imutáveis e auditáveis combinando provisionamento declarativo com Terraform e gerenciamento idempotente de configurações com Ansible.


📑 1. Fundamentos Teóricos & Análise Técnica

O provisionamento manual de servidores através de consoles web é lento, inconsistente e propício ao fenômeno da Distorção de Configuração (Configuration Drift).

A Infraestrutura como Código (IaC) introduz princípios de engenharia de software na gestão de infraestruturas: 1. Provisionamento Declarativo vs. Imperativo: - No modelo imperativo, descrevem-se os passos sequenciais para atingir um estado (crie VM, instale pacote). Se executado duas vezes, causa erros ou duplicações. - No modelo declarativo (Terraform / OpenTofu), descreve-se o estado final desejado em arquivos de configuração HCL. O motor de planejamento calcula o grafo de dependências e aplica exclusivamente as mutações necessárias para alcançar o estado alvo. 2. O Estado do Terraform (State File): - O arquivo terraform.tfstate funciona como a fonte da verdade mapeando recursos declarados no código a identificadores de recursos reais na nuvem. - Deve ser obrigatoriamente persistido em backend remoto seguro (ex: S3 com DynamoDB para state locking ou Terraform Cloud), evitando corridas de concorrência entre engenheiros da equipe. 3. Idempotência com Ansible: - Enquanto o Terraform provisiona recursos fundamentais (redes VPC, subnets, clusters gerenciados e instâncias), o Ansible especializa-se na configuração de sistemas operacionais e orquestração de serviços. - Uma playbook idempotente pode ser executada centenas de vezes consecutivas resultando sempre no mesmo estado do sistema, sem efeitos colaterais indesejados.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    Dev["Engenheiro DevOps"] --> HCL["Código Declarativo HCL (main.tf)"]
    HCL --> Plan["Terraform Plan (Calcula Grafo de Recursos)"]
    Plan --> State["Remote State Lock (S3 + DynamoDB)"]
    State --> Cloud["Provedor Cloud (AWS / GCP / Azure)"]
    Cloud --> VPC["Criação de VPC e Sub-redes"]
    Cloud --> Cluster["Provisionamento de Cluster K8s"]
    Cluster --> Ansible["Ansible Playbook (Configuração Idempotente)"]
    Ansible --> Nodes["Sistemas Operacionais Configurados e Protegidos"]
    style Dev fill:#e1f5fe,stroke:#01579b
    style HCL fill:#fff3e0,stroke:#e65100
    style Cloud fill:#f3e5f5,stroke:#7b1fa2
    style Cluster fill:#e8f5e9,stroke:#2e7d32
    style Nodes fill:#e0f2f1,stroke:#00695c

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Imutabilidade de Infraestrutura: Servidores com problemas não recebem patches manuais em produção; são destruídos e recriados a partir do código. - State Locking Distribuído: Mecanismo de trava que impede que dois deploys simultâneos corrompam a base de dados do estado da infraestrutura. - Modularização e Reusabilidade: Construção de módulos parametrizados para replicação consistente de ambientes (Dev, Staging, Prod). - Validação Estática com TFLint e Checkov: Auditoria de conformidade de segurança e boas práticas de nuvem antes do provisionamento real.


🛠️ 2. Implementação Prática em Infraestrutura como Código, Terraform HCL e Ansible

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// main.tf (Provisionamento de VPC e Subnets Resilientes com Terraform)
terraform {
  required_version = ">= 1.5.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  backend "s3" {
    bucket         = "empresa-terraform-state-prod"
    key            = "vpc/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

variable "environment" {
  type    = string
  default = "production"
}

resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name        = "vpc-${var.environment}"
    Environment = var.environment
    ManagedBy   = "Terraform"
  }
}

resource "aws_subnet" "public_1a" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "us-east-1a"
  map_public_ip_on_launch = true

  tags = {
    Name = "subnet-public-1a-${var.environment}"
  }
}

💡 Análise Passo a Passo do Código

  1. Backend Remoto com DynamoDB Lock: Protege o estado contra corrupção simultânea e garante criptografia em repouso.
  2. Parametrização via Variáveis: Permite reutilizar o código de infraestrutura para múltiplos ambientes com consistência.
  3. Tags Padronizadas de Governança: Rastreia centros de custo e automações de ciclo de vida no provedor de nuvem.

🎯 3. Próximos Passos & Sequência Didática