使用Zabbix的Python api去获取当前监控值

事前准备

有些时候我们需要在非zabbix的web界面里得到zabbix-server对某台服务器的实时监控值。但是有些值是zabbix-server加工过的,比如eth0入网流量,zabbix-server加工的方法如下:
akb48

可见是每秒的变量并且还乘了8,那么如果要得到这样加工过的值,想通过shell得到linux的指标无疑是十分麻烦的。那么对于这种需求,我们想到的第一个办法就是使用zabbix的api,通过api去获取值比爬网页要方便许多(而且zabbix-server的web页面不是那么好爬的)。

Zabbix 3.0的API官方文档:https://www.zabbix.com/documentation/3.0/manual/api
Zabbix 3.0的python版API官方文档:https://github.com/gescheit/scripts/tree/master/zabbix
这里我更推荐用python版的api,因为使用zabbix-api这个python第三方库让开发变得更为简洁。

安装zabbix-api

安装zabbix-api最方便的方法就是pip安装。本文的python版本2.7.15,使用源码安装的,安装包并不带pip,那么安装pip的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
yum install -y zlib-devel zlib openssl openssl-devel
mv /usr/bin/pip /usr/bin/pip-bak #备份原有的pip
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-12.0.3.tar.gz#md5=f07e4b0f4c1c9368fcd980d888b29a65
tar -zxvf setuptools-12.0.3.tar.gz
cd setuptools-12.0.3
python setup.py install #这一步需要上面刚安装的zlib
wget https://files.pythonhosted.org/packages/d0/92/1e8406c15d9372084a5bf79d96da3a0acc4e7fcf0b80020a4820897d2a5c/pip-7.1.2.tar.gz
#或者去https://pypi.org/project/pip/7.1.2/#files页面下载pip-7.1.2.tar.gz
tar -zxcf pip-7.1.2.tar.gz
cd pip-7.1.2
sudo python setup.py install
ln -s /usr/local/python27/bin/pip2.7 /usr/bin/pip #做一个新的快捷方式

有了pip之后,就可以安装zabbix-api,命令是:pip install zabbix-api 。在python的命令行里输入from zabbix_api import ZabbixAPI不报错就代表安装成功。

链接zabbix

通过zabbix-server鉴权的代码如下:

1
2
3
4
5
6
#coding:utf-8
#这个脚本是用来获取zabbix 定时流量值

from zabbix_api import ZabbixAPI
zapi = ZabbixAPI(server="http://网页地址/zabbix/api_jsonrpc.php")
zapi.login("网页的用户名", "网页的密码") #鉴权

如果没报错,就证明已经成功连接到zabbix-server了。

获取监控项

还是以eth0入网流量为例,获取它的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#coding:utf-8
#这个脚本是用来获取zabbix 定时流量值

from zabbix_api import ZabbixAPI
zapi = ZabbixAPI(server="http://网页地址/zabbix/api_jsonrpc.php")
zapi.login("网页的用户名", "网页的密码") #鉴权

hostname = ["服务器1名称","服务器2名称","服务器3名称","服务器4名称"]
for name in hostname:
list_item = zapi.item.get({"output": "extend","filter":{'host':name},"search":{'key_':'net.if.in[eth0]'}})
eth0_value = list_item[0]["lastvalue"]
print "Incoming traffic bandwidth is:"+(eth0_value)

可见多么简单!

上面代码里的hostname就是zabbix网页里的Host name,如图:
akb48

然后使用zapi.item.get方法通过filter来过滤,最后得到对应的key值。zapi下面还有很多方法,比如zapi.hostgroup.getzapi.host.getzapi.application.get等等等等,可以对于自己的需要,灵活运用。

参考文档

https://blog.csdn.net/LYJ_viviani/article/details/70568434
https://segmentfault.com/a/1190000014241994
http://blog.51cto.com/xiaofengfeng/1907573

akb48

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------