如何基于其他模板的监控项创建Zabbix触发器?
解决Zabbix 3.2中仅部分关联Template A的主机启用触发器的问题
针对你遇到的场景,有两种可靠的解决方案,其中宏控制法是最贴合你需求的(避免手动维护、适配后续配置变更),下面详细说明:
方案一:使用主机宏控制Template A中的触发器(推荐)
这是你尝试的第三种方法的优化版,完全适配你的场景,具体步骤:
在Template A中添加带宏条件的触发器
创建触发器时,表达式写成:{$ENABLE_CUSTOM_TRIGGER} = 1 and {Template A:item.key} > limit_value这里的
{$ENABLE_CUSTOM_TRIGGER}是自定义宏,默认无需设置(Zabbix中未配置的宏会被视为空值,无法满足=1的条件,因此触发器默认不会在关联Template A的主机上生效)。通过Template B给目标主机传递启用宏
- 创建Template B,在模板的宏配置中添加
{$ENABLE_CUSTOM_TRIGGER}=1 - 将Template B仅分配给需要启用该触发器的主机(这些主机同时关联了Template A)
- 创建Template B,在模板的宏配置中添加
这样实现的效果:
- 仅关联Template A的主机:宏未设置,触发器不会触发
- 同时关联Template A和Template B的主机:宏值为1,当监控项超过阈值时触发器正常触发
- 后续新增主机或调整触发器时,只需管理Template B的分配即可,不会误启用其他主机的触发器
方案二:在Template B中使用主机上下文引用监控项
如果你不想修改Template A的配置,可以采用这种方式:
在Template B中创建触发器,使用主机上下文引用监控项
触发器表达式不要指定模板名,而是用HOST上下文:{HOST:item.key} > value这里的
item.key是Template A中监控项的键值。因为目标主机同时关联了Template A和Template B,主机上存在该监控项,所以Zabbix会识别这个表达式的合法性。将Template B分配给需要的主机
只有关联了Template B的主机才会加载这个触发器,而该触发器依赖的监控项来自Template A,完美实现你的需求。
为什么之前的尝试失败?
- 方法1:用
{Template B:item.key}会要求Template B本身包含该监控项,显然不符合你的场景,因此报错 - 方法2:Zabbix不会自动将触发器移到Template A,大概率是你操作时误将触发器创建在了Template A中,或者Template B关联了Template A导致继承问题,这种方式本身不符合“仅部分主机启用”的需求
内容的提问来源于stack exchange,提问作者Gábor Héja




