Tenho uma função Ansible que manipula alguns componentes do Zabbix. Esta função possui este conjunto de tarefas para verificar o tipo (1 ou 2) e versão do Agente Zabbix.
- name: Check if Zabbix Agent 2 is installed
ansible.builtin.shell:
cmd: which zabbix_agent2
register: zabbix_agent2_installed
ignore_errors: yes
- name: Check if Zabbix Agent D is installed
ansible.builtin.shell:
cmd: which zabbix_agentd
when: not zabbix_agent2_installed.stdout
register: zabbix_agentd_installed
ignore_errors: yes
- name: Stop if there is no Agent installed
ansible.builtin.fail:
msg: |
Zabbix Agent is not installed.
when: not zabbix_agent2_installed.stdout and not zabbix_agentd_installed.stdout and zabbix_component == "agent"
- name: Fetch Zabbix Agent 2 version
ansible.builtin.shell:
cmd: zabbix_agent2 -V | grep "zabbix_agent" | cut -d' ' -f3
when: zabbix_agent2_installed.stdout
register: zabbix_agent_ver_old
failed_when: zabbix_agent_ver_old.stderr
- name: Fetch Zabbix Agent D version
ansible.builtin.shell:
cmd: zabbix_agentd -V | grep "zabbix_agent" | cut -d' ' -f4
when: not zabbix_agentd_installed.skipped
register: zabbix_agent_ver_old
failed_when: zabbix_agent_ver_old.stderr
Quando executo o playbook, a variável "zabbix_agentd_ver_old" é cadastrada duas vezes nas duas últimas tarefas, com o mesmo nome. Mesmo que a última tarefa seja ignorada, a variável é registrada como ignorada.
TASK [zabbix_ansible : Check if Zabbix Agent 2 is installed] *********************************************************************
changed: [zbxproxy]
TASK [zabbix_ansible : Check if Zabbix Agent D is installed] *********************************************************************
skipping: [zbxproxy]
TASK [zabbix_ansible : Stop if there is no Agent installed] **********************************************************************
skipping: [zbxproxy]
TASK [zabbix_ansible : Fetch Zabbix Agent 2 version] *****************************************************************************
changed: [zbxproxy]
TASK [zabbix_ansible : Fetch Zabbix Agent D version] *******************************************************************************
skipping: [zbxproxy]
TASK [zabbix_ansible : ansible.builtin.debug] ************************************************************************************
ok: [zbxproxy] =>
zabbix_agent_ver_old:
changed: false
skip_reason: Conditional result was False
skipped: true
Quero evitar alterar o nome da variável, por isso preciso que a variável seja registrada em uma das duas últimas tarefas, não em ambas.
Como posso pular totalmente a última tarefa, inclusive o cadastro, se sua condição não for atendida?
Múltiplas tarefas ramificadas em pequenas variações são irritantes para escrever no Ansible e são executadas lentamente devido à sobrecarga da tarefa. Às vezes, isso pode ser resumido em um script com variáveis. Aqui está minha tentativa rápida e suja com algumas linhas de shell. Isenção de responsabilidade: não testei com o zabbix, embora os conceitos gerais não sejam difíceis.
registrar: substituirá uma variável (com escopo de host) que existe com o mesmo nome. Não é que as tarefas ignoradas não retornem nada, elas retornam um status ignorado. Isso é confuso, recomendo que todos os nomes de variáveis de tarefas registradas sejam exclusivos.
O fluxo de ramificação não é tão agradável de escrever em tarefas Ansible quanto em muitas linguagens de programação.
Veja também: a coleção community.zabbix tem uma função community.zabbix.zabbix_agent com uma maneira diferente de fazer as coisas. Instale o pacote do agente a partir de repositórios de software e, em seguida, o arquivo de configuração do modelo, onde a maioria dos valores possíveis podem vir de variáveis. Padrões muito comuns para Ansible.
Pessoalmente, prefiro o estilo de instalação de pacotes de software que deveriam estar lá. Ele pode consertar agentes ausentes e você não precisa descobrir o que está no host.
Este é um caso típico de fatos personalizados . Crie fatos dinâmicos sobre o Zabbix adicionando o script executável zabbix.fact a /etc/ansible/facts.d nos hosts remotos.
O script abaixo testa a existência dos arquivos executáveis na lista zabbix_agent_list e retorna o dicionário JSON ansible_custom_zabix_agent com os itens separados por vírgula que existem
Distribua este script para os hosts remotos aos quais deseja fornecer este fato personalizado
Teste-o. Dados os hosts remotos test_11 e test_13
A peça abaixo
dá (resumido)
Notas:
Por padrão, os fatos serão coletados por jogada . Neste caso, você não precisa executar a configuração da tarefa .
Se você desabilitar a coleta de fatos ou se quiser atualizar os fatos, execute a configuração da tarefa
Acelere a coleta de fatos limitando-se aos fatos locais. Definir
gather_subset: local
A variável ansible_custom_zabix_agent será anexada ao dicionário ansible_facts.ansible_local.zabbix.ansible_custom_zabix_agent
ansible_local: fatos locais ( reunião_subset: local )
zabbix: fatos coletados por zabbix.fact
ansible_custom_zabix_agent: lista de agentes separados por vírgula
A variável ansible_custom_zabix_agent , na peça acima, pode ser uma lista de itens separados por vírgula se existirem mais itens da lista zabbix_agent_list . Neste caso, divida a string em uma lista e pegue o primeiro item.
Você pode adicionar outras funcionalidades ao script e retornar outros fatos.
Use pode usar qualquer outra linguagem, por exemplo, Python, para escrever os scripts.
Exemplo de script Python
dá por exemplo,