Noções Básicas de Automação de Infraestrutura
10 exemplos para você começar com Automação de Infraestrutura - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com Automação de Infraestrutura - 7 básicos e 3 intermediários.
uv venv && source .venv/bin/activate
uv pip install "ansible>=10.0" "pulumi>=3.0" "cdktf>=0.20"AWS_PROFILE ou função IAM para exemplos na nuvem (opcional para execuções apenas locais).A automação de infraestrutura começa descrevendo o que deve existir, não como clicar em um console.
# desired_state.py
from dataclasses import dataclass
@dataclass(frozen=True)
class BucketSpec:
name: str
versioning: bool = True
DESIRED = BucketSpec(name="app-logs-prod", versioning=True)Relacionado: Gerenciamento de Configuração - templates e ambientes
Execute o mesmo script duas vezes e termine no mesmo estado - sem recursos duplicados.
import boto3
def ensure_bucket(s3, name: str) -> None:
buckets = [b["Name"] for b in s3.list_buckets().get("Buckets", [])]
if name not in buckets:
s3.create_bucket(Bucket=name)
s3.put_bucket_versioning(
Bucket=name,
VersioningConfiguration={"Status": "Enabled"},
)
session = boto3.Session()
ensure_bucket(session.client("s3"), "demo-idempotent-bucket")create_bucket simples falha na segunda execução.put_bucket_versioning é naturalmente idempotente - seguro de chamar todas as vezes.criado vs atualizado) para logs e auditorias.Relacionado: Provisionamento de Recursos na Nuvem - provisionamento repetível
Módulos Ansible convergem para o estado declarado automaticamente.
ansible localhost -m ansible.builtin.file -a "path=/tmp/iac-demo state=directory mode=0755"
ansible localhost -m ansible.builtin.file -a "path=/tmp/iac-demo state=directory mode=0755"ok com changed=0 - isso é idempotência em ação.file, copy, apt) em vez de shell puro, a menos que não exista módulo.-C (modo de verificação) para pré-visualizar mudanças sem aplicá-las.Relacionado: Ansible - playbooks, inventários e roles
Armazene o código de infraestrutura no git com o mesmo rigor do código de aplicação.
git init infra-demo && cd infra-demo
mkdir -p stacks/prod
echo 'name = "prod"' > stacks/prod/Pulumi.yaml
git add . && git commit -m "chore: initial prod stack"infra-v2026.07.09) ao promover para produção.Relacionado: Pulumi (IaC com Python) - Python real para recursos de nuvem
Mantenha as configurações de dev, staging e prod distintas, mas estruturalmente idênticas.
from dataclasses import dataclass
@dataclass(frozen=True)
class EnvConfig:
name: str
bucket_suffix: str
enable_deletion_protection: bool
ENVS = {
"dev": EnvConfig("dev", "-dev", False),
"prod": EnvConfig("prod", "-prod", True),
}deletion_protection=True) pertencem à configuração, não a comentários.ENVIRONMENT ou de um flag de CLI, nunca codifique prod diretamente.Relacionado: Gerenciamento de Configuração - segredos e templates
Visualize as mudanças antes de mutar a infraestrutura compartilhada.
cd stacks/prod
pulumi preview # ou: terraform plandelete inesperado em recursos com estado.Relacionado: Testando Código de Infraestrutura - dry-runs e verificações de política
Registre o que mudou, quem executou, e o resultado - não apenas sucesso/falha.
import json
import logging
logging.basicConfig(level=logging.INFO, format="%(message)s")
log = logging.getLogger("iac")
def apply(spec: dict) -> dict:
result = {"resource": spec["name"], "action": "updated", "changed": True}
log.info(json.dumps({"event": "iac_apply", **result}))
return result
apply({"name": "app-logs-prod"})Relacionado: Melhores Práticas de Automação de Infraestrutura - regras de infra auditáveis
Compare o estado ao vivo da AWS com sua especificação declarada.
import boto3
def detect_versioning_drift(bucket: str, expected: str = "Enabled") -> bool:
s3 = boto3.client("s3")
resp = s3.get_bucket_versioning(Bucket=bucket)
actual = resp.get("Status", "Suspended")
return actual != expected
if detect_versioning_drift("app-logs-prod"):
raise SystemExit("drift detected: versioning mismatch")Relacionado: Provisionamento de Recursos na Nuvem - infraestrutura revisável
Gere JSON do Terraform a partir de construtos Python tipados.
from cdktf import App, TerraformStack
from constructs import Construct
class MiniStack(TerraformStack):
def __init__(self, scope: Construct, ns: str):
super().__init__(scope, ns)
# Adicione provedores e recursos aqui - cdktf synth escreve JSON do terraform
app = App()
MiniStack(app, "mini")
app.synth()cdktf synth ainda é Terraform puro - equipes de operações podem inspecioná-la.Relacionado: Terraform com Python - CDKTF e envolvendo o Terraform
Rejeite planos não conformes em CI antes que eles toquem nas contas de nuvem.
def validate_tags(tags: dict) -> list[str]:
required = {"Environment", "Owner", "CostCenter"}
missing = required - set(tags)
return [f"missing tag: {t}" for t in sorted(missing)]
errors = validate_tags({"Environment": "prod"})
assert errors, "policy should fail without Owner and CostCenter"ruff e pytest.Relacionado: Testando Código de Infraestrutura - linting e verificações de política
Versões de Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026