分布式监控系统Zabbix-批量添加聚合图形

之前部署了Zabbix(3.4.4版本)监控环境,由于主机比较多,分的主机组也比较多,添加聚合图形比较麻烦,故采用python脚本进行批量添加聚合图形。脚本下载地址:https://pan.baidu.com/s/1bpApIPp   (密码:wpts)脚本操作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
[root@zabbix01 ~]# cd /opt/
[root@zabbix01 opt]# ls
create_Disk_space_usage_screen.py  create_screen.py
 
======================================================================================
[root@zabbix01 opt]# cat create_screen.py
#!/bin/env python
import json
import urllib2
import argparse
import re
  
re_digits = re.compile(r'(\d+)')
  
def emb_numbers(s):
    pieces=re_digits.split(s)
    pieces[1::2]=map(int,pieces[1::2])
    return pieces
  
def sort_strings_with_emb_numbers2(alist):
    return sorted(alist, key=emb_numbers)
  
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': ['host']
              },
              'auth': auth,
              'id''2'
    }
    output = requestjson(url, values)
    for host in output['result'][0]['hosts']:
        host_list[host['host']]=(host['hostid'])
  
    #return host_list
    hosts_sort = []
    for host in sort_strings_with_emb_numbers2(host_list.keys()):
        hosts_sort.append(host_list[host])
    return  hosts_sort
  
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'
  
    graphs = []
    for host in host_list:
        values = ({'jsonrpc''2.0',
                   'method''graph.get',
                   'params': {
                       select: [selecttype, 'name'],
                       'output': ['graphid''name'],
                       'hostids': host,
                       'filter': {'name': name_list},
                       'sortfield''name'
                   },
                   'auth': auth,
                   'id''3'
                   })
        output = requestjson(url, values)
        bb = sorted(output['result'])
        if (graphtype == 0):
            for in bb:
                graphs.append(i['graphid'])
        if (graphtype == 1):
            for 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''600',
            'height''100',
            'x': str(x),
            'y': str(y),
            'colspan''1',
            'rowspan''1',
        })
        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 in graphids:
        values['params'][0]['screenitems'].append(i)
    output = requestjson(url, values)
  
def main():
    url = 'http://10.0.8.40/api_jsonrpc.php'
    username = 'Admin'
    password = 'qwkg@monitor'
    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()
 
 
======================================================================================
[root@zabbix01 opt]# cat create_Disk_space_usage_screen.py
#!/bin/env python
import json
import urllib2
import argparse
import re
  
re_digits = re.compile(r'(\d+)')
  
def emb_numbers(s):
    pieces=re_digits.split(s)
    pieces[1::2]=map(int,pieces[1::2])
    return pieces
  
def sort_strings_with_emb_numbers2(alist):
    return sorted(alist, key=emb_numbers)
  
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': ['host']
              },
              'auth': auth,
              'id''2'
    }
    output = requestjson(url, values)
    for host in output['result'][0]['hosts']:
        host_list[host['host']]=(host['hostid'])
  
    #return host_list
    hosts_sort = []
    for host in sort_strings_with_emb_numbers2(host_list.keys()):
        hosts_sort.append(host_list[host])
    return  hosts_sort
  
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'
  
    graphs = []
    for host in host_list:
        values = ({'jsonrpc''2.0',
                   'method''graph.get',
                   'params': {
                       select: [selecttype, 'name'],
                       'output': ['graphid''name'],
                       'hostids': host,
                       'filter': {'name': name_list},
                       'sortfield''name'
                   },
                   'auth': auth,
                   'id''3'
                   })
        output = requestjson(url, values)
        bb = sorted(output['result'])
        if (graphtype == 0):
            for in bb:
                graphs.append(i['graphid'])
        if (graphtype == 1):
            for 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''400',
            'height''400',
            'x': str(x),
            'y': str(y),
            'colspan''1',
            'rowspan''1',
        })
        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 in graphids:
        values['params'][0]['screenitems'].append(i)
    output = requestjson(url, values)
  
def main():
    url = 'http://10.0.8.40/api_jsonrpc.php'
    username = 'Admin'
    password = 'qwkg@monitor'
    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()
 
 
======================================================================================
上面两个脚本create_screen.py和create_Disk_space_usage_screen.py,脚本中只需要按照自己的实际zabbix访问情况修改三处:
url
username
password
 
前者用于批量生成负载、带宽、IO等监控的聚合图形,后者用于生成磁盘监控的聚合图形。
两个脚本唯一不同的就是width和height的值不一样。
 
 
批量生成聚合图形的操作如下:
[root@zabbix01 opt]# python create_screen.py  -g '财务系统'  -G 'Network traffic on bond0' -c 2 -n '财务系统---Network traffic on bond0'
[root@zabbix01 opt]# python create_screen.py  -g '财务系统'  -G 'CPU load' -c 2 -n '财务系统---CPU load'
[root@zabbix01 opt]# python create_screen.py  -g '财务系统'  -G 'CPU utilization' -c 2 -n '财务系统---CPU utilization'
[root@zabbix01 opt]# python create_screen.py  -g '财务系统'  -G 'Memory usage' -c 2 -n '财务系统---Memory usage'
[root@zabbix01 opt]# python create_screen.py  -g '财务系统'  -G 'Read and Write speed on /' -c 2 -n '财务系统---Read and Write speed on /'
[root@zabbix01 opt]# python create_screen.py  -g '财务系统'  -G 'Read and Write speed on /data' -c 2 -n '财务系统---Read and Write speed on /data'
[root@zabbix01 opt]# python create_Disk_space_usage_screen.py  -g '财务系统'  -G 'Disk space usage /' -c 3 -n '财务系统---Disk space usage /'
[root@zabbix01 opt]# python create_Disk_space_usage_screen.py  -g '财务系统'  -G 'Disk space usage /data' -c 3 -n '财务系统---Disk space usage /data'
 
 
对于以上命令中的参数解释:
-g    要显示zabbix的群组。
-G    要显示的zabbix图形。
-c    显示几列,注意要调整脚本里的:'width': ,'height':  参数来设置大小。
-n    在screen 里面显示的名称。
 
上面的命令的意思就是:把"财务系统"组里面每个服务器的bond0网卡、load负载、磁盘等监控图形,接每列4个图形(磁盘的按美3个图形)的显示在聚合图形里。
 
同理:如果添加其他主机组,即将上面的"财务系统" 统一替换掉即可!

分布式监控系统Zabbix-批量添加聚合图形

分布式监控系统Zabbix-批量添加聚合图形

***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************
本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/8129943.html,如需转载请自行联系原作者
上一篇:Hibernate让Model支持关联扩展属性


下一篇:使用ASP.NET动态生成图片