zabbix官方的二次开发文档看起来还是有点吃力的,不像使用zabbix看起来轻松点。可能是运维人员的原因,开发这块不是很专业。看了网上的教程,很多翻译了官方的api文档翻译了下,自己也尝试使用flask去获取下zabbix的主机组,先看下获取到的主机组列表截图如下:
目前就先获取主机组列表的信息,还没接着往下开发,其中展示前端代码如下(使用的jijia2模板):
<div class="container">
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
主机组
</div>
<ul class="list-group">
{% for result in response['result'] %}
<li class="list-group-item"><a
href="/zabbix/hosts?groupid={{ result['groupid'] }}">{{ result['name'] }}</a></li>
{% endfor %}
</ul>
</div>
</div>
</div>
获取zabbix分组的后台代码如下,zabbix二次开发请求和响应都是json格式的,请求如果传json,使用python每次都先需要json.dumps()一下,会比较麻烦,所以直接封装了一个zabbix_request方法,传入字典即可:
#获取zabbix分组信息
@app.route('/zabbix/groups', methods=['GET', 'POST'])
def zabbix_groups():
json_result = modules_zabbix.zabbix_auth()
if json_result:
response = json.loads(json_result)
data = {
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend"
},
"auth": response['result'],
"id": response['id']
}
response = modules_zabbix.zabbix_request(data)
if response:
#return response
response = json.loads(response)
return render_template('zabbix/groups.html', response = response)
method指定为hostgroup.get主要是获取主机组的信息,params现在看了官方文档,还不是很明白,请求先获取到了,后续看下能不能再深入理解了。把获取到的response转成字典传给前端就能进行展现了。
zabbix_request方法如下,传入字典的参数,返回的结果还是json格式的,注意header需要加入Content-Type为json的格式,官方文档有说了三个先其中一个即可:
def zabbix_request(data):
url = "http://xxx:xxx/zabbix/api_jsonrpc.php"
header = {"Content-Type": "application/json"}
data = json.dumps(data)
request = urllib2.Request(url, data)
for key in header:
request.add_header(key, header[key])
try:
result = urllib2.urlopen(request)
json_result = result.read()
result.close()
return json_result
except Exception as e:
return None
其中,还有比较重要的方法没讲到,zabbix_auth,由于zabbix的任务操作都需要先登录才能操作,所以封装了认证的方法。其中认证的方法如下,使用user.login方法进行登录,user为zabbix登录的用户名,password为密码,获取到的结果获取result和id即可登录。有个优化的地方,就是获取到的认证信息存入文件或者缓存中,如果过期再调这个方法进行认证:
def zabbix_auth():
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "xxx"
},
"id": 1
}
return zabbix_request(data)
最后附上本人的网络课堂地址,如有兴趣请点击: 实践哥