Ansible idempotente: 15 playbooks pra um deploy reproduzível

Como camverly-ops cobre provisão, deploy, update e bootstrap sem precisar de SSH manual.

A primeira versão da operação de Camverly era um conjunto de scripts shell que rodavam por SSH manual. Funcionou pra primeiro deploy em HML, mas cada bug expunha um caso que ninguém tinha previsto — uma versão de Go diferente aqui, uma dependência apt faltando ali, um migration script que dependia de outro ter rodado. Reescrevemos tudo como Ansible idempotente em duas semanas. Foi a melhor decisão de operação que tomamos.

Estrutura: install.sh dispatcha pra playbooks Ansible numerados (00-base, 10-runtimes, 20-repos, 30-postgres, 40-migrations, 50-build, 60-systemd, 70-caddy, 99-smoketest). Cada playbook é responsável por uma camada do stack e é projetado pra ser rodável em qualquer ordem que faz sentido (você não pode rodar 50-build sem 20-repos, mas pode rodar 99-smoketest sem 30-postgres). Idempotência é a regra absoluta: rodar duas vezes não deve fazer mal a nada.

site.yml chama todos em ordem pra provisão fresh. deploy.yml chama só 20+50+60+70+99 (pull, build, restart, valida). update.yml roda esse fluxo pra um serviço só. bootstrap.yml cria o primeiro org+user+site via inserts SQL diretos com ON CONFLICT DO NOTHING. status.yml mostra estado atual via systemctl + curl. Cada subcomando do install.sh mapeia pra um playbook; CLI fica plana e descobrível.

Os bugs que apareceram durante a transição foram típicos: o ansible-core 2.21 ficou mais estrito com loop_var override, e descobrimos que tínhamos código se beneficiando do comportamento antigo. apt em Debian 13 fez nome de pacote mudar discretamente. Postgres oficial dropou imagens de Debian Bookworm. Cada bug virou uma task Ansible que fixa o desvio, e o sistema converge. Em três deploys o número de mudanças por execução caiu de 40 pra 4.

O resultado que mais valeu: novo dev na equipe consegue subir o ambiente completo num VPS em 12 minutos. Sem documentação detalhada, sem 'pergunte ao Pedro que ele sabe configurar'. Comando único, espera 12 minutos, ambiente igual ao do colega. Mudança de versão de Go é editar uma linha em group_vars/all.yml e rodar install.sh provision. Migração pra k3s no futuro vai ser substituir os playbooks de systemd por playbooks de helm — a interface de operação fica igual. Ansible bem feito é investimento que dura anos.

Nenhum comentário ainda

Seja o primeiro a comentar.

Deixe seu comentário

Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

Entrar com Canverly