文章目录
zabbix宏的概述
宏的作用是便于在模板、Items、Trigger中的引用
Zabbix有许多内置的宏,如{HOST.NAME}、{HOST.IP}、{TRIGGER.NAME}等
详细信息请参考官方文档: https://www.zabbix.com/documentation/3.0/manual/appendix/macros/supported_by_location
为了更强的灵活性,Zabbix还支持全局宏-模板宏-主机宏级别使用用户自定义宏(user macro),用户自定义宏要使用”{$MACRO}”这种特殊的语法格式, 宏的名称只能使用大写字母、数字及下划线
宏可以应用在item keys和descriptions、Trigger名称和表达式、主机接口IP/DNS及端口、discovery机制的SNMP协议的相关信息中等。
宏的替换次序
首先是主机级别的宏;其次是当前主机上一级模板中(直接链接至主机的模板)的宏,多个一级模板按其ID号排序;
再接着是二级模板中的宏;而后依次类推;最后检查的是全局宏;
Zabbix如果无法查找到某主机定义使用的宏,则不会对其进行替换操作。要使用用户自定义宏,有以下两种途径:
全局宏:Administration→General→Macros
主机或模板级别的宏:编辑相应主机或者模板的属性即可
宏的使用示例
在主机级别定义一个名为{$NETWORK_NUMBER}的宏,以定义当前主机所接受的网卡进口流量的合理大小(当然这里值根据具体情况来做,仅供一个参考)
宏的分类
- 系统宏变量 {MACRO}
- 用户自定义宏 {$MACRO}
- 自动发现宏 {#MACRO}
- 系统宏变量 {MACRO}
- 用户自定义宏 {$MACRO}
- 自动发现宏 {#MACRO}
- 宏变量函数
-
- regsub(,)
- iregsub(,)
自定义宏演示
-
自定义全域宏
我们可以通过自定义全域宏来定义用户名密码,告警触发器的值等等,通过更改全域宏的值来高效的管理zabbix的触发器或者是用户名密码
-
自定义全域宏演示
- 克隆之前的触发器,修改名称为
Macro测试:{$TEST_GLOBAL_ITEM}
-
现在全域宏触发器
{$TEST_GLOBAL_TRIGGER}
的值是1,触发告警
-
将全域宏触发器
{$TEST_GLOBAL_TRIGGER}
的值改为0,告警解除
用户自定义宏在监控模板中的使用
- 在自定义模板中配置自定义宏
{$TEST_TEMPLATE_ITEM}
,{$TEST_TEMPLATE_TRIGGER}
- 在模板中克隆一个监控项,修改其名称为
模板宏测试:{$TEST_TEMPLATE_ITEM}
-
添加触发器
-
修改全域宏
{$TEXT_GLOBAL_TRIGGER}
的值,模拟触发告警
模板宏变量的优先级大于全域宏
- 一个监控项中连接了多个模板同时这几个模板中有同名称的宏变量,那么宏变量的值优先取编号靠前的模板宏变量值
优先级:主机宏 > 模板宏 > 全域宏
主机层面的宏变量验证
- 1.给主机上添加宏变量
{$TEST_HOST_ITEM}
,{$TEST_HOST_TRIGGER}
- 定义个item引用主机宏
{$TEST_HOST_ITEM}
-
定义个trigger引用主机宏
{$TEST_HOST_TRIGGER}
-
测试效果
lb-node1引用了该模板,其生效了上面定义的主机宏测试item
还测试生效了主机宏trigger
-
2.给全域宏、模板宏和主机宏都定义一个相同的
{$TEST_PRIORITY_ITEM2}
宏变量,观察到主机的宏变量优先级最高
-
在模板里定义一个监控项,观测到模板里生效的是模板宏的值
-
在主机的监控项上生效的是主机宏的值
自动发现宏的演示
配置低级别自动发现的步骤
- 配置自动发现监控项
Discovery rules
(根据脚本或命令生成低级别的自动发现宏变量) - 定义item原型
Item prototypes
(主要利用低级别自动发现产生的变量,来动态的创建监控项、触发器、图形)
实战演示低级别自动发现的配置管理
- 演示内容:自动发现服务器本地的监听的端口,并且将这些端口进行自动化的监控和告警
- 配置agent客户端
[root@lb-node2 /etc/zabbix]# vim zabbix_agentd.d/userparameter_ports.conf
UserParameter=listen.ports.discovery,python /etc/zabbix/scripts/listen_ports.py
- 编写获取服务端口的脚本
listen_ports.py
#!/usr/bin/python
import os
import json
cmd=os.popen("""netstat -lntp|grep -v rpc|awk -F "[ :]+" '{if($4 ~ /0.0.0.0/ || $4 ~ /127.0.0.1/) print $5}'""")
ports=[]
for port in cmd.readlines():
r=port.strip()
ports += [{'{#PORT}':r}]
print json.dumps({'data':ports},sort_keys=True,indent=4,separators=(',',':'))
- 配置测试的监控模板
- 设置zabbix权限
默认zabbix-agent使用zabbix用户启动,为了可以是zabbix执行脚本,我们修改他的权限,给他提升权限sudovi
- 两种方法
-
提升sudo权限
[root@lb-node2 ~]# visudo
…
zabbix ALL=NOPASSWD ALL -
修改zabbix配置,使zabbix-agent以root用户运行(修改配置后要重启agent)
sed -i 's@# AllowRoot=0@AllowRoot=1@g' /etc/zabbix/zabbix_agentd.conf
3. 还有一种方法:思路用root用户生成json格式的端口信息日志,然后zabbix-agent读取这个日志即可 -
- zabbix-server端测试获取agent端的端口信息
- 自动发现规则已经创建
- 创建监控项原型
- 创建监控项触发器原型
- lb-node1主机上自动发现监听端口实现了
- 并且监听的端口都有值了
- 测试关闭80端口,zabbix-agent触发告警