新聞中心
本文轉(zhuǎn)載自微信公眾號「新鈦云服」,作者徐磊。轉(zhuǎn)載本文請聯(lián)系新鈦云服公眾號。

在日常運維中,當你遇到每天郵件發(fā)出當天服務(wù)器的監(jiān)控狀態(tài)等這些類似需求時,你還在每天下午快下班的時候打開zabbix截圖、發(fā)郵件......日復(fù)一日的手動處理嗎?如果是,這篇干貨將為您解放雙手。
文檔說明
本文檔主要介紹利用python腳本,指定主機名,自動獲取zabbix監(jiān)控圖,下載到本地,形成word文檔。
總體思路:先通過zabbix API獲取auth;通過主機名獲取host ID;通過host ID獲取graph ID;再利用爬蟲代碼將圖片下載到本地;通過python的docx 模塊插入至word文檔(本文zabbix的版本是5.0,python是3.8)。
一、自動獲取zabbix監(jiān)控圖保存至本地
首先,獲取zabbix的auth ID,通過zabbix API獲取主機id,graph ID等信息。打印出auth ID之后,保存下來,之后獲取host ID需要用到:
- #獲取authkey
- ZABBIX_URL = 'https://www.zabbix.cn'
- ZABBIX_USERNAME = "user"
- ZABBIX_PASSWORD = "password"
- url = "{}/api_jsonrpc.php".format(ZABBIX_URL)
- header = {"Content-Type": "application/json"}
- # auth user and password
- data = {
- "jsonrpc": "2.0",
- "method": "user.login",
- "params": {
- "user": ZABBIX_USERNAME,
- "password": ZABBIX_PASSWORD
- },
- "id": 1,
- }
- # 由于API接收的是json字符串,故需要轉(zhuǎn)化一下
- value = json.dumps(data).encode('utf-8')
- # 對請求進行包裝
- req = request.Request(url, headers=header, data=value)
- # 驗證并獲取Auth ID
- try:
- # 打開包裝過的url
- result = request.urlopen(req)
- except Exception as e:
- print("Auth Failed, Please Check Your Name And Password:", e)
- else:
- response = result.read()
- # 上面獲取的是bytes類型數(shù)據(jù),故需要decode轉(zhuǎn)化成字符串
- page = response.decode('utf-8')
- # 將此json字符串轉(zhuǎn)化為python字典
- page = json.loads(page)
- result.close()
- print("Auth Successful. The Auth ID Is: {}".format(page.get('result')))
變量hostname即是需要查詢的主機名,通過主機名查詢到host ID。當然也可以使用input函數(shù)做交互,實現(xiàn)動態(tài)查詢。
- #獲取hostid
- data = {
- "jsonrpc": "2.0",
- "method": "host.get",
- "params": {
- "output": [
- "hostid",
- "host"
- ],
- "selectInterfaces": [
- "interfaceid",
- "ip"
- ]
- },
- "auth": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX", #這里的auth的值就是上文獲取到的auth
- "id": 2
- }
- r = requests.post(url, headers=header, data=json.dumps(data))
- hostname = abc123
- with open(hostname_txt,'r') as f:
- tmp_list = [x.strip("\n") for x in f.readlines()]
- for hostname in tmp_list:
- if r.json().get('result'):
- for i in r.json()['result']:
- if i['host'] == hostname:
- hostids = i['hostid']
使用host ID查詢到graph ID,并保存到本地;
value傳入的值,from和to這兩個key決定了獲取監(jiān)控圖的監(jiān)控時間段,本例設(shè)置的是一個月;
value中"profileIdx": "web.graphics.filter"是zabbix 5.0 API的新特性,如果不傳入,獲取的監(jiān)控時段是一個小時且無法更改。
- #獲取graphid列表和字典
- class ZabbixGraph(object):
- def __init__(self,url,name,password):
- self.url=url
- self.name=name
- self.password=password
- #初始化的時候生成cookies
- cookiejar = http.cookiejar.CookieJar()
- #cookiejar = cookielib.CookieJar()
- urlOpener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookiejar))
- #urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
- values = {"name":self.name,'password':self.password,'autologin':1,"enter":'Sign in'}
- data = parse.urlencode(values).encode("utf-8")
- #data = urllib.urlencode(values)
- request = urllib.request.Request(url, data)
- try:
- urlOpener.open(request,timeout=10)
- self.urlOpener=urlOpener
- except ValueError:
- print("網(wǎng)頁打開失敗")
- def GetGraph(self,url,values,p_w_picpath_dir):
- key=values.keys()
- print(values)#顯示最底下value傳入的值
- if "graphid" not in key:
- print("請確認是否輸入graphid")
- sys.exit(1)
- #以下if 是給定默認值
- if "period" not in key:
- #默認獲取一天的數(shù)據(jù),單位為秒
- values["period"]=2626560
- if "stime" not in key:
- #默認為當前時間開始
- values["stime"]=datetime.datetime.now().strftime('%Y%m%d%H%M%S')
- if "width" not in key:
- values["width"]=800
- if "height" not in key:
- values["height"]=200
- data=parse.urlencode(values).encode("utf-8")
- #data=urllib.urlencode(values)
- request = urllib.request.Request(url,data)
- url = self.urlOpener.open(request)
- p_w_picpath = url.read()
- p_w_picpathname="%s/%s.png" % (p_w_picpath_dir, values["hostname"]+"_images"+values["name"])
- f=open(p_w_picpathname,'wb+')
- f.write(p_w_picpath)
- f.close()
- graph_id_data = {
- "jsonrpc": "2.0",
- "method": "graph.get",
- "params": {
- "output": "extend",
- "hostids": hostids,
- "sortfield": "name"},
- "auth": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
- "id": 1}
- graph_data = requests.post(url, headers=header, data=json.dumps(graph_id_data))
- graph_list_x = []
- graph_dict_name = {}
- if graph_data.json().get('result'):
- for i in graph_data.json()['result']:
- graph_id = i['graphid']
- graph_name_x = i['name']
- graph_name=graph_name_x.replace("/","_")
- graph_dict_name[graph_id]=graph_name
- graph_list_x.append(graph_id)
- #==========================================================
- #此url是獲取圖片是的,請注意餅圖的URL 和此URL不一樣,請仔細觀察!
- gr_url="https://www.zabbix.cn/chart2.php"
- #登陸URL
- indexURL="https://www.zabbix.cn/index.php"
- username="user"
- password="password"
- #用于圖片存放的目錄
- p_w_picpath_dir="/picture"
- #圖片的參數(shù),該字典至少傳入graphid。
- for key, value in graph_dict_name.items():
- values = {"graphid":key,"name":value,"hostname":hostname,"width":800,"height":200,"from":"now-30d","to":"now","profileIdx": "web.graphics.filter"}
- b=ZabbixGraph(indexURL,username,password)
- b.GetGraph(gr_url,values,p_w_picpath_dir)
二、將圖片編輯到word,并根據(jù)graph name命名
寫入word:
- from docx import Document
- from docx.shared import Inches
- import os
- from PIL import Image
- # 要插入的圖片所在的文件夾
- pwd = os.getcwd()
- fold='picture'
- fold_DS = fold + '/' + '.DS_Store'
- word = pwd + "/" + "word文檔"
- try:
- os.mkdir(pwd+'/'+fold,755)
- except:
- print("目錄已存在!無須創(chuàng)建")
- # os.walk(fold)沒有返回值,所以這么做顯然沒有結(jié)果,是錯的
- # pics=list(os.walk(fold)[3])
- # # pics.pop()
- # print(pics)
- # pics是圖片的名字
- # root是string類型, dirs和pics是list類型
- try:
- os.remove(fold_DS)
- except:
- print("no .DS_Store文件")
- for root, dirs, pics in os.walk(fold):
- doc=Document()
- for i in range(0,len(pics)):
- filepath = root + '/' + str(pics[i])
- string = str(pics[i].strip(".png"))
- #print(string)
- try:
- doc.add_paragraph(string)
- doc.add_picture(filepath,width=Inches(6),height=Inches(3))
- except Exception:
- pic_tmp=Image.open(filepath)
- # 如果格式有問題,就用save轉(zhuǎn)換成默認的jpg格式
- pic_tmp.save(pic_tmp)
- # 把處理后的圖片放進Document變量doc中
- doc.add_picture(filepath, width=Inches(6),height=Inches(3))
- # 把Document變量doc保存到指定路徑的docx文件中
- doc.save(word)
- #輸出保存成功的標志
- print("pic", string, "successfully added.")
三、python模塊
本次使用到的模塊,在運行之前檢查主機是否安裝本次執(zhí)行需要的模塊。
一般需要單獨安裝的模塊有四個urllib3,requests,Pillow,python-docx。
- import json
- import requests
- from urllib import request, parse
- from urllib.request import urlopen
- import sys
- import datetime
- import urllib.request
- import http.cookiejar
- import os
- import ssl
- from docx import Document
- from docx.shared import Inches
四、注意事項
如果有些同學的zabbix使用的是https的訪問方式,在代理里需要跳過證書驗證。
ssl._create_default_https_context = ssl._create_unverified_context
在獲取到的圖片打開的時候提示文件已損壞,使用其他代碼編輯器打開查看代碼,發(fā)現(xiàn)是登陸失敗的問題,需要檢查登陸賬戶和方式是否正確。
當前名稱:為你解放雙手,Python自動獲取指定主機Zabbix監(jiān)控圖
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/cciohhi.html


咨詢
建站咨詢
