转 zabbix 自动发现和 zabbix自定义用户key与参数User parameters
########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]
##########below is sample
1.percona Mysql template
1.1 单实例
一、概述
zabbix自带的MySQL插件来监控mysql数据库,但是太过简陋了,对于我们dba来说,基本没有啥作用,所以需要做更详细的监控,而percona就有这个详细监控的模版以及脚本,正好拿过来用。
percona官网: www.percona.com
Percona组成介绍
1、PHP脚本 用来数据采集 (ss_get_mysql_stats.php)
2、shell脚本 用来调用采集信息 (get_mysql_stats_wrapper.sh)
3、zabbix配置文件
4、zabbix模板文件
5. 300秒的轮询间隔,现有PHP脚本用于收集和缓存MySQL度量,除了一些触发器特定的项之外。由于结果的缓存,PHP脚本每个周期只运行一次。
$cache_dir = '/tmp'; # If set, this uses caching to avoid multiple calls.
(以下都是在zabbix用户下调试)
6.整个流程
(ServerActive=10.0.0.106 #<====zabbix-server端的IP地址,主动方式)
Zabbix Agent /etc/zabbix/zabbix_agentd.d/ -〉读取 userparameter_percona_mysql.conf –〉调用 get_mysql_stats_wrapper.sh ix ->
调用 Php ->
二、安装及配置
1、下载及安装
https://www.percona.com/downloads/percona-monitoring-plugins/LATEST/
同时也支持Nagios和catcti
wget https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.7/binary/redhat/6/x86_64/percona-zabbix-templates-1.1.7-2.noarch.rpm
-〉1配置agent 配置
rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm
Scripts are installed to /var/lib/zabbix/percona/scripts
Templates are installed to /var/lib/zabbix/percona/templates
yum install percona-zabbix-templates php php-mysql -y
Installed:
php.x86_64 0:5.3.3-47.el6 php-mysql.x86_64 0:5.3.3-47.el6
Dependency Installed:
php-cli.x86_64 0:5.3.3-47.el6 php-common.x86_64 0:5.3.3-47.el6
php-pdo.x86_64 0:5.3.3-47.el6
Complete!
[root@devops-mysql-node1 ~]# rpm -ql percona-zabbix-templates
/var/lib/zabbix/percona
/var/lib/zabbix/percona/scripts
/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
/var/lib/zabbix/percona/templates
/var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf
/var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml 为MYSQL监控模板
-〉zabbix配置文件
将配置文件拷贝到/etc/zabbix/zabbix_agentd.d/目录
cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf
/usr/local/zabbix/etc/zabbix_agentd.conf.d/
More /usr/local/zabbix/etc/zabbix_agentd.conf.d/userparameter_percona_mysql.conf
(这里是支持扩展的脚本位置)
Useparameter=Mysql.rows-updated,****/get_mysql_stats_wrapper.sh ix
**
(Ensure zabbix_agentd.conf contains the line: Include=/etc/zabbix_agentd.conf.d/ )
->2。建立本地用户
(如下2个授权grant 命令都需要执行)
> GRANT PROCESS,SUPER,REPLICATION CLIENT ON *.* TO zabbix@'localhost' IDENTIFIED BY '123456';
> grant all privileges on *.* to zabbix@localhost;
> flush privileges;
> select user,host from mysql.user;
> quit;
-〉3。zabbix 脚本文件 ss_get_mysql_stats.php (重要,测试mysql 联通性 ,配置项目 使用用户/密码/本地socket连接)
1).vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
$mysql_user = 'root';
$mysql_pass = '123456';
$mysql_port = 3306;
$mysql_socket = '/db/mysql/data/mysqltmp/mysql.sock';
$mysql_flags = 0;
测试环境root密码为空,如果生产环境会创建专门只读账号。
2).同时注意:/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
以下参数定义缓存文件的具体位置
(如果port变量定义一个非默认的3306 端口,就会往/tmp 写入一个文件 t-mysql_cacti_stats.txt:$port)
$cache_file = "$cache_dir/$sanitized_host-mysql_cacti_stats.txt" . ($port != 3306 ? ":$port" : '');
注意:
测试1:(zabzabbix 用户下)
如果 密码 配置错误,
/usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg
会出现如下报错 :
root@centos6 ~]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
ERROR: run the command manually to investigate the problem: /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg
[root@centos6 ~]# /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg
ERROR: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)[root@centos6 ~]#
如果连接失败,可以使用如下PHP 测试下
#######
<?php
$i = 10000;
$host= 'localhost';
$user = 'dbmonopr';
$pass = 'dbmonoprommo11';
$port = 3307;
$socket = '/db/mysql/data/mysqltmp/mysql.sock';
$flags = 0;
while($i>=0) {
$conn = mysqli_init();
$link =mysqli_real_connect($conn, $host, $user, $pass, NULL, $port, $socket, $flags) or die(mysqli_connect_error());
$info = mysqli_get_host_info($conn);
$i--;
mysqli_close($conn);
unset($conn);
}
?>
###
2.-> zabbix 脚本文件 get_mysql_stats_wrapper.sh (如果mysql 端口 不是3306,而是3503。这个也需要修改)
修改1:第15行,如果是默认端口,不需要修改这一项
change
CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt"
to
CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt:3503"
修改2: 第19行 到25行,变量里加入“mysql 的绝对路径”和“用户和密码” 和 “2〉/dev/null”
change
19 行 到 25行修改如下:
to
RES=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql -uuser-pdbmonoprommo11 -e 'SHOW SLAVE STATUS\G' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | grep -i yes|wc -l`
if [ "$RES" -ne 2 ]; then
echo 1
else
RES1=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql -uuser-pdbmonoprommo11 -e 'SHOW SLAVE STATUS\G' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr '\n' ','`
if [ "$RES1" = " Yes, Yes," ]; then
echo 1
else
echo 0
fi
fi
exit
测试2:(root 用户下)
sudo -u zabbix -H /usr/local/zabbix/bin/get_mysql_stats_wrapper.sh running-slave
0
(正常情况下,应该返回0或者1,而不是“Access denied” 报错 )
/usr/local/zabbix/bin/get_mysql_stats_wrapper.sh running-slave
0
(正常情况下,应该返回0或者1,而不是“Access denied” 报错 )
需要改配置文件需要重启
/etc/init.d/zabbix-agent restart
或者
pkill zabbix
/usr/local/zabbix/sbin/*
测试3:(zabzabbix 用户下)
进行测试会返回测试结果
cd /var/lib/zabbix/percona/scripts/
./get_mysql_stats_wrapper.sh gm
0
./get_mysql_stats_wrapper.sh gw
20060
或者
/usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg
0
-q 解读:
(#!/usr/bin/php -q /* -*- c -*- */
3.打开 Debug (zabbix 用户下修改ss_get_mysql_stats.php,确保/tmp/1.log zabbix 用户有写的权限)
ss_get_mysql_stats.php
$debug = true;
$debug_log = '/tmp/1.log';
关闭debug
$debug = FALSE; # Define whether you want debugging behavior.
$debug_log = FALSE; # If $debug_log is a filename, it'll be used.
ss_get_mysql_stats.php 解读:
-〉首先判断语法 是否正确
ss_get_mysql_stats.php --host localhost --items gg
-〉 其次 语法正确,就会在输出 runquery SHOW /*!50000 ENGINE*/ INNODB STATUS,
'SHOW /*!50002 GLOBAL */ STATUS'
(如果键值在status没有定义,有可能新版本废弃了,那么返回值为-1)
-> 其次判断 如果cache_file 超过300秒,就会删除,重写一遍,如果不超过300秒,就不重写一遍。
->最后 如果有写的权限,就会写入一个临时文件 类似 localhost-mysql_cacti_stats.txt.port
附录:
主要运行的命令如下:run_query
命令如下:
SHOW MASTER LOGS
SHOW VARIABLES
SHOW STATUS
SHOW SLAVE STATUS
SHOW PROCESSLIST
SHOW INNODB STATUS
主要的检查项目如下:
$keys = array(
'Key_read_requests' => 'gg',
'Key_reads' => 'gh',
具体 各个属性的 缩写 请参考如下:
Php 连接调试
<?php
$host= 'localhost';
$conn = mysqli_init();
mysqli_real_connect($conn, NULL, 'dbmonopr', 'dbmonoprommo11', NULL, NULL, '/db/mysql/data/mysqltmp/mysql.sock');
?>
1.2 多实例
1台server 多个实例(即这些实例都绑定到同一个机器ip和不同端口)的问题,主要体现在采集端 需要适配多个server 进程
多个实例的监控用户和密码必须保持一致
1.1.-> zabbix 脚本文件 get_mysql_stats_wrapper.sh
12 行加入
PORT=$2
13 行 host 修改localhost为IP
HOST=”10.241.1.1”
15 行更改为 加入 --port $PORT
CMD="/usr/bin/php -q $DIR/ss_get_mysql_stats.php --host $HOST --items gg --port $PORT"
16行修改为:
将 CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt”
修改为
if [ $PORT == 3306 ];then
CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt"
else
CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt":$PORT
fi
如下2行修改为 加入-P$PORT
RES=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql -uuser-pdbmonoprommo11 -P$PORT -e 'SHOW SLAVE STATUS\G' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | grep -i yes|wc -l`
RES1=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql -uuser-pdbmonoprommo11 -P$PORT -e 'SHOW SLAVE STATUS\G' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr '\n' ','`
1.2 用户授权
(如下4个授权grant 命令都需要执行,一台服务器多个实例 监控 需要允许 监控账号远程登陆)
> GRANT PROCESS,SUPER,REPLICATION CLIENT ON *.* TO zabbix@'localhost' IDENTIFIED BY '123456';
> grant all privileges on *.* to zabbix@localhost;
> flush privileges;
> grant all privileges on *.* to zabbix@'%' identified by "123456";
> grant PROCESS,SUPER,REPLICATION CLIENT on *.* to zabbix@'%' identified by "123456";
> flush privileges;
--查询权限:
> select user,host from mysql.user;
>SELECT Repl_slave_priv,Repl_client_priv,super_priv,host FROM mysql.USER WHERE USER='zabbix ';
> quit;
测试5.1
(使用如下带IP,端口,用户名,密码的登陆方式必须成功 )
mysql -uroot –p123456 -h10.241.1.1 –P3307
mysql -uroot -p123456 -h10.241.1.1 -P3306
测试5.2:
(3306 和3307 分别对应着一台主机多个mysql 对外提供服务的 端口号,具体以实际为主,如下命令应该有数字返就是正常),
sh get_mysql_stats_wrapper.sh gg 3306
sh get_mysql_stats_wrapper.sh gg 3307
如果返回值为空的话,使用-x 进行调试:
sh –x get_mysql_stats_wrapper.sh gg 3306
2. zabbix 自动发现脚本文件mysql_low_discovery.sh
2.1 cp mysql_low_discovery.sh /var/lib/zabbix/percona/scripts/
chmod 755 /var/lib/zabbix/percona/scripts/*
2.2
(Use root) 注意:由于此处使用了 sudo ,所以要把zabbix用户加上sudo权限,且只能执行 ss命令
echo 'zabbix ALL=(ALL) NOPASSWD:/usr/sbin/ss'>>/etc/sudoers
echo 'zabbix ALL=(ALL) NOPASSWD:/bin/netstat'>>/etc/sudoers
3.修改ss_get_mysql_stats.php脚本
<=====端口和socket要改为NULL
$mysql_port = NULL;
$mysql_socket = NULL;
测试5.3
以下2条命令应该返回 数值
php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host 10.241.1.1 --items gg --port 3306
php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host 10.241.1.1 --items gg --port 3307
4.修改userparameter_percona_mysql.conf 配置文件
4.1 把每行中的逗号',' 替换为[*],
sed -in 's#,#[*],#g' userparameter_percona_mysql.conf
4.2 在每行后面添加 $1
sed -in 's#$# $1#g' userparameter_percona_mysql.conf
4.3 最后在 首行添加端口自动发现脚本 (以下为一行)
sed -in '1i UserParameter=MySQL.discovery,/bin/bash /var/lib/zabbix/percona/scripts/mysql_low_discovery.sh' userparameter_percona_mysql.conf
验证结果如下:
cat userparameter_percona_mysql.conf
测试6:zabbix 用户下执行mysql_low_discovery.sh
返回结果应该如下端口号,那就是正常:
测试7
(该测试是在zabbix server上做,等待5分钟,进行测试,返回结果应该出现 端口号 就是正确)
cd /usr/local/zabbix/bin/
->Server:
./zabbix_get -s 10.241.1.1 -k MySQL.discovery
Issue :
有的时候,在 主机监控 ,自动发现里 的 percona 多实例会报错 监控出现 unsupported key 报错
解决方法:
1.确认4.3 已经做,并且测试7 通过
2.然后重启zabbix agent
pkill zabbix
/usr/local/zabbix/sbin/*
3.一般10分钟,zabbix 才会重新检测 unsupported key 的定义
(实际情况,过了将近20分钟,unsupported key的报错才会取消)
-> Administration/General/通过右上角下拉框选择不同的项目完成相关配置和管理。
-> 如下图2-36所示。
5.导入模板
5.1 Zabbix 管理网页 模板 导入功能 (Mysql_Multiport.xml)
确认是否导入成功
1.显示已成功导入
2. 自动发现规则如下
注意: 所有的监控项目 都在自动发现规则 下
5.2 将主机 链接到这个新模板
Mysql_Multiport
注意:如果原有的主机已经添加了mysql 单机监控模板,
需要在网页端 删除掉原来的主机。 在重新添加 新加的监控模板(template/percona multiport template) 即可
ISSUE:
2、导入模板
标签无效 "/zabbix_export/date": "YYYY-MM-DDThh:mm:ssZ" 预计。
解决办法
将zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.7.xml导入zabbix2.4中再导出。之后将新的导出xml导入到3.2中问题解决。
或者使用
zbx_percona_mysql_template_v1导入
权限问题
Received value [rm: 无法删除"/tmp/localhost-mysql_cacti_stats.txt": 不允许的操作0] is not suitable for value type [Numeric (float)]
解决办法
cd /tmp
chown -R zabbix.zabbix localhost-mysql_cacti_stats.txt
/etc/init.d/zabbix-agent restart
或者
pkill zabbix
/usr/local/zabbix/sbin/*
3.添加监控项目
->Agent:
cd /usr/local/zabbix/bin/
(More /usr/local/zabbix/etc/zabbix_agentd.conf.d/userparameter_percona_mysql.conf
(这里是支持扩展的脚本位置)
Useparameter=Mysql.rows-updated,****/get_mysql_stats_wrapper.sh ix )
->Server:
./zabbix_get -s 10.241.1.1 -k MySQL.rows-updated
( below it from agent /usr/local/zabbix/bin/chk_mysql.sh)
->server
./zabbix_get -s 10.241.1.1 -k mysql.status[com_rollback]
---------------------
作者:思考v
来源:CSDN
原文:https://blog.csdn.net/xiegh2014/article/details/72859982
版权声明:本文为博主原创文章,转载请附上博文链接!