您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python自动统计zabbix系统监控覆盖率的示例代码

51自学网 2021-10-30 22:46:43
  python
这篇教程python自动统计zabbix系统监控覆盖率的示例代码写得很实用,希望能帮到您。

脚本主要功能:

1)通过zabbix api接口采集所有监控主机ip地址;

2)通过cmdb系统(蓝鲸)接口采集所有生产主机IP地址、主机名、操作系统、电源状态;

3)以上2步返回数据对比,找出未监控主机ip地址,生成csv文件;

4)发送邮件。

脚本如下:

#!/usr/bin/python#coding:utf-8import requestsimport jsonimport reimport timeimport csvfrom collections import Counterimport smtplibfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.application import MIMEApplication# 从cmdb系统获取虚拟化生产主机ipdef 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_ipdef 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 nomonipclass 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 csvfiledef 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)

到此这篇关于python自动统计zabbix系统监控覆盖率的文章就介绍到这了,更多相关python统计zabbix内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


Python list去重且保持原顺序不变的方法
2021年pycharm的最新安装教程及基本使用图文详解
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。