Ansible
Quando usar
- Acionar quando o projeto tem playbooks, roles,
inventory,ansible.cfgourequirements.yml/galaxy.ymlde collections. - Acionar também para revisar se uma automação existente é realmente idempotente antes de rodá-la contra um ambiente compartilhado.
- Não acionar para orquestrar serviços já containerizados em cluster — usar
$specsfy-specialist-docker-swarmnesse caso; Ansible aqui entra no provisionamento do host, não na orquestração de serviços do Swarm. - Combinar com
$specsfy-specialist-delivery-engineeringquando a execução do playbook é uma etapa de um pipeline de deploy.
Fluxo
- Em release ou deploy completo, trabalhar sob
$specsfy-specialist-deploye usar oSEMVER, a imagem e os manifestos já preparados pela orquestradora. - Confirmar inventário, grupos, ambiente-alvo, método de conexão e escopo exato de hosts antes de qualquer execução com efeito.
- Usar
./deploy check-hostspara apresentar todos os hosts em tabela e confirmar o módulopingantes da primeira task remota. Usar./deploy sync-keyspara adicionar somente chaves públicas ao usuáriodeploy, sem excluir entradas existentes doauthorized_keys. - Inspecionar a precedência de variáveis aplicável (ver tabela em
references/standards.md) e as versões fixadas de collections eansible-core. - Modelar o estado desejado com módulos idempotentes e roles coesas, uma responsabilidade por role.
- Proteger secrets com Ansible Vault ou um provedor externo (lookup em cofre gerenciado); nunca em texto plano no repositório.
- Validar sintaxe,
ansible-lint, check mode e diff sem revelar segredos no output. - Testar a role em ambiente descartável e repetir a mesma execução para
provar que a segunda rodada não relata
changed. - Aplicar em produção com serialização (
serial), limites (--limit) e critério de parada (max_fail_percentage/any_errors_fatal) compatíveis com o risco da mudança.
Padrões
- Criar um preflight separado para conferir versão do controlador, sistema do alvo, acesso ao Docker, papel de manager, login no registry, collections, imagem imutável e Docker Secrets antes do play com escrita.
- Quando a stack usar Cloudflare Tunnel, criar
cloudflare_tunnel_tokena partir devault_cloudflare_tunnel_tokencomno_log: true. A stack recebe somente o nome do Docker Secret. - Copiar manifests versionados para um diretório estável no host, validar cada
um com
docker stack confige publicar as stacks em ordem de dependência. - Após cada publicação, consultar as réplicas até atingir a convergência ou encerrar com erro após tentativas limitadas. Não concluir pelo retorno do módulo de deploy isoladamente.
- Tratar check mode com honestidade: tasks de inspeção podem usar
check_mode: false; tasks que alteram estado devem ser puladas ou suportar a simulação. O preflight precisa permanecer útil sem implantar stacks. - Usar FQCN (
ansible.builtin.copy, nãocopy) e módulos declarativos, evitandoshell/commandsempre que existir módulo idempotente equivalente. - Dar nomes acionáveis a tasks e handlers (
name:descreve o efeito, não o módulo); notificar handler somente quando a task realmente mudar estado. - Separar
defaults/main.yml(configurável pelo consumidor da role),vars/main.yml(interno, não deve ser sobrescrito) e secrets (Vault ou lookup externo) em arquivos distintos. - Fixar collections em
requirements.ymlcom versão e validar a matriz de compatibilidade com oansible-coreinstalado antes de atualizar. - Usar
changed_when/failed_whenapenas para representar a semântica real do comando — nunca para silenciar uma falha genuína ou fingir idempotência em umshell/commandque sempre relata mudança. - Restringir privilégio (
becomesó na task que precisa) e usarno_log: trueem qualquer task que manipule segredo, mesmo que o valor pareça inofensivo no log. - Não depender da ordem acidental do inventário ou da execução paralela
padrão quando a task tiver efeito colateral entre hosts (ex.: um serviço
que só um host por vez pode reiniciar) — usar
serialethrottleexplicitamente nesses casos.
Antipadrões
shell/commandsemcreates,removesouchanged_whenexplícito: a task relatachangedtoda vez, mesmo quando o estado final é idêntico — isso quebra a leitura de "o que realmente mudou" em uma execução e mascara uma automação não idempotente.- Handler notificado incondicionalmente (fora de uma task que só dispara
notifyquandochanged): reinicia serviço a cada execução, inclusive quando nada mudou, criando indisponibilidade desnecessária. - Variável de ambiente (produção/staging) só resolvida por
group_varsgenérico sem revisar a precedência real: um-ena linha de comando ou umahost_varsmais específica pode silenciosamente sobrescrever o valor esperado. - Vault decriptado e commitado por engano, ou segredo interpolado em um
debug:/log semno_log: o segredo vaza pelo histórico do Git ou pelo output da execução, mesmo que o arquivo fonte esteja corretamente criptografado.
Validação
ansible-playbook --syntax-check,ansible-linte execução em--check --diff(check mode) antes de qualquer aplicação real, confirmando que o diff não expõe segredo.- Duas execuções consecutivas no mesmo alvo: a segunda não deve relatar
nenhuma task como
changed— essa é a prova operacional de idempotência, não uma inspeção visual do código. - Testes de handlers (o serviço realmente reinicia quando deveria), de
templates (renderização correta por ambiente) e de falha parcial
(
any_errors_fatal,max_fail_percentagese comportam como esperado quando um host falha no meio do batch). - Confirmação explícita do inventory e do
--limitusados antes de qualquer mutação remota — nunca aceitar "rodar em todos os hosts" como default silencioso. - Não declarar uma role "idempotente" ou "segura" sem as duas execuções consecutivas e o check mode acima; a leitura do playbook não substitui a execução real contra um ambiente descartável.
Skills relacionadas
$specsfy-specialist-deploycoordena a automação completa do servidor; esta skill cuida das roles e do playbook Ansible.$specsfy-specialist-versioningmantémSEMVERalinhado à imagem e aos manifestos transportados pela automação.$specsfy-specialist-docker-swarmquando o host provisionado por Ansible entra em um cluster Swarm — Ansible prepara o node, Swarm orquestra os serviços dentro dele.$specsfy-specialist-delivery-engineeringquando a execução do playbook é uma etapa de pipeline com promoção entre ambientes.$specsfy-specialist-application-securitypara revisão de gestão de segredo, rotação de credencial e hardening do host provisionado.$specsfy-specialist-debian-serverpara preparar APT, SSH, sysctl, systemd, firewall e Docker Engine antes da automação da aplicação.
Leia references/standards.md para estrutura de roles, precedência de variáveis, idempotência, segurança operacional e comandos de teste, com fontes oficiais da documentação do Ansible.