分布式监控系统之Zabbix宏、模板和自定义item

时间:2020-11-21 00:31:00 来源:互联网 作者: 神秘的大神 字体:

  前文我们聊了下zabbix的基础使用,包括主机的添加、监控项、触发器、action以及告警通知的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14007342.html;今天我们来了解下zabbix的宏、模板和自定义监控项的相关话题;

  1、什么是宏?

  简单讲宏就是一个字符串变量,作用和变量作用很类似;不同的是宏它是一个常量,通常是一个固定值的替代形式;宏主要作用是方便我们配置一些经常需要修改的值,用宏替换比较方便;比如我们要监控700台nginx,其中nginx的端口有时候监听在80,有时候监听在8080,如果不使用宏,那么对应端口信息就是一个数字,如果端口发生变化我们要修改700次;有了宏我们只需要修改对应宏的值即可;

  宏的分类

  在zabbix中宏分内建宏和自定义宏,所谓内建宏就是zabbix中原生就有的宏,我们可以直接调用;自定义宏就是我们自己按照需求定义的一个宏;除了按照这种方式划分宏,我们也可以按照宏的作用范围来划分;比如定义在某一个主机之上,其作用域仅对该主机生效的宏我们叫主机宏,这种宏作用范围小,但优先级很高;除了主机宏还有模板宏,全局宏;所谓模板宏就是定义在某个模板上的宏,其作用域是针对链接了该模板的所有主机,其优先级要略小主机宏;全局宏是指作用整个zabbix的宏,其优先级最小,生效范围是zabbix上的所有调用了该宏主机;在zabbix中内建宏的格式是{全大写字母},我们在引用时,直接使用大括号+宏名就好;在上一篇博客中,我们定义脚本媒介时,就用到了三个内建的宏,{ALERT.SENDTO},这个就是一个内建宏,它代表接收邮件的地址;内建宏在官方文档中有很详细的说明,如果用到可以去官方文档查看https://www.zabbix.com/documentation/4.0/manual/appendix/macros/supported_by_location;自定义宏在定义和引用和内建宏稍有不同,自定义宏在定义和引用都需要用在大括号里用$符号+宏名;比如定义一个nginx端口的宏,我们可以写成{$NGINX_PORT};

  zabbix自定义全局宏

  提示:在Administration--->General 然后选择下拉菜单找到Macros,点击进去进入全局宏的定义页面;

  提示:这样就定义了两个全局宏,我们在添加主机监控项就可以直接调用对应的宏就可以了;

  自定义主机宏

  提示:在主机列表中找到对应主机,然后点击进入编辑主机信息的页面,找到Macros;

  自定义模板宏

  提示:在configuration--->Templates中,找对应要定义模板宏的模板,点击进入编辑模板的界面,找到Macros,添加对应的宏即可;最后点击update即可;

  2、自定义监控项

  在上一篇博客我们就了解了什么是监控项,监控项就是定义怎么去采集数据的一个key;但是我们前边用到都是内建的监控项,在zabbix上内建的监控项都是针对很通用的指标数据;在一定程度上不是很满足自己业务的监控需求,此时我们就需要自定义监控项来采集我们需要的指标数据;我们在使用监控项时,其实就是在使用一种方法或程序通过zabbix server和agent通信,在被监控主机上执行我们选定的程序或方法,程序和方法执行后得到的数据,就是监控项采集的数据,然后通过zabbix agent将采集的数据发送或响应给zabbixserver;不难理解就是在被监控端执行一段代码,然后将代码返回的结果通过agent发送或响应给zabbix server完成一次数据采集;那么我们自定义监控项就是来自定义怎么获取对应指标数据的方法;然后给这个获取对应指标数据的方法或程序用一个key表示,在zabbix上直接调用key,zabbix就会发指令给agent执行对应key说对应的程序或方法来采集数据;在zabbix中,自定义监控项我们需要自己手动写脚本或命令去获取指定的数据;然后通过配置文件的方式告诉agent;

  自定义监控项的格式

  在zabbix agent配置文件中以UserParameter=<key>,<shell command>格式来自定义监控项;通常我们都是将自定义监控项手动的写一个以.conf结尾的文件中,然后通过zabbix agent配置文件中的Include指定将其导入agent配置生效;默认/etc/zabbix/zabbix_agentd.d/目录下的所有以.conf结尾的文件都是被导入的;

  示例:自定义监控项采集node04上的内存空闲空间

[root@node04 ~]# cat /etc/zabbix/zabbix_agentd.d/mem.conf
UserParameter=node04.os.Mem.free,free |awk '/^Mem/{print $4}' 
[root@node04 ~]# 

  提示:以上配置表示自定义监控项的key为node04.os.Mem.free;对应采集数据的方法是执行后面对命令;

  重启zabbix agent 

[root@node04 ~]# systemctl restart zabbix-agent.service 
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:80                                       *:*                  
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::80                                      :::*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  提示:重启如果对应agent监听端口正常处于监听,说明我们的配置文件没有问题;

  在zabbix server上安装zabbix-get工具

[root@node03 ~]# yum install -y zabbix-get

  验证:在zabbix server上使用zabbix_get命令看看是否能够使用对应的key获取到数据呢?

[root@node03 ~]# zabbix_get -s 192.168.0.44 -p 10050 -k 'node04.os.Mem.free'
1594992
[root@node03 ~]# zabbix_get -s 192.168.0.44 -p 10050 -k 'node04.os.Mem.free'
1595248
[root@node03 ~]# zabbix_get -s 192.168.0.44 -p 10050 -k 'node04.os.Mem.free'
1595132
[root@node03 ~]# zabbix_get -s 192.168.0.44 -p 10050 -k 'node04.os.Mem.free'
1595008
[root@node03 ~]# 

  提示:可以看到在zabbix sever上能够使用zabbix_get工具获取到node04上我们自定义监控项的值;

  配置zabbix 使用自定义监控项,周期性的检测

  提示:调用自定义监控项,直接写对应的key即可;

  提示:可以看到对应的监控项已经采集到数据了;

  自定义带参监控项

  所谓带参监控项指使用一个key,传递不同的参数,采集不同的指标;

  示例:根据传递不同参数,来采集内存总量、空闲量、buffers等值

[root@node04 ~]# cat /etc/zabbix/zabbix_agentd.d/mem.conf
UserParameter=node04.os.Mem.free,free |awk '/^Mem/{print $4}' 
UserParameter=os.mem[*], awk '/^$1/ {print $$2}' /proc/meminfo 
[root@node04 ~]#

  提示:这里需要说明一点,在配置文件中使用$1表示引用传递给key的第一个参数,那么对应awk中的$1就需要写成$$1来表示awk自身的参数;以上配置表示使用os.mem这个key在中括号里支持参数,传递的参数将会被后面定义的命令中的$1引用;

  重启zabbix-agent,让其配置生效

[root@node04 ~]# systemctl restart zabbix-agent.service 
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:80                                       *:*                  
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::80                                      :::*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  验证:在zabbix server 上使用zabbix_get来获取指定key是否能够获取到数据?

[root@node03 ~]# zabbix_get -s node04 -p 10050 -k 'os.mem[MemTotal]'
1867048
[root@node03 ~]# zabbix_get -s node04 -p 10050 -k 'os.mem[MemFree]' 
1595552
[root@node03 ~]# zabbix_get -s node04 -p 10050 -k 'os.mem[Buffers]'
2108
[root@node03 ~]# 

  提示:可以看到在zabbix server上使用zabbix_get工具,给key传递不同的参数,获取到的数据也不尽相同;我们就可以基于这个key传递不同的参数来采集对应的指标数据;

  验证:在zabbix上使用我们自定义带参监控项周期性采集数据,看看是否能够采集到数据?

  提示:添加item对应key和参数即可;

  提示:可以看到在zabbix上使用指定带参监控项也能正常的采集到数据;

  3、模板

  模板是zabbix中快速添加配置监控的一种机制;它省去了我们大量重复的配置item,触发器,graph等等操作;它是一个逻辑的概念,只有当模板链接到某个主机才会生效;在zabbix也内建了很多模板,我们添加主机时,直接连接某个模板,对应主机就会继承连接的模板上定义的所有监控配置;模板可以导出和导入,也可以模板中嵌套模板;

  模板的使用

  链接某个模板到node04

  提示:在主机列表中找到对应主机,点击对应主机名称进入编辑主机配置界面,找到Templates子菜单,选择要链接的模板,点击add后再点击updete即可;

  提示:可以看到链接了某个模板以后,对应主机上就多了很多item,触发器和graphs等等,同时在templates下也显示了链接的某班名称;

  创建模板

  提示:在configuration--->Templates菜单下找到create template按钮,点击进入创建模板的界面;

  提示:填写好对应的名称和组点击add,一个模板就创建好了;

  提示:创建好一个空模板就有点类似我们添加了一个主机,上面没有任何监控配置,我们可以像在某个主机上定义监控项,触发,graph一样的操作在模板上定义监控项,触发器等等;

  取消模板链接

  提示:找到对应主机,进入编辑主机配置界面,进入templates子菜单,选择对应模板的操作;这里有unlink和unlink and clear两个操作,unlink表示取消链接模板,但之前收集的数据并不会删除,第二个unlink add clear表示取消链接的同时删除之前收集的数据;

  导入模板

  在zabbix share这个网站上有很多模板,我们可以选择一款模板下载下来导入到本地使用

  示例:找模板监控redis的模板

  提示:找到对应的代码托管地址,然后点击进入对应地址下载模板和agent配置文件;

  提示:下载上面两个文件,.conf文件是agent配置文件,在对应主机上下载放在agentd.d目录下;模板文件是.xml格式的文件,下载到本地上传至zabbix上;

  在node04上安装redis,telnet

[root@node04 ~]# yum install redis telnet -y

  修改redis配置文件,让其监听在node04的所有可用地址上

[root@node04 ~]# grep "^bind" /etc/redis.conf
bind 0.0.0.0
[root@node04 ~]# 

  启动redis

[root@node04 ~]# systemctl start redis
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:6379                                     *:*                  
LISTEN     0      128                          *:80                                       *:*                  
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::80                                      :::*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  将配置文件导入到zabbix agent配置目录下

[root@node04 ~]# wget https://raw.githubusercontent.com/cuimingkun/zbx_tem_redis/master/userparameter_redis_lld_plus.conf -O /etc/zabbix/zabbix_agentd.d/userparameter_redis_lld_plus.conf
--2020-11-20 23:16:36--  https://raw.githubusercontent.com/cuimingkun/zbx_tem_redis/master/userparameter_redis_lld_plus.conf
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.76.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.76.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1717 (1.7K) [text/plain]
Saving to: ‘/etc/zabbix/zabbix_agentd.d/userparameter_redis_lld_plus.conf’

100%[======================================================================>] 1,717       --.-K/s   in 0.08s   

2020-11-20 23:17:06 (20.8 KB/s) - ‘/etc/zabbix/zabbix_agentd.d/userparameter_redis_lld_plus.conf’ saved [1717/1717]

[root@node04 ~]# ll /etc/zabbix/zabbix_agentd.d/userparameter_redis_lld_plus.conf
-rw-r--r-- 1 root root 1717 Nov 20 23:17 /etc/zabbix/zabbix_agentd.d/userparameter_redis_lld_plus.conf
[root@node04 ~]# 

  修改zabbix agent配置文件和unit file,允许zabbix agent 以root身份运行

[root@node04 ~]# grep "^AllowRoot" /etc/zabbix/zabbix_agentd.conf                                               
AllowRoot=1
[root@node04 ~]# grep "^[User|Group]" /etc/systemd/system/multi-user.target.wants/zabbix-agent.service          
User=root
Group=root
[root@node04 ~]# 

  重启zabbix_agent

[root@node04 ~]# systemctl daemon-reload 
[root@node04 ~]# systemctl restart zabbix-agent.service 
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:6379                                     *:*                  
LISTEN     0      128                          *:80                                       *:*                  
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::80                                      :::*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  在zabbix web gui导入模板

  提示:在configuration--->Templates菜单下找到Import,点击进入导入模板的界面;

  提示:选择下载的模板,然后点击Import即可;

  查看导入的模板

  提示:可以看到我们的模板已经导入成功;

  链接导入的模板到node04,看看是否能够采集到对应的数据呢?

  提示:可以看到对应主机链接模板以后,多了两个自动发现的配置;其他的监控项,触发器都没有变,这是因为它这个模板是自动发现的配置,等它扫描完配置,对应的监控配置都会自动应用上去;

  查看是否能够采集到数据呢?

  提示:这个扫描配置和采集数据的过程稍微有点长,要耐心多等一会;

  现在查看主机列表,看看对应监控项和其他监控配置是否有变化呢?

  提示:可以看到现在就多了很多监控配置;好了从互联网下载的模板已经成功导入到zabbix并成功采集到数据;