这篇笔记介绍下自定义监控,目的就是通过zabbix agent执行本地的python脚本(理论上执行什么语言的脚本都可以,只是我使用的环境是python就用python来举例了)获取返回值。Python的测试脚本也就一句话:print('1234')输出结果就是1234。
安装agent的时候有一个选项,支持远程执行命令,因此完成这个任务的方法有两个,一个是UserParameter,另一个就是远程执行命令。
一、远程执行命令
比较简单,就是把需要在CMD里面执行的命令写到zabbix监控项里面:
key值选择system.run[command,<mode>]
command 就是需要执行的命令
这里有坑:命令必须把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=<key>,<shell command>
#
# Mandatory: no
# Default:
# UserParameter=
UserParameter=zabbixtest, C:\Users\XXXX\AppData\Local\Programs\Python\Python38\python.exe C:\zabbixtest.py
格式就是这样 UserParameter=itemname, 要执行的命令。
Zabbix上添加监控项的时候key 就直接写这个 itemname就行了。这个也比较简单。
至此最基本的功能测试已经完成,完美。
但当我把测试脚本改成自己的脚本时,却报了错:“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')
执行结果
我实际应用:UserParameter=leafmem[*], C:\Users\XXX\AppData\Local\Programs\Python\Python38\python.exe C:\zabbix_sc_leafmem.py $1
完美!