LOW, MEDIUM, HIGH e DANGER: classificando risco antes de liberar playbooks Ansible
Uma taxonomia operacional simples para separar coleta, configuração, restart/deploy e ações destrutivas antes de transformar playbooks em templates.
Uma das maneiras mais fáceis de criar um incidente com automação é tratar todos os playbooks como se tivessem o mesmo risco.
Tecnicamente, todos podem ser executados com:
| |
Mas operacionalmente existe uma diferença enorme entre:
| |
Na organização de uma plataforma Ansible + Semaphore, usamos uma taxonomia simples:
| |
Ela não tenta substituir change management ou análise de risco formal.
Serve para impedir que uma automação desconhecida ganhe interface de execução antes de alguém entender seu blast radius.
LOW — leitura, diagnóstico e inventário #
Exemplos típicos:
- ping;
- facts;
- health check;
- leitura de logs;
- inventário;
- consulta a API;
- listagem de eventos;
- coleta pré-migração.
A característica principal é não ter intenção de alterar estado do alvo.
Isso não significa risco zero.
Um playbook read-only ainda pode:
- consultar centenas de hosts de uma vez;
- gerar carga;
- ler dados sensíveis;
- produzir um arquivo com informação que não deveria sair do ambiente.
Mas é uma classe adequada para começar a validar inventories, credenciais e operação do Semaphore.
MEDIUM — configuração simples e reversível #
Exemplos possíveis:
- instalar pacote;
- alterar configuração controlada;
- aplicar ajuste padronizado;
- atualizar agente;
- implantar configuração de logs.
Aqui já existe mudança.
Eu espero pelo menos:
| |
Quando existir check_mode útil, ele deve ser aproveitado.
HIGH — mudança que pode interromper serviço ou alterar produção #
A documentação do projeto coloca nessa classe ações como:
- restart;
- deploy;
- alteração cloud;
- mudança de produção.
É onde aparecem playbooks de:
| |
Para essa categoria, uma interface com um botão “Run” não é suficiente.
Quero guardrails adicionais.
DANGER — destruição ou perda potencial de recurso/dado #
A categoria DANGER é reservada para verbos como:
| |
Essas operações merecem tratamento separado porque a consequência não é apenas indisponibilidade temporária.
Pode existir perda permanente ou recuperação complexa.
Em muitos casos eu nem liberaria esse tipo de template para operadores gerais.
UNKNOWN é uma categoria útil #
Um erro comum é forçar classificação quando ainda não se leu o arquivo.
UNKNOWN é melhor que falsa segurança.
Se o nome é:
| |
não dá para saber pelo nome se ele:
- só lê configuração;
- altera parâmetro;
- reinicia Redis;
- apaga cache;
- mexe em persistência.
Até abrir o conteúdo, o estado correto é desconhecido.
Risco não deve ser deduzido apenas pelo módulo Ansible #
Um shell: pode executar algo inofensivo.
Um módulo declarativo pode aplicar uma mudança muito ampla.
O risco depende da combinação:
| |
Por isso a classificação é do procedimento, não apenas do módulo usado.
O mesmo playbook pode mudar de risco conforme o alvo #
Considere um restart:
| |
A categoria não precisa virar uma fórmula matemática, mas o template precisa levar o escopo em conta.
O Survey e o inventory são parte do risco.
Survey por categoria #
Um padrão documentado para a plataforma foi reduzir perguntas em LOW e exigir mais contexto conforme o risco cresce.
LOW #
| |
MEDIUM #
| |
HIGH #
| |
DANGER #
| |
Isso não é uma especificação universal de Semaphore.
É um contrato operacional simples que deixa o risco visível na interface.
Confirmação textual ainda é melhor que nada #
Para HIGH/DANGER, a documentação sugere uma proteção do tipo:
| |
Isso não é autenticação extra.
Também não evita alguém de digitar SIM sem pensar.
Mas elimina a execução crítica que acontece apenas porque todos os defaults já estavam preenchidos.
Em um desenho mais maduro, confirmação pode ser combinada com RBAC, aprovação externa, janela de mudança ou pipeline.
Nome do template deve denunciar a natureza da mudança #
Outra convenção útil:
| |
O operador não deveria descobrir que a receita reinicia produção depois de abrir os logs.
O nome faz parte do guardrail.
Um risco baixo pode ter blast radius alto #
Pense num inventário read-only executado contra 500 hosts simultaneamente.
A intenção é LOW.
Mas a concorrência pode gerar:
- centenas de SSHs;
- consultas a APIs;
- carga em bastion;
- excesso de logs;
- tempo de task alto.
Por isso a plataforma também usa limites de paralelismo e duração máxima no control plane.
A classificação de mudança e o controle de execução são camadas diferentes.
Como eu revisaria um playbook #
Para classificar, responderia:
| |
Depois atribuiria a classe e registraria o motivo.
O que a fonte sustenta #
A documentação privada do projeto define explicitamente:
| |
Também documenta padrões de Survey por risco e a exigência de confirmação em operações críticas.
O artigo expande os princípios operacionais, mas não afirma que todo playbook do inventário já recebeu classificação final.
O principal aprendizado #
Automação remove passos manuais.
Ela não remove consequência.
Uma taxonomia simples de risco ajuda a responder antes da execução:
isso é só coleta, é mudança, pode interromper produção ou pode destruir alguma coisa?
Essa resposta deveria existir antes de oferecer o botão para outra pessoa clicar.
Me chama.
Manda o contexto, os sintomas e o que já foi testado. Bora organizar as evidências antes de sair mexendo.