Zabbix UserParameter 用户自定义监控项(Windows)

????这篇笔记介绍下自定义监控,目的就是通过zabbix agent执行本地的python脚本(理论上执行什么语言的脚本都可以,只是我使用的环境是python就用python来举例了)获取返回值。Python的测试脚本也就一句话:print('1234')输出结果就是1234。

安装agent的时候有一个选项,支持远程执行命令,因此完成这个任务的方法有两个,一个是UserParameter,另一个就是远程执行命令。

一、远程执行命令

比较简单,就是把需要在CMD里面执行的命令写到zabbix监控项里面:

????key值选择system.run[command,]

????command 就是需要执行的命令

key

添加item

这里有坑:命令必须把python的绝对路径写上,否则执行不成功。害的我测试了好久才找到原因。

像这样:C:\Users\XXX\AppData\Local\Programs\Python\Python38\python.exe C:\zabbixtest.py

测试结果

二、UserParameter

这个需要在zabbix_agentd.conf文件里面添加对应的配置,如下参考:

????### Option: UserParameter

????# User-defined parameter to monitor. There can be several user-defined parameters.

????# Format: UserParameter=,

????#

????# Mandatory: no

????# Default:

????# UserParameter=

? ??UserParameter=zabbixtest, C:\Users\XXXX\AppData\Local\Programs\Python\Python38\python.exe C:\zabbixtest.py

格式就是这样?UserParameter=itemname, 要执行的命令。

Zabbix上添加监控项的时候key 就直接写这个 itemname就行了。这个也比较简单。

item

graph

至此最基本的功能测试已经完成,完美。

但当我把测试脚本改成自己的脚本时,却报了错:“Timeout while executing a shell script”

此处又有一个坑:实际应用的脚本执行时间大概在10秒左右,Zabbix对于agent的超时时间默认是3秒。需要同时修改服务器端的配置文件和客户端的配置文件。一开始只改了服务器端,测试又搞了我一下午。。。。。。泪。。。。。。

? ??zabbix_server.conf file

????# Specifies how long we wait for agent response (in sec)

????# Must be between 1 and 30

????Timeout=30

? ??zabbix_agentd.conf

????### Option: Timeout

????# Spend no more than Timeout seconds on processing.

????#

????# Mandatory: no

????# Range: 1-30

????# Default:

? ? #Timeout=3

????Timeout=30

结果

至此各项测试完美,看着各个监控项都有数,不再丢图,爽!!!

官方对于UerParameter高级应用的解释:

官方解释及举例各个

我对这个的理解就是动态参数,itemname[*]代表里面可以加任意多的参数,是一个数组的形式,中间可以用逗号隔开。后面要执行的命令可以调用前面的参数。$1是第一个参数,并非从0开始。

例如配置文件里面写:UserParameter=ping[*], echo $1

在zabbix添加监控项的key ping[10.1.1.1] 或者ping[10.120.1.1,10.1.1.2,10.1.1.3] 最后执行的时候都是 echo 10.120.1.1

在python脚本中可以用传参数的方式在要执行的脚本都把参数传进去,还拿之前举过的例子,监控ACI设备内存为例。我可以写一个脚本登陆设备去查内存,在这里的应用就是把设备的IP地址做为参数传进去。python的argv,不会的可以去百度一下,还是比较简单的。

举个例子:

测试脚本如下:

? ??import sys

????print(str(sys.argv))

????print(sys.argv[0])

????print(sys.argv[1])

????print(len(sys.argv))

????if len(sys.argv)>=2:

? ? ????print('>=2')

执行结果

python传参数

我实际应用:UserParameter=leafmem[*], C:\Users\XXX\AppData\Local\Programs\Python\Python38\python.exe C:\zabbix_sc_leafmem.py $1

item

完美!

graph