我有一个 Ansible 角色来操作一些 Zabbix 组件。该角色具有这组任务来检查 Zabbix Agent 类型(1 或 2)和版本。
- 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
当我运行剧本时,变量“zabbix_agentd_ver_old”在最后两个任务中以相同的名称注册了两次。即使最后一个任务被跳过,该变量也会被注册为已跳过。
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
我想避免更改变量名称,因此我需要在最后两个任务之一中注册变量,而不是同时注册两个任务。
如果不满足最后一个任务的条件,如何完全跳过最后一个任务,包括注册?
在 Ansible 中编写基于微小变化的多个任务分支很烦人,并且由于任务开销而运行缓慢。有时这可以折叠成一个带有变量的脚本。这是我用几行 shell 进行的快速而肮脏的尝试。免责声明:我没有用zabbix测试过,虽然一般概念并不难。
注册:将覆盖存在的同名(主机范围)变量。这并不是说跳过的任务不返回任何内容,而是返回跳过的状态。这很令人困惑,我建议所有注册的任务变量名称都是唯一的。
在 Ansible 任务中编写分支流并不像在许多编程语言中那样好。
另请参阅:community.zabbix集合具有community.zabbix.zabbix_agent角色,具有不同的处理方式。从软件存储库安装代理包,然后安装模板配置文件,其中大多数可能的值可以来自变量。Ansible 非常常见的模式。
就我个人而言,我更喜欢安装应该存在的软件包的风格。它可以修复丢失的代理,而且您不必弄清楚主机上有什么。
这是一个典型的定制事实案例。通过将可执行脚本zabbix.fact添加到远程主机上的/etc/ansible/facts.d来创建有关 Zabbix 的动态事实。
以下脚本测试列表zabbix_agent_list中是否存在可执行文件,并返回 JSON 字典ansible_custom_zabix_agent以及存在的以逗号分隔的项目
将此脚本分发到您想要提供此自定义事实的远程主机
测试一下。给定远程主机test_11和test_13
下面播放
给出(删节)
笔记:
默认情况下,每场比赛都会收集事实。在这种情况下,您不必运行任务设置。
如果您禁用事实收集,或者如果您想刷新事实,请运行任务设置
通过限制当地事实来加速事实收集。放
gather_subset: local
变量ansible_custom_zabix_agent将被追加到字典ansible_facts.ansible_local.zabbix.ansible_custom_zabix_agent
ansible_local:本地事实(gather_subset:local)
zabbix: zabbix.fact收集的事实
ansible_custom_zabix_agent:以逗号分隔的代理列表
如果zabbix_agent_list列表中存在更多项目,则上面的例子中的变量ansible_custom_zabix_agent可能是逗号分隔项目的列表。在本例中,将字符串拆分为列表并获取第一项。
您可以向脚本添加其他功能并返回其他事实。
用户可以使用任何其他语言,例如Python,来编写脚本。
Python 脚本示例
例如给出,