zabbix的screen功能可以把graph聚合起来,统一进行展示,
我们的需求是把同一个主机组的同一个item聚合起来,比如一个screen显示同一个组的所有主机的内存使用率,达到类似ganglia的效果,
由于服务器较多,所以我们调用zabbix api来进行创建。
参考地址如下:谢谢各位大牛
https://www.zabbix.org/wiki/Python_script_to_create_Screen_from_all_Items/Graphs_of_a_host
http://caiguangguang.blog.51cto.com/1652935/1387401
http://john88wang.blog.51cto.com/2165294/1538456
脚本如下:适用于v2.2.11
import json import urllib2 import argparse def requestjson(url, values): data = json.dumps(values) req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'}) res = urllib2.urlopen(req, data) output = json.loads(res.read()) return output def authenticate(url, username, password): values = {'jsonrpc': '2.0', 'method': 'user.login', 'params': { 'user': username, 'password': password }, 'id': '0' } output = requestjson(url, values) return output['result'] def gethosts(groupname, url, auth): host_list = [] values = {'jsonrpc': '2.0', 'method': 'hostgroup.get', 'params': { 'output': 'extend', 'filter': {'name': groupname}, 'selectHosts': ['hostid'] }, 'auth': auth, 'id': '2' } output = requestjson(url, values) for host in output['result'][0]['hosts']: host_list.append(host['hostid']) return host_list def getgraphs(host_list, name_list, url, auth, columns, graphtype=0, dynamic=0): if (graphtype == 0): selecttype = ['graphid'] select = 'selectGraphs' if (graphtype == 1): selecttype = ['itemid', 'value_type'] select = 'selectItems' values = ({'jsonrpc': '2.0', 'method': 'graph.get', 'params': { select: [selecttype, 'name'], 'output': ['graphid', 'name'], 'hostids': host_list, 'filter': {'name': name_list}, 'sortfield': 'name' }, 'auth': auth, 'id': '3' }) output = requestjson(url, values) bb = sorted(output['result']) graphs = [] if (graphtype == 0): for i in bb: graphs.append(i['graphid']) if (graphtype == 1): for i in bb: if int(i['value_type']) in (0, 3): graphs.append(i['itemid']) graph_list = [] x = 0 y = 0 for graph in graphs: graph_list.append({ 'resourcetype': graphtype, 'resourceid': graph, 'width': '300', 'height': '100', 'x': str(x), 'y': str(y), 'colspan': '0', 'rowspan': '0', 'elements': '0', 'valign': '0', 'halign': '0', 'style': '0', 'url': '', 'dynamic': str(dynamic) }) x += 1 if x == int(columns): x = 0 y += 1 return graph_list def screencreate(url, auth, screen_name, graphids, columns): columns = int(columns) if len(graphids) % columns == 0: vsize = len(graphids) / columns else: vsize = (len(graphids) / columns) + 1 values = {'jsonrpc': '2.0', 'method': 'screen.create', 'params': [{ 'name': screen_name, 'hsize': columns, 'vsize': vsize, 'screenitems': [] }], 'auth': auth, 'id': 2 } for i in graphids: values['params'][0]['screenitems'].append(i) output = requestjson(url, values) def main(): url = 'http://10.0.0.141/zabbix/api_jsonrpc.php' username = 'admin' password = '__Q&(0sH1zNAdD' auth = authenticate(url, username, password) host_list = gethosts(groupname, url, auth) graph_ids = getgraphs(host_list, graphname, url, auth, columns) screencreate(url, auth, screen_name, graph_ids, columns) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-g', dest='groupname', nargs='+', metavar='groupname', type=str, help='which group you want to select') parser.add_argument('-G', dest='graphname', nargs='+', metavar='graphname', type=str, help='which graph you want to select') parser.add_argument('-c', dest='columns', metavar='columns', type=int, help='the screen columns') parser.add_argument('-n', dest='screen_name', metavar='screen_name', type=str, help='the screen name') args = parser.parse_args() groupname = args.groupname graphname = args.graphname columns = args.columns screen_name = args.screen_name main()
使用方法:
python create_screen.py -g servers -G 'Network traffic on em1' -c 4 -n 'servers Network traffic on em1'