python自動統(tǒng)計zabbix系統(tǒng)監(jiān)控覆蓋率的示例代碼
腳本主要功能:
1)通過zabbix api接口采集所有監(jiān)控主機(jī)ip地址;
2)通過cmdb系統(tǒng)(藍(lán)鯨)接口采集所有生產(chǎn)主機(jī)IP地址、主機(jī)名、操作系統(tǒng)、電源狀態(tài);
3)以上2步返回數(shù)據(jù)對比,找出未監(jiān)控主機(jī)ip地址,生成csv文件;
4)發(fā)送郵件。
腳本如下:
#!/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系統(tǒng)獲取虛擬化生產(chǎn)主機(jī)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" #測試網(wǎng)段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系統(tǒng)登錄認(rèn)證
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未監(jiān)控生產(chǎn)系統(tǒng)IP列表" + info + time.strftime('_%Y%m%d%H%M%S', time.localtime(time.time())) + ".csv"
# print(csvfile)
# 創(chuàng)建文件對象
f = open(csvfile, 'w', newline='')
# 通過文件創(chuàng)建csv對象
csv_write = csv.writer(f)
# writerow: 按行寫入, writerows: 是批量寫入
# 寫入數(shù)據(jù) 取列表的第一行字典,用字典的key值做為頭行數(shù)據(jù)
# csv_write.writerow(rows[0].keys())
csv_write.writerow(["未監(jiān)控生產(chǎn)IP", "主機(jī)名", "操作系統(tǒng)", "電源狀態(tài)"])
# 循環(huán)里面的字典,將value作為數(shù)據(jù)寫入進(jìn)去
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]])
# 關(guān)閉打開的文件
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未監(jiān)控生產(chǎn)主機(jī)IP地址'
# 創(chuàng)建一個帶附件的實(shí)例
message = MIMEMultipart()
message['From'] = sender
message['To'] = ','.join(receiver)
message['Subject'] = Header(mail_title, 'utf-8')
# 郵件正文內(nèi)容
message.attach(MIMEText('每日自動統(tǒng)計監(jiān)控覆蓋率', 'plain', 'utf-8'))
# 構(gòu)造附件
att1 = MIMEApplication(open(csvfile, 'rb').read()) # 打開附件
att1.add_header('Content-Disposition', 'attachment', filename=csvfile) # 為附件命名
message.attach(att1)
smtpObj = smtplib.SMTP_SSL() # 注意:如果遇到發(fā)送失敗的情況(提示遠(yuǎn)程主機(jī)拒接連接),這里要使用SMTP_SSL方法
smtpObj.connect(smtpserver)
smtpObj.login(username, password)
smtpObj.sendmail(sender, message['To'].split(','), message.as_string())
print("郵件發(fā)送成功?。。?)
smtpObj.quit()
if __name__ == '__main__':
url = 'http://xx.xx.xx.xx/api_jsonrpc.php' #zabbix監(jiān)控系統(tǒng)接口地址
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監(jiān)控主機(jī)ip地址列表
cmdbhostdict = getCmdbProdHost() #獲取cmdb主機(jī)地址列表
#zabbix監(jiān)控主機(jī)和cmdb主機(jī)做比較
data = compare(zabhostlist, cmdbhostdict)
#導(dǎo)出csv文件
info = '統(tǒng)計'
write = writeToCsv(data, info)
resp = write.write_to_csv()
receiver = ['hushanshan2@bngrp.com'] #y郵件接收人,多人用逗號區(qū)分開
sendmail(resp, receiver)
到此這篇關(guān)于python自動統(tǒng)計zabbix系統(tǒng)監(jiān)控覆蓋率的文章就介紹到這了,更多相關(guān)python統(tǒng)計zabbix內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)網(wǎng)上購物系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)網(wǎng)上購物系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
python-docx修改已存在的Word文檔的表格的字體格式方法
今天小編就為大家分享一篇python-docx修改已存在的Word文檔的表格的字體格式方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python基礎(chǔ)學(xué)習(xí)之類與實(shí)例基本用法與注意事項(xiàng)詳解
這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)之類與實(shí)例基本用法與注意事項(xiàng),結(jié)合實(shí)例形式詳細(xì)分析了Python面相對象程序設(shè)計中關(guān)于類的定義與實(shí)例化對象相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-06-06
python實(shí)現(xiàn)模擬鍵盤鼠標(biāo)重復(fù)性操作Pyautogui
這篇文章主要為大家詳細(xì)介紹了python如何利用Pyautogui模擬鍵盤鼠標(biāo)重復(fù)性操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
python3 圖片 4通道轉(zhuǎn)成3通道 1通道轉(zhuǎn)成3通道 圖片壓縮實(shí)例
今天小編就為大家分享一篇python3 圖片 4通道轉(zhuǎn)成3通道 1通道轉(zhuǎn)成3通道 圖片壓縮實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python MNIST手寫識別數(shù)據(jù)調(diào)用API的方法
這篇文章主要介紹了python MNIST手寫識別數(shù)據(jù)調(diào)用API的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
pandas基礎(chǔ)?Series與Dataframe與numpy對二進(jìn)制文件輸入輸出
這篇文章主要介紹了pandas基礎(chǔ)Series與Dataframe與numpy對二進(jìn)制文件輸入輸出,series是一種一維的數(shù)組型對象,它包含了一個值序列和一個數(shù)據(jù)標(biāo)簽2022-07-07

