ZABBIX根据IP列表,主机描述,或IP子网批量创建主机的维护任务

有时候被ZABBIX监控的主机可能需要关机重启等维护操作,为了在此期间不触发告警,需要创建主机的维护任务,以免出现误告警

ZABBIX本身有这个API可供调用(不同版本细节略有不同,本次用的ZABBIX6.*),实现批量化建立主机的维护任务

无论哪种方式(IP列表,主机描述,或IP子网)创建维护,都是向maintenance.create这个方法传递参数的过程,除了起始和终止的时间,最主要的一个参数就是hostids这个参数,它是一个列表(也可以是单个hostid)

    def create_host_maintenance(self,names,ips,starttimes,stoptimes):

        starts=self.retimes(starttimes)
        stops=self.retimes(stoptimes)

        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method":"maintenance.create",
                           "params": {
	                        "name": names,
	                        "active_since": starts,
	                        "active_till": stops,
	                        #"hostids": [ "12345","54321" ],
                            "hostids": ips,
	                        "timeperiods": [
                             {
                                "timeperiod_type": 0,
		                        "start_date": starts,
		                        #"start_time": 0,zabbix6不用这个参数,低版本的有用
                                 "period": int(int(stops)-int(starts))
                                }
                                            ]
                                     },
            "auth": self.authID,
            "id": 1,
        })

        request = urllib2.Request(self.url, data)
        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            print "Error as ", e
        else:
            response = json.loads(result.read())
            result.close()
            print "maintenance is created!"

1.简单说明hostids这个列表参数产生的过程

按IP列表产生hostids的LIST,并调用方法创建维护

def djmaintenanceiplist(self,ipliststr="strs",area="none",byip="none"):
	lists = []
	if area=="none":                                #通过IP列表来创建维护,只向函数传递ipliststr这个参数,其它参数为空
		for line in ipliststr.splitlines():
			con = line.split()
			ipaddr = con[0].strip()
			hostids = self.host_getbyip(ipaddr)
			if hostids != "error" and hostids not in lists:
				lists.append(hostids)
		return lists
	else:
		if area !="ip" and ipliststr != "strs":    #按主机描述匹配创建维护,ipliststr参数因定为strs,area参数为主机描述,byip参数为空(因为网络环境的原因,本例弃用这个条件)
			sqls="select hostid from zabbixdb.hosts where name like '%"+area+"%' "
			tests=pysql.conn_mysql()
			datas=tests.query_mysqlrelists(sqls)
			if datas != "error":
				for ids, in datas:
					if ids not in lists:
						lists.append(ids)
		else:
			if byip != "none":                     #按主机IP子网创建维护,byip参数不为空(因为网络环境的原因,本例弃用这个条件)
				sqls = "select hosts.hostid from zabbixdb.hosts,zabbixdb.interface where `hosts`.hostid=interface.hostid and (interface.ip like '%" + byip + "%' or hosts.name like '%" + byip + "%')"
				tests = pysql.conn_mysql()
				datas = tests.query_mysqlrelists(sqls)
				if datas != "error":
					for ids, in datas:
						if ids not in lists:
							lists.append(ids)

		return lists


def djiplist(self,starttime,stoptime,strlins):  #strlins为IP列表的参数,可由WEB前端传递进来
	test = ZabbixTools()
	test.user_login()
	lists = test.djmaintenanceiplist(strlins)
	nowtime = str(time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())))
	test.create_host_maintenance(nowtime, lists, starttime, stoptime)

按主机描述和IP子网产生hostids的LIST,并调用方法创建维护

def djdescript(self,starttime,stoptime,descstr,ipnets="none"):
	lists = []
	if descstr != "ip":          #descstr参数不为ip的时候,表示根据主机的描述信息匹配创建维护,此时不传递innets参数
		for line in descstr.splitlines():
			con = line.split()
			descstrnew = con[0].strip()
			sqls = "select hostid from dbname.hosts where name like '%" + descstrnew + "%' "
			tests = pysql.conn_mysql()
			datas = tests.query_mysqlrelists(sqls)
			if datas != "error":
				for ids, in datas:
					if ids not in lists:
						lists.append(ids)

	else:
		if ipnets != "none":    #ipnets参数不为空,表示按照IP子网匹配创建维护,此时descstr参数一定为"ip"
			sqls = "select hosts.hostid from dbname.hosts,dbname.interface where `hosts`.hostid=interface.hostid and (interface.ip like '%" + ipnets + "%' or hosts.name like '%" + ipnets + "%')"
			tests = pysql.conn_mysql()
			datas = tests.query_mysqlrelists(sqls)
			if datas != "error":
				for ids, in datas:
					if ids not in lists:
						lists.append(ids)

	test = ZabbixTools()
	test.user_login()
	nowtime = str(time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())))
	test.create_host_maintenance(nowtime, lists, starttime, stoptime)

2.create_host_maintenance和djmaintenanceiplist,及djdescript函数调用方法的说明

时间转换函数self.retimes,将用户传递/的"%Y-%m-%d %H:%M:%S"日期时间转换为时间时间戳

    def retimes(self,times):
        timeArray = time.strptime(times, "%Y-%m-%d %H:%M:%S")
        timestamp = time.mktime(timeArray)
        return timestamp

self.host_getbyip(ipaddr)通过主机IP获取zabbix的hostid,这个方法应用很广泛

函数中的self.authID通过zabbix的API 的"user.login"方法获取,参考ZABBIX官方文档

    def host_getbyip(self,hostip):
        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method":"host.get",
                           "params":{
                                     "output":["hostid","name","status","available"],
                                     "filter": {"ip": hostip,"custom_interfaces":0}
                                     },
                     
                            "auth":self.authID,
                           "id":1,
                           })

        request = urllib2.Request(self.url, data)
        for key in self.header:
            request.add_header(key, self.header[key])
        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            if hasattr(e, 'reason'):
                print 'We failed to reach a server.'
                print 'Reason: ', e.reason
            elif hasattr(e, 'code'):
                print 'The server could not fulfill the request.'
                print 'Error code: ', e.code
        else:
            response = json.loads(result.read())
            result.close()
            lens=len(response['result'])
            if lens > 0:
                return response['result'][0]['hostid']
            else:
                print "error "+hostip
                return "error"
pysql.conn_mysql()的实现
#coding:utf-8
import pymysql
class conn_mysql:
    def __init__(self):
        self.db_host = 'zabbixdbip'
        self.db_user = 'dbusername'
        self.db_passwd = 'dbuserpassword'
        self.database = "dbname"

    def query_mysqlrelists(self, sql):
        conn = pymysql.connect(host=self.db_host, user=self.db_user, passwd=self.db_passwd,database=self.database)
        cur = conn.cursor()
        cur.execute(sql)
        data = cur.fetchall()
        cur.close()
        conn.close()
        #print data
        # 查询到有数据则进入行判断,row有值且值有效则取指定行数据,无值则默认第一行
        if data != None and len(data) > 0:
            return data
            #调用方式:for ids, in datas:
        else:
            return "error"
        #此方法返回的数据不含数据库字段的列表,如果要返回包含列名(KEY)的字典列表,则:conn = pymysql.connect(host=self.db_host, user=self.db_user, passwd=self.db_passwd,database=self.database,cursorclass=pymysql.cursors.DictCursor)  解决:tuple indices must be integers, not str

3.VIEWS.PY及前端和前端伟递参数的说明

views.py对应的方法

#@login_required
def zabbixmanage(request):
    if request.method=="POST":
        uptime = request.POST.get('uptime')
        downtime= request.POST.get('downtime')

        UTC_FORMAT = "%Y-%m-%dT%H:%M"
        utcTime = datetime.datetime.strptime(uptime, UTC_FORMAT)
        uptime = str(utcTime + datetime.timedelta(hours=0))
        utcTime = datetime.datetime.strptime(downtime, UTC_FORMAT)
        downtime = str(utcTime + datetime.timedelta(hours=0))

        if request.POST.has_key('iplists'):
            try:
                sqlstr=request.POST.get("sqlstr")
                u1=upproxy.ZabbixTools()  #前面的python文件名为upproxy.py,类名为ZabbixTools
                u1.djiplist(uptime,downtime,sqlstr)
            except Exception:
                return render(request,"zbx1.html",{"login_err":"FAILSTEP1"})
        if request.POST.has_key('descs'):
            try:
                sqlstr = request.POST.get("sqlstr")
                u1 = upproxy.ZabbixTools()  
                u1.djdescript(uptime,downtime,sqlstr)
            except Exception:
                return render(request,"zbx1.html",{"login_err":"FAILSTEP2"})
        if request.POST.has_key('ipnets'):
            try:
                sqlstr = request.POST.get("sqlstr")
                u1 = upproxy.ZabbixTools()
                u1.djdescript(uptime,downtime,"ip",sqlstr)
            except Exception:
                return render(request,"zbx1.html",{"login_err":"FAILSTEP3"})

HTML的简单写法,不太会写,很潦草

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>ZABBIXMANAGE</title>
</head>
<body>
	<div id="container" class="cls-container">
		<div id="bg-overlay" ></div>
		<div class="cls-header cls-header-lg">
			<div class="cls-brand">
                <h3>ZABBIX主机维护模式</h3>
                <h4>开始时间小于结束时间</h4>
			</div>
		</div>
		<div class="cls-content">
			<div class="cls-content-sm panel">
				<div class="panel-body">

					<form id="loginForm" action="{% url 'zabbixmanage' %}" method="POST"> {% csrf_token %}
						<div class="form-group">
							<div class="input-group">
								<div class="input-group-addon"><i class="fa fa-user"></i></div>
                                <textarea type="text" class="form-control" name="sqlstr" placeholder="IP列表,关键字或者IP网段" style="width:300px;height:111px"></textarea></br>
							</div>
						</div>
                        </br></br>
                        开始时间:<input type="datetime-local" name="uptime">
                        </br></br>
                        结束时间:<input type="datetime-local" name="downtime">
                        </br></br>
                        <p class="pad-btm">按IP列表维护:按行输入IP列表加入维护,一行一个IP,多行输入</p>
                        <p class="pad-btm">按关键字匹配:主机描述信息的关键字匹配的加入维护,一般用于虚拟机宿主机和关键字匹配</p>
                        <p class="pad-btm">匹配子网关键字维护:IP网段匹配的加入维护,一次填写一个子网,多个子网多次设置,写法示例:172.16.</p>
						<button class="btn btn-success btn-block" type="submit" name="iplists">
							<b>按IP列表维护一般情况用这个就行</b>
						</button>
                        </br></br>
                        <button class="btn btn-success btn-block" type="submit" name="descs">
							<b>按关键字匹配</b>
						</button>
                        <button class="btn btn-success btn-block" type="submit" name="ipnets">
							<b>匹配子网关键字维护</b>
						</button>
                        <h4 style="color: red"><b>{{ login_err }}</b></h4>
					</form>
				</div>
			</div>
		</div>		
	</div>
</body>
</html>

跑起来大约是这个界面,用户填写主机IP列表,或匹配的描述,或子网的信息,选好时间,点个按钮就能实现批量的维护任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/327565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cellinx NVT 摄像机 UAC.cgi 任意用户创建漏洞复现

0x01 产品简介 Cellinx NVT IP PTZ是韩国Cellinx公司的一个摄像机设备。 0x02 漏洞概述 Cellinx NVT 摄像机 UAC.cgi接口处存在任意用户创建漏洞,未经身份认证的攻击者可利用此接口创建管理员账户,登录后台可查看敏感信息,使系统处于极不安全的状态。 0x03 复现环境 FO…

Nas群晖中搭建自己的图片库

1、在套件中心下载synology phtotos 2、点击打开&#xff0c;右上角头像设置中配置 3、这样子就是已经完成了&#xff0c;可以把你的图片进行上传 4、嫌弃上传麻烦的&#xff0c;可以直接去根目录复制粘贴 5、访问 这样子就可以直接访问了

Rust-析构函数

所谓“析构函数”(destructor),是与“构造函数”(constructor)相对应的概念。 “构造函数”是对象被创建的时候调用的函数&#xff0c;“析构函数”是对象被销毁的时候调用的函数。 Rust中没有统一的“构造函数”这个语法&#xff0c;对象的构造是直接对每个成员进行初始化完…

系列十一、Spring Security登录接口兼容JSON格式登录

一、Spring Security登录接口兼容JSON格式登录 1.1、概述 前后端分离中&#xff0c;前端和后端的数据交互通常是JSON格式&#xff0c;而Spring Security的登录接口默认支持的是form-data或者x-www-form-urlencoded的&#xff0c;如下所示&#xff1a; 那么如何让Spring Securi…

面试狗面试指南系列(1/5): 做好面试需要的一切准备

面试狗&#xff0c;是一群叛逆的程序员开发的远程面试助手&#xff0c;已经帮1000朋友顺利拿到offer&#xff01; 它可以&#xff1a; 实时识别面试官语音&#xff0c;自动提取关键问题最先进的GPT4加持&#xff0c;按照方便快速阅读的方式高效组织结果&#xff0c;快速展示重…

洗地机哪个品牌的好用?目前口碑最好的洗地机

近年来&#xff0c;随着科技的不断进步和人们对生活质量要求的提高&#xff0c;洗地机已经成为家庭和商业清洁的必备工具之一。但是随之而来的问题是&#xff0c;市面上的洗地机品牌繁多&#xff0c;质量参差不齐&#xff0c;消费者很难在众多选择中找到一款质量好又耐用的产品…

计算机毕业设计 基于Java的手机销售网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

2024创业方向,必火的创业项目推荐

有人说我辛辛苦苦的上班还这么穷&#xff0c;这个世界太不公平&#xff0c;但是我要跟你说一个更扎心的事实啊&#xff0c;就是因为你兢兢业业的上班&#xff0c;所以你才这么穷。那么就有人要说了&#xff0c;不上班我能干嘛&#xff1f;这就是大多数人的一个思维&#xff0c;…

阿里巴巴的第二代通义千问可能即将发布:Qwen2相关信息已经提交HuggingFace官方的transformers库

本文来自DataLearnerAI官方网站&#xff1a;阿里巴巴的第二代通义千问可能即将发布&#xff1a;Qwen2相关信息已经提交HuggingFace官方的transformers库 | 数据学习者官方网站(Datalearner) 通义千问是阿里巴巴开源的一系列大语言模型。Qwen系列大模型最高参数量720亿&#xf…

在linux环境下安装lnmp

lnmp官网&#xff1a;https://lnmp.org 一&#xff1a;lnmp安装 参考&#xff1a;https://lnmp.org/install.html 1&#xff1a;下载lnmp安装包 wget https://soft.lnmp.com/lnmp/lnmp2.0.tar.gz -O lnmp2.0.tar.gz 2&#xff1a;解压lnmp安装包 tar zxf lnmp2.0.tar.gz …

JMeter 源码解读HashTree

背景&#xff1a; 在 JMeter 中&#xff0c;HashTree 是一种用于组织和管理测试计划元素的数据结构。它是一个基于 LinkedHashMap 的特殊实现&#xff0c;提供了一种层次结构的方式来存储和表示测试计划的各个组件。 HashTree 的特点如下&#xff1a; 层次结构&#xff1a;Ha…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 第1章 HTML5+CSS3初体验 项目1-2 许愿墙

项目展示 在生活中&#xff0c;许愿墙是一种承载愿望的实体&#xff0c;来源于“许愿树”的习俗。后来人们逐渐改变观念&#xff0c;开始将愿望写在小纸片上&#xff0c;然后贴在墙上&#xff0c;这就是许愿墙。随着互联网的发展&#xff0c;人们又将许愿墙搬到了网络上&#…

hcip-4

ISIS:中央系统到中央系统 基于OSI模型开发&#xff1b; 集成的ISIS&#xff0c;基于OSI开发后转移到TCP/IP模型执行&#xff1b; 故集成的ISIS既可以在OSI模型&#xff0c;也可在TCP/IP模型工作&#xff1b; ISIS是在ISP中使用的一个IGP协议&#xff0c;其归属于无类别链路状…

系统性学习vue-vue核心

做了三年前端,但很多系统性的知识没有学习 还是从头系统学习一遍吧 课程是b站的Vue2.0Vue3.0课程 后续还会学习的如下,就重新开一篇了,不然太长,之后放链接 vue组件化编程 vue-cli 脚手架 vue中的ajax vue-router vuex element-ui vue3 老师推荐的vscode针对vue的插件: Vue 3…

Invalid bound statement (not found)(xml文件创建问题)

目录 解决方法&#xff1a; 这边大致讲一下我的经历&#xff0c;不想看的直接点目录去解决方法 今天照着老师视频学习&#xff0c;中间老师在使用动态SQL时&#xff0c;直接复制了一份&#xff0c;我想这么简单的一个&#xff0c;我直接从网上找内容创建一个好了&#xff0c;…

新能源汽车智慧充电桩方案:如何实现充电停车智慧化管理?

一、方案概述 基于新能源汽车充电桩的监管运营等需求&#xff0c;安徽旭帆科技携手合作伙伴触角云共同打造“智能充电设备&#xff0b;云平台&#xff0b;APP小程序”一体化完整的解决方案&#xff0c;为充电桩车位场所提供精细化管理车位的解决办法&#xff0c;解决燃油车恶意…

推荐几款常用测试数据自动生成工具(适用自动化测试、性能测试)

一、前言 在软件测试中&#xff0c;测试数据是测试用例的基础&#xff0c;对测试结果的准确性和全面性有着至关重要的影响。因此&#xff0c;在进行软件测试时&#xff0c;需要生成测试数据以满足测试场景和要求。本文将介绍如何利用测试数据生成工具来快速生成大量的测试数据。…

【RTOS】快速体验FreeRTOS所有常用API(11)打印空闲栈、CPU占用比

目录 十一、调试11.1 打印任务空闲栈11.2 打印所有任务栈信息11.3 CPU占用比11.4 空闲任务和钩子函数 十一、调试 该部分在上份代码基础上修改得来&#xff0c;代码下载链接&#xff1a; https://wwzr.lanzout.com/in63o1lauwwh 密码:9bhf 该代码尽量做到最简&#xff0c;不添加…

基于ssm的学籍管理系统论文

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

༺༽༾ཊ—设计-七个-05-原则-模式—ཏ༿༼༻

第五原则&#xff1a;里氏替换原则 所有基类出现的地方必定能被子类替换&#xff0c;且功能不发生影响 例子&#xff1a;构造函数中参数基类出现的地方 在主类中可以被子类替换&#xff0c;且不改变功能 我们在编写代码时要带有里氏替换原则的思想编写&#xff0c;考虑子类在继…