这篇教程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的最新安装教程及基本使用图文详解 |