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
- Backend Remoto com DynamoDB Lock: Protege o estado contra corrupção simultânea e garante criptografia em repouso.
- Parametrização via Variáveis: Permite reutilizar o código de infraestrutura para múltiplos ambientes com consistência.
- 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
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto