[zabbix/使用API进行批量创建screen(聚合图形)]
2017-11-29 09:49
691 查看
因公司需求,需要根据主机名称(hostname)模糊匹配查询出来,进行批量添加聚合图形(网卡流量监控)
试着在网上找案例,发现均是代码 潦潦草草 复制一大片,无任何重点官方文档案例提笔带过
官方文档 网上 翻了个遍 找到了重点
思路点
需要从zabbix 数据库里面匹配传递进来的hostname模糊参数 进行匹配zabbix api hosts.get返回所有从数据库里面返回出来的hostsid
用返回的hostsid 请求
zabbix api graph.get(图形模版) 来匹配
graphid返回出来的
name为模版名称(这个很重要)
通过返回出来的
graphid再去请求
zabbix api screen.add创建聚合图形
至此,思路已经通了,和需求正是一样 下面开始 详解代码
当前目录下创建三个.py文件
QuerySet.py ### 查询数据库返回host主机 parame.py ### 请求的参数以及 mysql用户,密码 zabbixy用户,密码 screen_api.py ### 请求内容,返回结果
1: parame.py:
# -*- coding:utf-8 -*- mysql_user = 'root' mysql_host = 'localhost' mysql_pass = 'your MySQL Password' zabbix_user = 'your Zabbix user' zabbix_pass = 'your zabbix Password' host_get = { "jsonrpc": "2.0", "method": "host.get", ###此处为请求主机返回hostsid 的请求参数,当前为空,后期会append 进去 "params": { "filter": { "host": [ ] } }, "id": 1 } graph_get = { "jsonrpc": "2.0", "method": "graph.get", ###获取主机图形的方法 "params": { "output": "extend", "hostids":[], "sortfield": "name" }, "id": 1 } screen_add = { "jsonrpc": "2.0", "method": "screen.create",###创建图形方法 "params": { "hsize": 2, "vsize": 60, "screenitems": [ ] }, "id": 1 }
2: QuerySet.py:
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql as mysql import sys import re import parame def kwargs(args): ###连接数据库 conn = mysql.connect( host = parame.mysql_host, ###parame文件里面定义的host port = 3306, user = parame.mysql_user, ###parame文件里面定义的user passwd = parame.mysql_pass, ###parame文件里面定义的passwd db = 'zabbix', ) cur = conn.cursor() ###模糊查询传递进来的参数例如 cmb-he-sjz1-123-34-5- response = cur.execute('select host from hosts where host like %s',args) result1 = [ i for i in cur.fetchmany(response)] if len(result1) == 0: return False cur.close() conn.commit() conn.close() result = [] ###此处可以省略,因公司需求,名称前面带VIP的主机名不需要监控 for x in result1: if re.match('VIP',x[0]): pass else: result.append(x) ###排序,这块可以无视,将数据库查询出来的主机排序从小到大,一条命令就可以搞定 ###sorted(hosts, key=lambda x: int(x.split("-")[6])) ### 因为每个公司的主机名定义不一致,这块大家 如果没有排序需求 删掉就可以,直接return result after = [re.search('(.*?)-(.*?)-(.*?)-(.*?)-(.*?)-(.*?)-(.*?)',x[0]).group() for x in result] before = [int(y[0].split('-')[6]) for y in result] before.sort() response = [] z = 0 for result in after: response.append(result + str(before[z])) z += 1 return response if __name__ == '__main__': try: params = sys.argv[1] print(kwargs(params + '%')) except Exception as e: raise TypeError
2: screen_api.py:
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys import json import time import requests import parame import sys import re from QuerySet import kwargs class Api: def __init__(self): self.url = 'http://your addres /api_jsonrpc.php' self.headers = {'Content-Type': 'application/json'} auth = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": parame.zabbix_user, ###验证 "password":parame.zabbix_pass }, "id": 1, "auth":None, } response = requests.post(self.url,data=json.dumps(auth),headers=self.headers) self.authid = json.loads(response.text)['result'] ### auth的id def get_host(self,hosts): #数据库传递进来的主机参数 一大堆~ data = parame.host_get data['auth'] = self.authid ###将返回id 写进去 接口会验证这个唯一 if hosts: ### 判断是否为空 为空说明没有找到主机 直接退出 pass else: print("result not found") sys.exit(10) hosts = sorted(hosts, key=lambda x: int(x.split("-")[6])) ###这块是排序 QuerySet 已经做过了 没必要再写 for host in hosts: data['params']['filter']['host'].append(host) 将主机加入参数里面 response = requests.post(self.url,data=json.dumps(data),headers=self.headers) lists = json.loads(response.text)['result'] result = [ lists[i]['hostid'] for i in range(len(lists)) ] return result ###返回主机hostsid def graph_get(self,res): ###请求主机图形结果 hosts_id = self.get_host(res) ### 讲hostsid 赋值给hosts_id data = parame.graph_get data['auth'] = self.authid for hosts in hosts_id: data['params']['hostids'].append(hosts) response = requests.post(self.url,data=json.dumps(data),headers=self.headers) graph_id = json.loads(response.text)['result'] result = [] for index in range(len(graph_id)): ###循环遍布判断是否是网卡图形,需求不同意此处可以不用re 你们直接 append 就好 if re.search('Network traffic on em.',graph_id[index]['name']): result.append(graph_id[index]['graphid']) elif re.search('eth',graph_id[index]['name']): result.append(graph_id[index]['graphid']) else: pass return result def screen_add(self,graph_ids,screen_name): ###创建图形 response = self.graph_get(graph_ids) x = 0 ### x为行 此处的定义 取决于parame.screen_add 里面的hsize 和vsize 最多为 hsize - 1 or vsize -1 y = 0 ### y为列 parame.screen_add['params']['name'] = screen_name parame.screen_add['auth'] = self.authid for value in response: parame.screen_add['params']['screenitems'].append({ "resourcetype": 0, "resourceid": value, "width": "500", ###宽高度 "height": "100", "rowspan": 1, "colspan": 1, "x": x, "y": y }) if x == 1: ###此处判断 我们需求只需要两行一列 等于1 x为0 x = 0 y += 1 else: x += 1 time.sleep(0.01) response = requests.post(self.url,data=json.dumps(parame.screen_add),headers=self.headers) print(response.text) if __name__ == '__main__': try: func = Api() res = kwargs("%" + str(sys.argv[4]) + "%") ###数据库传递的参数 func.screen_add(res,str(sys.argv[2])) ### 聚合图形群组名 except Exception as e: print(e) print('--name 聚合图形组名 --hostname 匹配加入的主机') sys.exit(1)
展示结果
此刻正是我们需要的结果,有问题 欢迎在下方留言 QQ分享群340164542
相关文章推荐
- 使用python脚本创建zabbix screen(聚合图形)。
- 分布式监控系统Zabbix-批量添加聚合图形
- 使用jmeter进行批量数据创建
- 分布式监控系统Zabbix--使用Grafana进行图形展示
- 使用 OpenSSL API 进行安全编程-创建基本的安全连接和非安全连接
- 使用 OpenSSL API 进行安全编程--创建基本的安全连接和非安全连接
- 在Dreamweaver下创建一个php文件并用正确使用php“绘图函数”进行绘制图形时,图形却无法显示
- zabbix聚合图形创建脚本
- zabbix 批量添加聚合图形
- 通过zabbix自带api进行主机的批量添加操作
- 使用 PHP 5.0创建图形的巧妙方法(二)
- 企业信息化系统基础——AD:使用C#批量创建帐号
- Factory 定义一个接口,客户可以使用这个接口创建一个对象.同时,我们还可以控制对那个类进行实例化
- 如何恢复一个非用户sa创建的数据库,且使用原用户创建者进行访问
- 使用 OpenSSL API 进行安全编程,第 3 部分: 提供安全--服务
- 使用 OpenSSL API 进行安全编程
- No MFC,Only API——菜单的创建和使用
- No MFC,Only API--状态栏的创建和使用
- 使用 OpenSSL API 进行安全编程
- 使用SendMessage方法对窗体上的控件进行截图,该方法的思想就是把控件的句柄拿到,对控件发送WM_PAINT消息,并且把希望得到图形对象的句柄当作wParam参数传过去,这样就可以在图形对象得到想要得图形。