Por que no Ansible não podemos usar completamente a abordagem declarativa em todos os playbooks?
sobes.tech IA
Resposta da IA
O Ansible procura a declaratividade, descrevendo o estado desejado do sistema. No entanto, a declaratividade completa é limitada devido à necessidade de executar uma sequência de operações e dependências entre tarefas, o que às vezes requer uma abordagem imperativa para alcançar corretamente o estado final. Alguns módulos ou tarefas podem exigir realizar ações numa ordem específica ou depender da saída de tarefas anteriores.
Por exemplo:
- Execução condicional de tarefas: O uso de
when:para executar uma tarefa apenas sob certas condições pode violar a pureza declarativa, pois a condição muitas vezes baseia-se no estado atual (e não no estado final desejado) ou no resultado de uma tarefa anterior. - Uso de
registerechanged_when: Guardar a saída de uma tarefa numa variável (register) e usar essa saída em tarefas posteriores ou para determinar se houve uma alteração (changed_when) também é um elemento imperativo. - Módulos que executam comandos: Módulos como
command,shell,scriptsão por natureza imperativos, pois simplesmente executam um comando dado sem garantir nem descrever o estado final.
Exemplo de um elemento imperativo:
- name: Garantir que o serviço está em execução
systemd:
name: my_service
state: started
register: service_status
- name: Reiniciar o serviço se estiver em execução
command: systemctl restart my_service
when: service_status.changed
Aqui, a segunda tarefa só é executada se a primeira alterou o estado do serviço (por exemplo, iniciou-o). Isto é uma condição imperativa que depende do resultado da ação anterior.
De modo geral, o Ansible oferece uma abordagem híbrida: tenta ser o mais declarativo possível, mas deixa espaço (às vezes necessário) para usar construções imperativas onde a lógica de implantação e gestão de configuração assim o exige.