指令碼主要功能:
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)