日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
為你解放雙手,Python自動獲取指定主機Zabbix監(jiān)控圖

本文轉(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需要用到:

 
 
  1. #獲取authkey 
  2.  
  3. ZABBIX_URL = 'https://www.zabbix.cn' 
  4. ZABBIX_USERNAME = "user" 
  5. ZABBIX_PASSWORD = "password" 
  6.  
  7. url = "{}/api_jsonrpc.php".format(ZABBIX_URL) 
  8. header = {"Content-Type": "application/json"} 
  9. # auth user and password 
  10. data = { 
  11.    "jsonrpc": "2.0", 
  12.    "method": "user.login", 
  13.    "params": { 
  14.        "user": ZABBIX_USERNAME, 
  15.        "password": ZABBIX_PASSWORD 
  16.   }, 
  17.    "id": 1, 
  18. # 由于API接收的是json字符串,故需要轉(zhuǎn)化一下 
  19. value = json.dumps(data).encode('utf-8') 
  20.  
  21. # 對請求進行包裝 
  22. req = request.Request(url, headers=header, data=value) 
  23.  
  24. # 驗證并獲取Auth ID 
  25. try: 
  26.    # 打開包裝過的url 
  27.    result = request.urlopen(req) 
  28. except Exception as e: 
  29.    print("Auth Failed, Please Check Your Name And Password:", e) 
  30. else: 
  31.    response = result.read() 
  32.    # 上面獲取的是bytes類型數(shù)據(jù),故需要decode轉(zhuǎn)化成字符串 
  33.    page = response.decode('utf-8') 
  34.    # 將此json字符串轉(zhuǎn)化為python字典 
  35.    page = json.loads(page) 
  36.    result.close() 
  37.    print("Auth Successful. The Auth ID Is: {}".format(page.get('result'))) 

變量hostname即是需要查詢的主機名,通過主機名查詢到host ID。當然也可以使用input函數(shù)做交互,實現(xiàn)動態(tài)查詢。

 
 
  1. #獲取hostid 
  2. data = { 
  3.  
  4.     "jsonrpc": "2.0", 
  5.     "method": "host.get", 
  6.     "params": { 
  7.        "output": [ 
  8.            "hostid", 
  9.            "host" 
  10.       ], 
  11.        "selectInterfaces": [ 
  12.            "interfaceid", 
  13.            "ip" 
  14.       ] 
  15.     }, 
  16.     "auth": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",  #這里的auth的值就是上文獲取到的auth 
  17.     "id": 2 
  18.  
  19.  
  20. r = requests.post(url, headers=header, data=json.dumps(data)) 
  21.  
  22. hostname = abc123 
  23.  
  24. with open(hostname_txt,'r') as f: 
  25.    tmp_list = [x.strip("\n") for x in f.readlines()] 
  26.    for hostname in tmp_list: 
  27.        if r.json().get('result'): 
  28.            for i in r.json()['result']: 
  29.                if i['host'] == hostname: 
  30.                    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)控時段是一個小時且無法更改。

 
 
  1. #獲取graphid列表和字典 
  2.  
  3. class ZabbixGraph(object): 
  4.    def __init__(self,url,name,password): 
  5.        self.url=url 
  6.        self.name=name 
  7.        self.password=password 
  8.        #初始化的時候生成cookies 
  9.        cookiejar = http.cookiejar.CookieJar() 
  10.        #cookiejar = cookielib.CookieJar() 
  11.        urlOpener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookiejar)) 
  12.        #urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar)) 
  13.        values = {"name":self.name,'password':self.password,'autologin':1,"enter":'Sign in'} 
  14.        data = parse.urlencode(values).encode("utf-8") 
  15.        #data = urllib.urlencode(values) 
  16.        request = urllib.request.Request(url, data) 
  17.        try: 
  18.            urlOpener.open(request,timeout=10) 
  19.            self.urlOpener=urlOpener 
  20.        except ValueError: 
  21.            print("網(wǎng)頁打開失敗") 
  22.    def GetGraph(self,url,values,p_w_picpath_dir): 
  23.        key=values.keys() 
  24.        print(values)#顯示最底下value傳入的值 
  25.        if "graphid"  not in key: 
  26.            print("請確認是否輸入graphid") 
  27.            sys.exit(1) 
  28.        #以下if 是給定默認值 
  29.        if  "period" not in key: 
  30.            #默認獲取一天的數(shù)據(jù),單位為秒 
  31.            values["period"]=2626560 
  32.        if "stime" not in key: 
  33.            #默認為當前時間開始 
  34.           values["stime"]=datetime.datetime.now().strftime('%Y%m%d%H%M%S') 
  35.        if "width" not in key: 
  36.            values["width"]=800 
  37.        if "height" not in key: 
  38.            values["height"]=200 
  39.  
  40.        data=parse.urlencode(values).encode("utf-8") 
  41.        #data=urllib.urlencode(values) 
  42.        request = urllib.request.Request(url,data) 
  43.        url = self.urlOpener.open(request) 
  44.        p_w_picpath = url.read() 
  45.        p_w_picpathname="%s/%s.png" % (p_w_picpath_dir, values["hostname"]+"_images"+values["name"]) 
  46.        f=open(p_w_picpathname,'wb+') 
  47.        f.write(p_w_picpath) 
  48.        f.close() 
  49.  
  50.  
  51. graph_id_data = { 
  52. "jsonrpc": "2.0", 
  53. "method": "graph.get", 
  54. "params": { 
  55.         "output": "extend", 
  56.         "hostids": hostids, 
  57.         "sortfield": "name"}, 
  58. "auth": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX", 
  59. "id": 1} 
  60.  
  61. graph_data = requests.post(url, headers=header, data=json.dumps(graph_id_data)) 
  62.  
  63. graph_list_x = [] 
  64. graph_dict_name = {} 
  65. if graph_data.json().get('result'): 
  66.  for i in graph_data.json()['result']: 
  67.    graph_id = i['graphid'] 
  68.    graph_name_x = i['name'] 
  69.    graph_name=graph_name_x.replace("/","_") 
  70.    graph_dict_name[graph_id]=graph_name 
  71.    graph_list_x.append(graph_id) 
  72. #========================================================== 
  73. #此url是獲取圖片是的,請注意餅圖的URL 和此URL不一樣,請仔細觀察! 
  74. gr_url="https://www.zabbix.cn/chart2.php" 
  75. #登陸URL 
  76. indexURL="https://www.zabbix.cn/index.php" 
  77. username="user" 
  78. password="password" 
  79. #用于圖片存放的目錄 
  80. p_w_picpath_dir="/picture" 
  81. #圖片的參數(shù),該字典至少傳入graphid。 
  82. for key, value in graph_dict_name.items(): 
  83.  values = {"graphid":key,"name":value,"hostname":hostname,"width":800,"height":200,"from":"now-30d","to":"now","profileIdx": "web.graphics.filter"} 
  84.  b=ZabbixGraph(indexURL,username,password) 
  85.  b.GetGraph(gr_url,values,p_w_picpath_dir) 

二、將圖片編輯到word,并根據(jù)graph name命名

寫入word:

 
 
  1. from docx import Document 
  2. from docx.shared import Inches 
  3. import os 
  4. from PIL import Image 
  5.  
  6. # 要插入的圖片所在的文件夾 
  7. pwd = os.getcwd() 
  8. fold='picture' 
  9. fold_DS = fold + '/' + '.DS_Store' 
  10. word = pwd + "/" + "word文檔" 
  11.  
  12. try: 
  13.    os.mkdir(pwd+'/'+fold,755) 
  14. except: 
  15.    print("目錄已存在!無須創(chuàng)建") 
  16.  
  17. # os.walk(fold)沒有返回值,所以這么做顯然沒有結(jié)果,是錯的 
  18. # pics=list(os.walk(fold)[3]) 
  19. # # pics.pop() 
  20. # print(pics) 
  21.  
  22. # pics是圖片的名字 
  23. # root是string類型, dirs和pics是list類型 
  24. try: 
  25.    os.remove(fold_DS) 
  26. except: 
  27.    print("no .DS_Store文件") 
  28.  
  29.  
  30. for root, dirs, pics in os.walk(fold): 
  31.    doc=Document() 
  32.    for i in range(0,len(pics)): 
  33.        filepath = root + '/' + str(pics[i]) 
  34.        string = str(pics[i].strip(".png")) 
  35.        #print(string) 
  36.  
  37.  
  38.        try: 
  39.            doc.add_paragraph(string) 
  40.            doc.add_picture(filepath,width=Inches(6),height=Inches(3)) 
  41.        except Exception: 
  42.            pic_tmp=Image.open(filepath) 
  43.            # 如果格式有問題,就用save轉(zhuǎn)換成默認的jpg格式 
  44.            pic_tmp.save(pic_tmp) 
  45.            # 把處理后的圖片放進Document變量doc中 
  46.            doc.add_picture(filepath, width=Inches(6),height=Inches(3)) 
  47.  
  48.        # 把Document變量doc保存到指定路徑的docx文件中 
  49.        doc.save(word) 
  50.  
  51.        #輸出保存成功的標志 
  52.        print("pic", string, "successfully added.") 

三、python模塊

本次使用到的模塊,在運行之前檢查主機是否安裝本次執(zhí)行需要的模塊。

一般需要單獨安裝的模塊有四個urllib3,requests,Pillow,python-docx。

 
 
  1. import json 
  2. import requests 
  3. from urllib import request, parse 
  4. from urllib.request import urlopen 
  5. import sys 
  6. import datetime 
  7. import urllib.request 
  8. import http.cookiejar 
  9. import os 
  10. import ssl 
  11. from docx import Document 
  12. 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