加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 安全 > 正文

Python自动获取指定主机Zabbix方案部署

发布时间:2021-05-22 21:06:16 所属栏目:安全 来源:互联网
导读:本文档主要介绍利用python脚本,指定主机名,自动获取zabbix监控图,下载到本地,形成word文档。 总体思路:先通过zabbix API获取auth;通过主机名获取host ID;通过host ID获取graph ID;再利用爬虫代码将图片下载到本地;通过python的docx 模块插入至word文档(


本文档主要介绍利用python脚本,指定主机名,自动获取zabbix监控图,下载到本地,形成word文档。

总体思路:先通过zabbix API获取auth;通过主机名获取host ID;通过host ID获取graph ID;再利用爬虫代码将图片下载到本地;通过python的docx 模块插入至word文档(本文zabbix的版本是5.0,python是3.8)。

一、自动获取zabbix监控图保存至本地

首先,获取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字符串,故需要转化一下 
  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类型数据,故需要decode转化成字符串 
  33.    page = response.decode('utf-8'
  34.    # 将此json字符串转化为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函数做交互,实现动态查询。


  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决定了获取监控图的监控时间段,本例设置的是一个月;

value中"profileIdx": "web.graphics.filter"是zabbix 5.0 API的新特性,如果不传入,获取的监控时段是一个小时且无法更改。


  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("网页打开失败"
  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.            #默认获取一天的数据,单位为秒 
  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. #图片的参数,该字典至少传入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,并根据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("目录已存在!无须创建"
  16.  
  17. # os.walk(fold)没有返回值,所以这么做显然没有结果,是错的 
  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转换成默认的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."

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读