python自动统计zabbix系统监控覆盖率的示例代码
作者:huss 发布时间:2023-11-14 08:23:03
标签:python,统计,zabbix
脚本主要功能:
1)通过zabbix api接口采集所有监控主机ip地址;
2)通过cmdb系统(蓝鲸)接口采集所有生产主机IP地址、主机名、操作系统、电源状态;
3)以上2步返回数据对比,找出未监控主机ip地址,生成csv文件;
4)发送邮件。
脚本如下:
#!/usr/bin/python
#coding:utf-8
import requests
import json
import re
import time
import csv
from collections import Counter
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
# 从cmdb系统获取虚拟化生产主机ip
def getCmdbProdHost():
url1 = 'http://paas.xxxx.com/api/c/compapi/v2/cc/search_inst/'
data1 = {
"bk_app_secret": "**********************",
"bk_app_code": "bk_cmdb",
"bk_username": "admin",
"bk_obj_id": "host",
"page": {
"start": 0,
"limit": 2000,
"sort": "bk_inst_id"
},
"fields": {
"host": [
"bk_host_id",
"bq_hostname",
"bk_host_innerip",
"bq_hosttype",
"powerState",
"bq_osname"
]
} }
r1 = requests.post(url1, json=data1)
response_dict1 = r1.json()
#print(response_dict1)
prodip_dict = {}
testip = "10.210.xx|10.210.xx|10.210.xx|10.210.xx|xx.xx.xx" #测试网段ip
for i in response_dict1.get('data')["info"]:
if i["bq_hosttype"] == "t2" and i["powerState"] == "poweredOn" and not re.search("UAT", i["bq_hostname"]) and not re.match(testip, i["bk_host_innerip"]):
prodip_dictkey = i["bk_host_innerip"]
#prodip_dictvalue = i["bq_hostname"]
prodip_dictvalue = [i["bq_hostname"], i["bq_osname"], i["powerState"]]
prodip_dict[prodip_dictkey] = prodip_dictvalue
return prodip_dict
#获取zabbix系统登录认证
def getZabToken(url, post_headers, url_user, url_password):
post_data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": url_user,
"password": url_password
},
"id": 1
}
ret = requests.post(url, data=json.dumps(post_data), headers=post_headers)
return json.loads(ret.text).get("result")
def getZabHost(url,post_headers,token):
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": token,
}
request = requests.post(url, headers=post_headers, data=json.dumps(data))
dict = json.loads(request.content)
zab_ip = []
for i in dict['result']:
zab_ip.append(i['host'])
return zab_ip
def compare(zabhostlist, cmdbhostdict):
zabbixiplist = Counter(zabhostlist)
cmdbiplist = Counter(list(cmdbhostdict.keys()))
nomonip = {}
for i in list((cmdbiplist - zabbixiplist).elements()):
nomonip_value = cmdbhostdict[i]
nomonip_key = i
nomonip[nomonip_key] = nomonip_value
print(nomonip)
return nomonip
class writeToCsv(object):
def __init__(self,data,info):
self.data = data
self.info = info
def write_to_csv(self):
rows = self.data
info = self.info
csvfile = "zabbix未监控生产系统IP列表" + info + time.strftime('_%Y%m%d%H%M%S', time.localtime(time.time())) + ".csv"
# print(csvfile)
# 创建文件对象
f = open(csvfile, 'w', newline='')
# 通过文件创建csv对象
csv_write = csv.writer(f)
# writerow: 按行写入,writerows: 是批量写入
# 写入数据 取列表的第一行字典,用字典的key值做为头行数据
# csv_write.writerow(rows[0].keys())
csv_write.writerow(["未监控生产IP", "主机名", "操作系统", "电源状态"])
# 循环里面的字典,将value作为数据写入进去
ip = list(rows.keys())
hostname = list(rows.values())
for row in range(len(ip)):
csv_write.writerow([ip[row], hostname[row][0], hostname[row][1], hostname[row][2]])
# 关闭打开的文件
f.close()
print("读写完成:",csvfile)
return csvfile
def sendmail(csvfile,receiver):
sender = 'xxx@xxx.com'
smtpserver = 'xx.xx.xx.xx'
username = 'xxx@xxx.com'
password = '******'
mail_title = 'zabbix未监控生产主机IP地址'
# 创建一个带附件的实例
message = MIMEMultipart()
message['From'] = sender
message['To'] = ','.join(receiver)
message['Subject'] = Header(mail_title, 'utf-8')
# 邮件正文内容
message.attach(MIMEText('每日自动统计监控覆盖率', 'plain', 'utf-8'))
# 构造附件
att1 = MIMEApplication(open(csvfile, 'rb').read()) # 打开附件
att1.add_header('Content-Disposition', 'attachment', filename=csvfile) # 为附件命名
message.attach(att1)
smtpObj = smtplib.SMTP_SSL() # 注意:如果遇到发送失败的情况(提示远程主机拒接连接),这里要使用SMTP_SSL方法
smtpObj.connect(smtpserver)
smtpObj.login(username, password)
smtpObj.sendmail(sender, message['To'].split(','), message.as_string())
print("邮件发送成功!!!")
smtpObj.quit()
if __name__ == '__main__':
url = 'http://xx.xx.xx.xx/api_jsonrpc.php' #zabbix监控系统接口地址
post_headers = {'Content-Type': 'application/json'}
url_user = "Admin"
url_passwd = "******"
auth = getZabToken(url,post_headers,url_user,url_passwd)
zabhostlist = getZabHost(url,post_headers,auth) #获取zabbix监控主机ip地址列表
cmdbhostdict = getCmdbProdHost() #获取cmdb主机地址列表
#zabbix监控主机和cmdb主机做比较
data = compare(zabhostlist, cmdbhostdict)
#导出csv文件
info = '统计'
write = writeToCsv(data, info)
resp = write.write_to_csv()
receiver = ['hushanshan2@bngrp.com'] #y邮件接收人,多人用逗号区分开
sendmail(resp, receiver)
来源:https://www.cnblogs.com/huss2016/p/14612203.html


猜你喜欢
- Python中,如果函数体是一个单独的return expression语句,开发者可以选择使用特殊的lambda表达式形式替换该函数:la
- #!/usr/bin/env python#coding=utf-8import osfrom pyinotify import Watch
- Protobuf是什么Protobuf实际是一套类似Json或者XML的数据传输格式和规范,用于不同应用或进程之间进行通信时使用。通信时所传
- def Num2MoneyFormat( change_number ): ""&q
- PyQt5数据拖曳Drag与Drop介绍为用户提供的拖曳功能很直观,在很对桌面应用程序中,复制或移动对象都可以通过拖曳来完成基于MIME类型
- Http与https对比详细介绍概要:HTTPS(Secure Hypertext Transfer Protocol)安全超文
- Django内置的filter有很多,然而我们由于业务逻辑的特殊要求,有时候仍然会不够用,这个时候就需要我们自定义filter来实现相应的内
- 本文实例讲述了js实现兼容性好的微软官网导航下拉菜单效果。分享给大家供大家参考。具体如下:这是一款微软官网导航菜单,兼容好的下拉菜单,微软官
- 1、安装flask_sqlalchemy和pymysql包pip install flask-sqlalchemypip install p
- 前言在翻Golang官方库的过程中,发现一个有趣的库golang.org/x/time ,里面只有一个类rate,研究了一下发现它是一个限流
- 在做自动化测试时,遇到两种情况需要判断usb是否已连接上(注,本文仅针对用adb命令来control手机)一种是在开测时(前提是同时要测试多
- 先放关键代码:i = tf.train.range_input_producer(NUM_EXPOCHES, num_epochs=1, s
- 大家好,学完面向对象与异常处理机制之后,接下里我们要学习 包与模块 。首先我们要了解什么是包?什么是模块?接下来我们还要学习 如何自定义创建
- 一、日志输出到文件使用模块:logging可以生成自定义等级日志,可以输出日志到指定路径日志等级:debug(调试日志) < info
- python 的PIL安装是一件很头疼的的事, 如果你要在python 中使用图型程序那怕只是将个图片从二进制流中存盘(例如使用Scrapy
- 匹配双字节字符(包括汉字在内): [^\x00-\xff] 应用:计算字符串的长度(一个双字节字符长度计2,ASCII
- 今天用到BeautifulSoup解析爬下来的网页数据首先导入包from bs4 import BeautifulSoup然后可以利用url
- 指定变量类型有时您可能需要为变量指定类型,这可以通过 casting 来完成,Python 是一门面向对象的语言,因此它使用类来定义数据类型
- 最近在研究C++连接数据库的问题。安装了MySQL后,在其安装目录下的include文件夹并没有找到libmysql.lib.这个经过研究,
- BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库