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调用shell的方法
Nov 20 Python
Python使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
python版简单工厂模式
Oct 16 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
Django如何开发简单的查询接口详解
May 17 Python
python 读取修改pcap包的例子
Jul 23 Python
python实现超级玛丽游戏
Mar 18 Python
基于python计算并显示日间、星期客流高峰
May 07 Python
python和c语言哪个更适合初学者
Jun 22 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
2021年pycharm的最新安装教程及基本使用图文详解
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
python 统计代码耗时的几种方法分享
python 遍历磁盘目录的三种方法
Apr 02 #Python
python 如何在 Matplotlib 中绘制垂直线
在Windows下安装配置CPU版的PyTorch的方法
PyQt5 QThread倒计时功能的实现代码
Apr 02 #Python
You might like
PHP中strtotime函数使用方法详解
2011/11/27 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
python实现梯度下降算法
2020/03/24 Python
Python3中列表list合并的四种方法
2019/04/19 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
python实现经典排序算法的示例代码
2021/02/07 Python
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
怎么样写好简历中的自我评价
2013/10/25 职场文书
优秀护士获奖感言
2014/02/20 职场文书
学党史心得体会
2014/09/05 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
天坛导游词
2015/02/02 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
心理健康教育主题班会
2015/08/13 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
Django框架中视图的用法
2022/06/10 Python