Tenho as seguintes tarefas de trabalho:
- name: Get Package infos
ansible.builtin.package_facts:
manager: auto
- name: Test redis-server version
ansible.builtin.assert:
that:
- ansible_facts.packages['redis-server'][0].version is version('4.0', '>=')
Eu me perguntei se sou capaz de combinar essas tarefas em uma única:
- name: Get Package infos
tags: redis
ansible.builtin.package_facts:
manager: auto
failed_when: ansible_facts.packages['redis-server'][0].version is version('4.0', '<')
Mas se eu fizer isso, recebo uma mensagem de erro bastante longa que termina com:
The error was: error while evaluating conditional
(ansible_facts.packages['redis-server'][0].version is version('4.0', '<')):
'dict object' has no attribute 'packages'. 'dict object' has no attribute 'packages'"}
Parece que o campo packages
não existe naquele momento. O que pode corrigir essa abordagem?
Uma opção minimalista seria
Opcionalmente, teste também rc
Esta tarefa não muda nada. Suprimir o relatório do status alterado
Observação
É possível usar ansible_facts.packages da variável registrada. Porém, o módulo package_facts não é prático para verificar a versão do redis porque depende do sistema operacional e é lento. Por exemplo,
dá no Ubuntu
O equivalente à tarefa de comando acima seria
Correto, ansible_facts não é atualizado entre o momento em que uma tarefa é concluída e o momento em que a mesma tarefa avalia seu failed_when.
Use sua primeira tentativa como está,
package_facts
seguida de afirmação. Perfeitamente compreensível o que está fazendo.package_facts verifica o gerenciador de pacotes do sistema, que é uma boa opção para centralizar a forma como o software é instalado. (Se a distribuição do seu sistema operacional for suportada por este módulo.) Você poderia instalar de outra maneira, mas isso requer outros métodos para mantê-lo e corrigi-lo.
Coletar fatos sobre todos os pacotes em um formato padrão, abstraídos de meia dúzia de gerenciadores de pacotes, compensa o pequeno custo de desempenho de uma consulta ao gerenciador de pacotes. Semelhante a fazer um
rpm -qa
quando -all não é estritamente necessário. Embora no caso do rpm ele esteja usando ligações Python em vez do programa.assert é um plugin de ação e, portanto, não precisa ser remoto em nenhum lugar ou executar comandos externos. Como resultado, não seria economizado muito tempo de execução combinando as tarefas.
Tarefas que apenas coletam dados e, portanto, aumentam a contagem de tarefas em um resumo do jogo, mas nunca mudam as coisas, são um estilo aceitável para mim. Fazer muitas coisas não triviais no Ansible exige configuração, e essas tarefas nem sempre mudam nada.
Sugestão menor, considere tornar a string da versão uma variável. Os principais requisitos de versão dos aplicativos podem não mudar com frequência. No entanto, ao testar sua função, seria bom ver como é a condição de falha.