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的内建模块collections的教程
Apr 28 Python
python控制台中实现进度条功能
Nov 10 Python
Python命令启动Web服务器实例详解
Feb 23 Python
深入理解Django的自定义过滤器
Oct 17 Python
Python3 log10()函数简单用法
Feb 19 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
TensorFlow固化模型的实现操作
May 26 Python
Numpy 多维数据数组的实现
Jun 18 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
python中time tzset()函数实例用法
Feb 18 Python
2021年pycharm的最新安装教程及基本使用图文详解
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
python 统计代码耗时的几种方法分享
python 遍历磁盘目录的三种方法
Apr 02 #Python
python 如何在 Matplotlib 中绘制垂直线
在Windows下安装配置CPU版的PyTorch的方法
PyQt5 QThread倒计时功能的实现代码
Apr 02 #Python
You might like
PHP4与PHP5的时间格式问题
2008/02/17 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
PHP闭包实例解析
2014/09/08 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
js实现的map方法示例代码
2014/01/13 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
JS实现六位字符密码输入器功能
2016/08/19 Javascript
bootstrap中的 form表单属性role="form"的作用详解
2017/01/20 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
在python中bool函数的取值方法
2018/11/01 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
python 字符串常用函数详解
2019/09/11 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
城市轨道专业个人求职信范文
2013/09/23 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
党员三严三实心得体会
2014/10/13 职场文书
2014业务员年终工作总结
2014/12/09 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书