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

前言

在最初搭建公司监控系统的时候,最头疼的是需要把同类项目组的相同图形添加到一个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()

总结

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

(0)

相关推荐

  • Python实现ssh批量登录并执行命令

    局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的.现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件,拷贝某些文件,批量关机等.如果一台一台得手工去操作,费时又费力,如果要进行多个操作就更麻烦啦. 或许你会想到网络同传,网络同传是什么?就是在一台电脑上把电脑装好,配置好,然后利用某些软件,如"联想网络同传"把系统原样拷贝过去,在装系统时很有用,只要在一台电脑上装好,同传以后所有的电脑都装

  • Python批量更改文件名的实现方法

    Python批量更改文件名的实现方法 前言: 由于后台数据有好多,但是文案提供过来的图片命名全部没有按照格式来命名,Python这么强大的语言,肯定是能够处理这个问题的,于是我就写了一个小脚本批量改文件名. 版本相关 操作系统:Mac OS X EI Caption Python版本:2.7 IDE:Sublime 思路 我的思路是这样的,在当前文件下创建一个新的目录newfile,然后把所有的文件拷贝过去重命名一下就行了 素材 文案提供过来的图片全部都是1.jpg,2.jpg--这样顺序递增的

  • Python实现文件内容批量追加的方法示例

    本文实例讲述了Python实现文件内容批量追加的方法.分享给大家供大家参考,具体如下: #coding:utf-8 import os #-------代码段一 #获取当前文件夹 filePath = os.getcwd() #获取当前文件列表 fileNameList = os.listdir(filePath) fileDirList = [] #获取文件路径列表 for fileName in fileNameList: fileDirList.append(os.path.join(fi

  • Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例

    本文实例讲述了Python3.4实现从HTTP代理网站批量获取代理并筛选的方法.分享给大家供大家参考,具体如下: 最近在写爬虫,苦于不采用代理的情况下,默认的IP不出几分钟就被封了,故而只能寻找代理.原以为找到HTTP代理就万事大吉了,没想到从那个网站获取的代理大部分都是不能用的,只有少部分能用...故而无奈之下,只能从那些代理网站大量获取代理IP,然后再拿过来进行进一步的筛选,将有效的代理IP提取出来,留待进一步使用. 筛选的主要原理是,通过main函数提取到未经筛选的代理rawProxyLi

  • Python爬取qq music中的音乐url及批量下载

    前言 qq music上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫.至少我觉得for循环爬虫,最核心的应该就是找到待爬元素所在url吧.下面开始找吧(讲的不对不要笑我) 实现如下 #寻找url: 这个url可不想其他的网站那么好找.把我给累得不轻,关键是数据多,从那么多数据里面挑出有用的数据,最后组合为music真正的music.昨天做的时候整理的几个中间url: #url1:https://c.y.qq.com/sos

  • Python实现批量检测HTTP服务的状态

    用Python实现批量测试一组url的可用性(可以包括HTTP状态.响应时间等)并统计出现不可用情况的次数和频率等. 类似的,这样的脚本可以判断某个服务的可用性,以及在众多的服务提供者中选择最优的. 需求以及脚本实现的功能如下: 默认情况下,执行脚本会检测一组url的可用性. 如果可用,返回从脚本所在的机器到HTTP服务器所消耗的时间和内容等信息. 如果url不可用,则记录并提示用户,并显示不可用发生的时间. 默认情况下,允许最大的错误次数是200,数目可以自定义,如果达到允许的最大错误次数,则

  • 批量获取及验证HTTP代理的Python脚本

    HTTP暴力破解.撞库,有一些惯用的技巧,比如: 1. 在扫号人人网时,我遇到单个账号错误两次,强制要求输入验证码,而对方并未实施IP策略. 我采用维护10万(用户名,密码) 队列的方式来绕过验证码.具体的做法是,当某个用户名.密码组合遇到需要验证码,就把该破解序列挂起,放到队列尾部等待下次测试,继续破解其他账号密码. 这样就可以保证2/3的时间都在进行正常破解和扫号. 2. 在破解美团网某系统账号时,我遇到了单个IP访问有一定限制,请求频率不可过快.于是我挂了72个 HTTP代理来解决这个问题

  • 【Python】Python的urllib模块、urllib2模块批量进行网页下载文件

    由于需要从某个网页上下载一些PDF文件,但是需要下载的PDF文件有几百个,所以不可能用人工点击来下载.正好Python有相关的模块,所以写了个程序来进行PDF文件的下载,顺便熟悉了Python的urllib模块和ulrllib2模块. 1.问题描述 需要从http://www.cvpapers.com/cvpr2014.html上下载几百个论文的PDF文件,该网页如下图所示: 2.问题解决 通过结合Python的urllib模块和urllib2模块来实现自动下载.代码如下: test.py #!

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

    前言 在最初搭建公司监控系统的时候,最头疼的是需要把同类项目组的相同图形添加到一个Screens,由于只能一个一个的添加,非常耗时耗经历. 下面分享两个脚本来解决这个头疼的问题. 1.将单个主机的所有图形添加到一个Screens 使用方法 #更改main()函数里的url.username.password #参数一:主机名 #参数二:筛选图名称 python zabbix_screen_host.py 'zabbixserver' 'zabbixserver' zabbix_screen_ho

  • Shell脚本批量添加扩展名的两种方法分享

    方法1: 复制代码 代码如下: for file in  `ls`; do mv $file $file.txt; done 方法2: 复制代码 代码如下: find . -type f |xargs -i mv {} {}.txt 还有一些试验不成功的,先记录在此. 1.用rename命令修改后缀名,这个是最简单最省事的办法 复制代码 代码如下: [root@demo test_rename]# ll 总计 20 -rw-r–r– 1 root root 0 09-27 00:57 renam

  • python 批量添加的button 使用同一点击事件的方法

    python 批量添加的button 使用同一点击事件根据传递的参数进行区分. def clear_text(): print '我只是个清空而已' def clear_text(index): print '我只是个清空而已' +str(index) button = Button(framet_title, text='清空', command=clear_text) 这样去设置,单个按钮对应单个点击事件没有问题的 如果你是 for i in Range(10): button = Butt

  • Python批量添加图片水印的实现

    目录 一.前言 二.文字水印 三.图片水印 一.前言 现在盗图是非常常见的事情,许多人在使用图片时都不会标注图片的出处或者提及作者,这个时候水印就是个很好的东西了.我们可以给图片添加水印后再分享出去,这样就可以让其它人知道图片作者相关的信息.今天我们就带大家来实现水印的添加. 二.文字水印 在添加水印的时候,我们比较常用的就是文字水印.比如@ZackSock.@juejin:ZackSock等.这种水印的添加非常简单,只需要使用到Pillow模块的添加文字的操作即可,代码如下: from PIL

  • Python处理时间戳和时间计算等的脚本分享

    由于实际需要,简要写了个小脚本,并打包生成exe,供无网络环境下使用 脚本1:显示当前时间与时间戳,以及10分钟后的时间与时间戳 # -*- coding: utf-8 -*- """ Project: pyWorkspace Creator: Administrator -haochuang Create time: 2021-05-12 09:24 IDE: PyCharm Introduction: """ import time impo

  • Windows2003下批量添加和导出所有ip BAT脚本

    批量添加IP 在cmd命令行下运行: 复制代码 代码如下: FOR /L %i IN (130,1,190) DO netsh interface ip add address "本地连接" 192.168.1.%i 255.255.255.192 往"本地连接"中添加"192.168.1.130~192.168.1.190"的所有IP,且子网掩码都是255.255.255.192 导出所有IP 写一个批处理bat文件,如下内容,运行 复制代码

  • Python批量提取PDF文件中文本的脚本

    本文实例为大家分享了Python批量提取PDF文件中文本的具体代码,供大家参考,具体内容如下 首先需要执行命令pip install pdfminer3k来安装处理PDF文件的扩展库. import os import sys import time pdfs = (pdfs for pdfs in os.listdir('.') if pdfs.endswith('.pdf')) for pdf1 in pdfs: pdf = pdf1.replace(' ', '_').replace('-

  • shell实现自动备份mysql、整站数据的两个脚本分享

    案例一:shell+cron实现MySQL自动备份且自动删除N天前备份 复制代码 代码如下: #!/bin/shDUMP=/usr/local/mysql/bin/mysqldumpOUT_DIR=/home/ldl/xxx/backup/LINUX_USER=ldl DB_NAME=ldlDB_USER=ldlDB_PASS=xxx#How much days backup mostDAYS=1 #Core of scriptcd $OUT_DIRDATE=`date +%Y_%m_%d`OU

  • 教你使用zabbix api批量添加数百台监控主机的方法

    在公司规模很庞大的时候,每次都手动添加监控主机将会很麻烦,我们可以利用zabbix的api去批量添加监控主机 本次我们将实现用一台主机虚拟出100台主机,并通过api的方式自动添加监控主机 掌握本次方法,无需要了解python,也不需要写python脚本 1.获取批量添加主机的api 可以从官网取到 https://www.zabbix.com/documentation/4.0/zh/manual/api/reference/host/create { "jsonrpc": &quo

  • python批量生成本地ip地址的方法

    本文实例讲述了python批量生成本地ip地址的方法.分享给大家供大家参考.具体分析如下: 这段代码用于在本地计算机上生成本地ip地址绑定到网卡,生成的是一个bat的批处理文件,运行此批处理文件,可以通过ipconfig查看 #!/usr/bin/python2.7 # -*- coding: utf-8 -*- # Filename: AddIPAliases.py import re,sys,socket,struct # 1. 判断IP地址是否合法: 2. 判断用户输入的IP是否在Clas

随机推荐