python批量添加zabbix Screens的两个脚本分享


Posted in Python onJanuary 16, 2017

前言

在最初搭建公司监控系统的时候,最头疼的是需要把同类项目组的相同图形添加到一个Screens,由于只能一个一个的添加,非常耗时耗经历。

下面分享两个脚本来解决这个头疼的问题。

1.将单个主机的所有图形添加到一个Screens

使用方法

#更改main()函数里的url、username、password

#参数一:主机名

#参数二:筛选图名称

python zabbix_screen_host.py 'zabbixserver' 'zabbixserver'

zabbix_screen_host.py脚本内容

#!/usr/bin/env python
#zabbix_screen_host.py
import urllib2
import json
import argparse
def authenticate(url, username, password):
 values = {'jsonrpc': '2.0',
 'method': 'user.login',
 'params': {
  'user': username,
  'password': password
 },
 'id': '0'
 }
 data = json.dumps(values)
 req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
 response = urllib2.urlopen(req, data)
 output = json.loads(response.read())
 try:
 message = output['result']
 except:
 message = output['error']['data']
 print message
 quit()
 return output['result']
def getGraph(hostname, url, auth, graphtype, dynamic, columns):
 if (graphtype == 0):
 selecttype = ['graphid']
 select = 'selectGraphs'
 if (graphtype == 1):
 selecttype = ['itemid', 'value_type']
 select = 'selectItems'
 values = {'jsonrpc': '2.0',
 'method': 'host.get',
 'params': {
  select: selecttype,
  'output': ['hostid', 'host'],
  'searchByAny': 1,
  'filter': {
  'host': hostname
  }
 },
 'auth': auth,
 'id': '2'
 }
 data = json.dumps(values)
 req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
 response = urllib2.urlopen(req, data)
 host_get = response.read()
 output = json.loads(host_get)
 # print json.dumps(output)
 graphs = []
 if (graphtype == 0):
 for i in output['result'][0]['graphs']:
 graphs.append(i['graphid'])
 if (graphtype == 1):
 for i in output['result'][0]['items']:
 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": "500",
 "height": "100",
 "x": str(x),
 "y": str(y),
 "colspan": "1",
 "rowspan": "1",
 "elements": "0",
 "valign": "0",
 "halign": "0",
 "style": "0",
 "url": "",
 "dynamic": str(dynamic)
 })
 x += 1
 if x == columns:
 x = 0
 y += 1
 return graph_list
def screenCreate(url, auth, screen_name, graphids, columns):
 # print graphids
 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)
 data = json.dumps(values)
 req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
 response = urllib2.urlopen(req, data)
 host_get = response.read()
 output = json.loads(host_get)
 try:
 message = output['result']
 except:
 message = output['error']['data']
 print json.dumps(message)
 
def main():
 url = 'http://zabbixip/zabbix/api_jsonrpc.php'
 username = "***"
 password = "***"
 parser = argparse.ArgumentParser(description='Create Zabbix screen from all of a host Items or Graphs.')
 parser.add_argument('hostname', metavar='H', type=str,
  help='Zabbix Host to create screen from')
 parser.add_argument('screenname', metavar='N', type=str,
  help='Screen name in Zabbix. Put quotes around it if you want spaces in the name.')
 parser.add_argument('-c', dest='columns', type=int, default=3,
  help='number of columns in the screen (default: 3)')
 parser.add_argument('-d', dest='dynamic', action='store_true',
  help='enable for dynamic screen items (default: disabled)')
 parser.add_argument('-t', dest='screentype', action='store_true',
  help='set to 1 if you want item simple graphs created (default: 0, regular graphs)')
 args = parser.parse_args()
 hostname = args.hostname
 screen_name = args.screenname
 columns = args.columns
 dynamic = (1 if args.dynamic else 0)
 screentype = (1 if args.screentype else 0)
 auth = authenticate(url, username, password)
 graphids = getGraph(hostname, url, auth, screentype, dynamic, columns)
 print "Screen Name: " + screen_name
 print "Total Number of Graphs: " + str(len(graphids))
 screenCreate(url, auth, screen_name, graphids, columns)
if __name__ == '__main__':
 main()

2.将同组主机的同一图形添加到一个Screens

使用方法

#更改main()函数里的url、username、password

#-g :组名称

#-G:图形名称

#-n :筛选(screen)图名称

#-c : 一行有多少图形

python zabbix_screen_group.py -g 'zabbix' -G 'icmp-ping' -n 'zabbix-icmp-ping' -c 2

zabbix_screen_group.py脚本内容

#!/usr/bin/env python
import urllib2
import sys
import json
import argparse
 
#定义通过HTTP方式访问API地址的函数,后面每次请求API的各个方法都会调用这个函数
def requestJson(url,values): 
 data = json.dumps(values)
 req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
 response = urllib2.urlopen(req, data)
 output = json.loads(response.read())
# print output
 try:
 message = output['result']
 except:
 message = output['error']['data']
 print message
 quit()
 
 return output['result']
 
#API接口认证的函数,登录成功会返回一个Token
def authenticate(url, username, password):
 values = {'jsonrpc': '2.0',
  'method': 'user.login',
  'params': {
   'user': username,
   'password': password
  },
  'id': '0'
  }
 idvalue = requestJson(url,values)
 return idvalue
 
#定义更加主机分组名称获取各个hostid的函数
def getHosts(groupname,url,auth):
 host_list = []
 values = {'jsonrpc': '2.0',
  'method': 'hostgroup.get',
  'params': {
   'output': 'extend',
   'filter': {
   'name': groupname
   },
 
   'selectHosts' : ['hostid','host'],
  },
  'auth': auth,
  'id': '2'
  }
 output = requestJson(url,values)
 for host in output[0]['hosts']:
 host_list.append(host['hostid'])
 return host_list
 
#定义获取graphid的函数
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' : {
   'output' : ['graphid','name'],
   select : [selecttype,'name'],
   'hostids' : host_list,
   'sortfield' : 'name',
   'filter' : {
    'name' : name_list,
 
    },
   },
  'auth' : auth,
  'id' : 3
  })
 output = requestJson(url,values)
 bb = sorted(output,key = lambda x:x['graphid'])
 graphs = []
 if (graphtype == 0):
 for i in bb:
  print i
  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:
 print "x is " + str(x)
 print "y is " + str(y)
 graph_list.append({
  "resourcetype": graphtype,
  "resourceid": graph,
  "width": "500",
  "height": "100",
  "x": str(x),
  "y": str(y),
  "colspan": "1",
  "rowspan": "1",
  "elements": "0",
  "valign": "0",
  "halign": "0",
  "style": "0",
  "url": "",
  "dynamic": str(dynamic)
 })
 x += 1
# print type(x)
# print type(columns)
 if x == int(columns):
  x = 0
  y += 1
# print graph_list
 return graph_list
 
#定义创建screen的函数
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
 
#先使用screen.get判断给定的screen name是否存在
 values0 = {
  "jsonrpc" : "2.0",
  "method" : "screen.get",
  "params" : {
   "output" : "extend",
   "filter" : {
   "name" : screen_name,
    }
    },
  "auth" : auth,
  "id" : 2
  }
 values = {
  "jsonrpc": "2.0",
  "method": "screen.create",
  "params": {
   "name": screen_name,
   "hsize": columns,
   "vsize": vsize,
   "screenitems": []
  },
  "auth": auth,
  "id": 2
  }
 output0 = requestJson(url,values0)
 print output0
 
#如果给定的screen name不存在则直接创建screen 
 if output0 == []:
 print "The Given Screen Name Not Exists"
 print "Creating Screen %s" %screen_name
 for i in graphids:
  values['params']['screenitems'].append(i)
 output = requestJson(url,values)
 else:
 
 
#如果给定的screen name已经存在,直接创建screen是不行的,
#要么先使用screen.delete把原来的screen删除掉,然后再创建,
#要么直接使用screen.update更新原来那个screen,
#使用screen.delete会产生新的screenid,
#使用screen.update比较合理一点。
 print "The Given Screen Name Already Exists"
 update_screenid=output0[0]["screenid"]
 print update_screenid
 print "Updating Screen Name %s Screen ID %s" %(screen_name,update_screenid)
 values1 = {
  "jsonrpc" : "2.0",
  "method" : "screen.update",
  "params" : {
   "screenid" : update_screenid,
   "screenitems": []
    },
  "auth" : auth,
  "id" : 2
   }
 output1 = requestJson(url,values1)
 print output1
 print "Updating Screen Name %s" %screen_name
 for i in graphids:
  values1['params']['screenitems'].append(i)
 output = requestJson(url,values1)
 
def main():
 url = 'http://zabbixip/zabbix/api_jsonrpc.php'
 username = '****'
 password = '****'
 auth = authenticate(url, username, password)
 host_list = getHosts(groupname,url,auth)
 print host_list
 graph_ids = getGraphs(host_list,graphname, url, auth, columns)
 screenCreate(url, auth, screenname, graph_ids, columns)
if __name__ == '__main__':
 parser = argparse.ArgumentParser(description='Create Zabbix screen from all of a host Items or Graphs.')
 parser.add_argument('-G', dest='graphname', nargs='+',metavar=('grah name'),
   help='Zabbix Host Graph to create screen from')
 parser.add_argument('-H', dest='hostname', nargs='+',metavar=('10.19.111.145'),
   help='Zabbix Host to create screen from')
 parser.add_argument('-g', dest='groupname', nargs='+',metavar=('linux server'),
   help='Zabbix Group to create screen from')
 parser.add_argument('-n', dest='screenname', type=str,
   help='Screen name in Zabbix. Put quotes around it if you want spaces in the name.')
 parser.add_argument('-c', dest='columns', type=int,
   help='number of columns in the screen')
 args = parser.parse_args()
 print args
 hostname = args.hostname
 groupname = args.groupname
 screenname = args.screenname
 columns = args.columns
 graphname = args.graphname
 if columns is None:
 columns = len(graphname)
# print columns
 main()

总结

以上就是这篇文章的全部内容了,希望本文的内容的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python实现的检测web服务器健康状况的小程序
Sep 17 Python
python append、extend与insert的区别
Oct 13 Python
python解决网站的反爬虫策略总结
Oct 26 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
Feb 02 Python
python得到windows自启动列表的方法
Oct 14 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
python动态视频下载器的实现方法
Sep 16 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
python快速安装OpenCV的步骤记录
Feb 22 Python
基于python实现银行管理系统
Apr 20 Python
python一键升级所有pip package的方法
Jan 16 #Python
centos6.7安装python2.7.11的具体方法
Jan 16 #Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 #Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 #Python
python 根据pid杀死相应进程的方法
Jan 16 #Python
总结python实现父类调用两种方法的不同
Jan 15 #Python
利用python程序帮大家清理windows垃圾
Jan 15 #Python
You might like
php登陆页的密码处理方式分享
2013/10/14 PHP
php实现分页显示
2015/11/03 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
js中switch case循环实例代码
2013/12/30 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
Python执行时间的计算方法小结
2017/03/17 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
wxpython布局的实现方法
2019/11/01 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
旅游专业职业生涯规划范文
2014/01/13 职场文书
图书室管理制度
2014/01/19 职场文书
经销商培训邀请函
2014/01/21 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
标准化管理实施方案
2014/02/25 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
2014年行政部工作总结
2014/11/19 职场文书
个人事迹材料范文
2014/12/29 职场文书
文言文辞职信
2015/02/28 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技