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


Posted in Python onApril 03, 2021

脚本主要功能:

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)

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

Python 相关文章推荐
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
python使用三角迭代计算圆周率PI的方法
Mar 20 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
python实现学生管理系统
Jan 11 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
Python中函数参数匹配模型详解
Jun 09 Python
pytorch的batch normalize使用详解
Jan 15 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
python批量处理多DNS多域名的nslookup解析实现
Jun 28 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
May 14 Python
Python图片处理之图片裁剪教程
May 27 Python
Pandas 数据编码的十种方法
Apr 20 Python
2021年pycharm的最新安装教程及基本使用图文详解
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
python 统计代码耗时的几种方法分享
python 遍历磁盘目录的三种方法
Apr 02 #Python
python 如何在 Matplotlib 中绘制垂直线
在Windows下安装配置CPU版的PyTorch的方法
PyQt5 QThread倒计时功能的实现代码
Apr 02 #Python
You might like
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
php 的反射详解及示例代码
2016/08/25 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
js window.event对象详尽解析
2009/02/17 Javascript
validator验证控件使用代码
2010/11/23 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
Python中的元类编程入门指引
2015/04/15 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
python邮件发送smtplib使用详解
2020/06/16 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
2019/08/09 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
pytorch梯度剪裁方式
2020/02/04 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
助人为乐道德模范事迹材料
2014/08/16 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server
php实例化对象的实例方法
2021/11/17 PHP
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android