如何限制external script仅在指定Zabbix host group执行并配置告警
解决Zabbix仅在指定主机组运行外部脚本并告警的方案
嗨,作为Zabbix新手碰到这种精准控制的需求很正常,我来一步步帮你搞定:
核心思路
你现有模板已经关联了host-blwe、host-train、host-standby三个组,要让新的外部脚本Item仅在host-blwe生效,我给你两种可行方案,推荐第一种(逻辑更清晰,后续维护更方便):
方法一:创建专属模板(推荐)
这种方式把host-blwe的专属监控和其他组隔离开,不会干扰现有模板的其他配置:
- 新建专属模板
- 登录Zabbix UI,进入
配置 > 模板 > 创建模板 - 模板名称设为
Template BLWE Custom Script,关联到host-blwe主机组(注意不要关联其他组)
- 登录Zabbix UI,进入
- 添加外部脚本Item
- 进入新建的模板,点击
Items > 创建Item - 填写关键信息:
- 名称:比如
BLWE 自定义脚本检查 - 类型:选择
External check - 键值:填写你的脚本名称+参数(比如
my_check_script.sh[arg1,arg2],无参数直接写my_check_script.sh) - 数据类型:根据脚本返回值选择——如果是数值选
数字(无符号);如果是字符串,要在键值后加-s(比如my_check_script.sh[-s]),再选字符类型 - 勾选
已启用,其他选项按需调整(比如更新间隔、历史数据保留时长)
- 名称:比如
- 保存Item
- 进入新建的模板,点击
- 配置告警触发器
- 在模板里点击
触发器 > 创建触发器 - 填写关键信息:
- 名称:比如
BLWE脚本执行异常告警 - 严重性:根据需求选(比如
严重) - 表达式:根据脚本返回逻辑设置,比如:
- 脚本正常返回0、异常返回非0:
{Template BLWE Custom Script:my_check_script.sh.last()} != 0 - 脚本异常返回字符串
ERROR:{Template BLWE Custom Script:my_check_script.sh[-s].last()} = "ERROR"
- 脚本正常返回0、异常返回非0:
- 可选添加描述,说明告警原因和处理建议
- 名称:比如
- 保存触发器
- 在模板里点击
- 验证脚本权限
- 确保脚本放在Zabbix服务器的
ExternalScripts目录(默认是/usr/lib/zabbix/externalscripts/) - 给脚本设置正确权限:
chmod +x /usr/lib/zabbix/externalscripts/my_check_script.sh && chown zabbix:zabbix /usr/lib/zabbix/externalscripts/my_check_script.sh - 切换到zabbix用户手动执行脚本,确认能正常返回结果:
su - zabbix -s /bin/bash -c "/usr/lib/zabbix/externalscripts/my_check_script.sh"
- 确保脚本放在Zabbix服务器的
方法二:用宏控制现有模板的Item(无需新建模板)
如果不想新增模板,也可以在现有模板里加Item,通过主机组宏控制仅在host-blwe启用:
- 给各主机组设置宏
- 进入
配置 > 主机组,找到host-blwe,点击宏 > 创建宏- 宏名称:
{$BLWE_SCRIPT_ENABLED} - 值:
1
- 宏名称:
- 给
host-train和host-standby设置同样的宏,值设为0
- 进入
- 在现有模板添加Item
- 进入现有模板,点击
Items > 创建Item - 信息填写和方法一类似,唯一区别是:
已启用选项不要直接勾选,而是选择{$BLWE_SCRIPT_ENABLED}(只有宏值为1的主机组会启用这个Item)
- 进入现有模板,点击
- 配置触发器
- 触发器表达式和方法一一致,因为只有
host-blwe的主机启用了Item,所以触发器只会在这些主机上触发告警
- 触发器表达式和方法一一致,因为只有
- 验证脚本权限(和方法一第4步一致)
最后验证
配置完成后等待几分钟,进入监测 > 最新数据,筛选host-blwe组的主机,查看这个Item是否有数据返回;然后可以手动让脚本返回异常值,测试触发器是否正常触发告警。
内容的提问来源于stack exchange,提问作者Shailesh Sutar




