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实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
python3+selenium实现126邮箱登陆并发送邮件功能
Jan 23 Python
python从子线程中获得返回值的方法
Jan 30 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
FFrpc python客户端lib使用解析
Aug 24 Python
使用python制作一个解压缩软件
Nov 13 Python
Python操作redis和mongoDB的方法
Dec 19 Python
Python批量启动多线程代码实例
Feb 18 Python
如何使用python传入不确定个数参数
Feb 18 Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
python实现逻辑回归的示例
Oct 09 Python
2021年pycharm的最新安装教程及基本使用图文详解
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
python 统计代码耗时的几种方法分享
python 遍历磁盘目录的三种方法
Apr 02 #Python
python 如何在 Matplotlib 中绘制垂直线
在Windows下安装配置CPU版的PyTorch的方法
PyQt5 QThread倒计时功能的实现代码
Apr 02 #Python
You might like
一个PHP数组应该有多大的分析
2009/07/30 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
javascript实现禁止鼠标滚轮事件
2015/07/24 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
浅谈JS运算符&&和|| 及其优先级
2016/08/10 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
Python列表(list)常用操作方法小结
2015/02/02 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
Python如何进行时间处理
2020/08/06 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
简单说下OSPF的操作过程
2014/08/13 面试题
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
汽车专业毕业生推荐信
2013/11/12 职场文书
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
工程质量承诺书范文
2014/03/27 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
个人总结格式范文
2015/03/09 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
SpringBoot生成License的实现示例
2021/06/16 Java/Android