########31
https://www.cnblogs.com/yjt1993/p/10883345.html
1、概念
在配置Iterms的过程中,有时候需要对类似的Iterms进行添加,这些Iterms具有共同的特征,表现为某些特定的参数是变量,而其他设置都是一样的,例如:一个程序有多个端口,而需要对端口配置Iterms。再如,磁盘分区,网卡的名称等等,由于具有不确定性,古配置固定的Items会出现无法通用的问题。
Low level discovery的Key可以对网卡、文件系统等进行自动发现,当然也支持自定义。
Low level discovery的使用过程分如下两步:
(1)自动发现特定变量的名称。
(2)添加对变量的Items。
Zabbix中Low level discovery的Key返回值是一个JSON格式。查看Low level discovery Key返回格式如下:
2、案列
使用Zabbix监控Hadoop集群的进程。每台机器启动的进程不一样,而这个时候想要监控每一台机器的hadoop进程,就需要自动发现规则了,如果配置通用的模板,把每一个监控项(监控每一个hadoop的进程)都配置上,会发现每一台主机对有些监控项是不支持的。
zabbix客户端配置如下:
EnableRemoteCommands=1 开启远程执行命令,默认是0,当监控到hadoop进程掉了以后,自动启动。
Timeout=30 超时
StartAgents=8 开启处理线程
编写自动发现脚本如下:
[root@manager1 script_py 19:20:09]#cat hadoopDiscovery.py #!/usr/bin/env python3 import os import json with open("/data1/zabbix_sh/jps.txt", "r") as f: text_lst = [i.split("\n")[0] for i in f.readlines()] hadoopProcess = [] for i in text_lst: hadoopProcess += [{'{#hadoopProcessName}':i}] print(json.dumps({'data':hadoopProcess},sort_keys=True,indent=7,separators=(',',':')))
[root@manager1 script_py 19:20:12]#cat /data1/zabbix_sh/jps.txt 这里面存储的是当前节点本应该启动的进程 DataNode Master
执行效果如下:
(1)自定义Key,如下:
# cat /etc/zabbix/zabbix_agentd.d/hadoop_process.conf UserParameter=hadoop_process[*],sudo /data1/zabbix_sh/hadoopProcess.py $1 UserParameter=hadoop_state,sudo /data1/zabbix_sh/hadoopState.py UserParameter=hadoop.process.discovery,sudo /data1/zabbix_sh/hadoopDiscovery.py
hadoopProcess.py脚本如下:
# cat hadoopProcess.py #!/usr/bin/env python3 'this is a system monitor scripts' __author__="yjt" import os import sys def hadoop_program(): with open("/data1/zabbix_sh/jps.txt", "r") as f: list_jps = [i.split("\n")[0] for i in f.readlines()] job_value = [] # hadoop_process = ['JournalNode','ResourceManager','HMaster','DataNode','DFSZKFailoverController','QuorumPeerMain','HQuorumPeerMain','JobHistory','Kfaka','NodeManager','Worker','Master','HRegionServer','NameNode','PrestoServer','RunJar'] job_lst = os.popen('/data1/jdk/bin/jps').readlines() for i in job_lst: value = i.split()[1] if value != 'Jps': job_value.append(value) if sys.argv[1] in job_value: print(1 ) elif sys.argv[1] in list_jps: print(0) # else: # print(2) if __name__ == "__main__": if len(sys.argv) > 1: hadoop_program()
配置完重启zabbix客户端
测试,是否可以从server端获取到数据:
(2)web界面的配置:
1)创建一个模板:配置---> 模板--->创建模板
2)在改模板上创建自动发现规则:
3)自动发现规则配置
4)为这个模板创建原型的监控项
5)创建触发器:
6)创建图形:
到这里这个模板就创建好了。这个时候在创建主机的时候,关联这个模板看看效果,需要等待一段时间。效果如下:
第一台机器:
第二台机器:
OK
##########32
http://www.ttlsa.com/zabbix/zabbix-user-parameters/
为什么要自定义KEY
有时候我们想让被监控端执行一个zabbix没有预定义的检测,zabbix的用户自定义参数功能提供了这个方法。我们可以在客户端配置文件zabbix_angentd.conf里面配置UserParameter.
语法如下:
1 | UserParameter=key,command |
用户自定义参数包含一个key和一个命令,key必须整个系统唯一,配置好之后,重启客户端。
然后配置item,在key的位置填上我们自定义的key即可。
用户自定义参数里指定的脚本由zabbix agent来执行,最大可以返回512KB的数据.
用户自定义key实例
简单点的命令示例:
UserParameter=ping,echo 1
如果调用ping这个key,将会收到返回值1.
更复杂的命令示例:
UserParameter=mysql.ping,mysqladmin -uroot ping|grep -c alive
如果返回1表示MySQL运行中,如果返回0表示MySQL挂了
灵活的自定义key:
如下为灵活的用户自定义参数
1 | UserParameter=key[*],command |
参数 | 描述 |
Key | 唯一. [*]表示里面可以传递多个参数 |
Command | 需要执行的脚本,key的[]里面的参数一一对应$1到$9,一共9个参数。$0表示脚本命令. |
注意事项
1. 如果需要使用命令行里面出现$2这种变量,那么你要使用两个$$2,例如awk ’{ print $$2 }’,之前就遇到过这个问题,不停的测试自己脚本输出正常,但是zabbix却拿不到数据,原来是出在这里。为了防止和参数冲突,所以zabbix做了这个规定。
2. zabbix禁止使用一些不安全的参数,如下:
\ ' ” ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @
3. 从zabbix 2.0开始,zabbix返回文本数据可以是空格。
示例1
UserParameter=ping[*],echo $1
ping[0] - 将一直返回0
ping[aaa] - 将一直返回 'aaa'
示例2
UserParameter=mysql.ping[*],mysqladmin -u$1 -p$2 ping | grep -c alive
如下参数用于监控MYSQL,并且可以传递用户名和密码。
mysql.ping[zabbix,our_password]
示例3
统计一个文件中有多少行被匹配?
UserParameter=wc[*],grep -c "$2" $1
如下方法将会返回文件中出现指定字符的行数
wc[/etc/passwd,root]
wc[/etc/services,zabbix]