利用ZABBIX进行服务器自动巡检并导出报表

简介: 利用ZABBIX进行服务器自动巡检并导出报表

实现思路


主要是利用zabbix的api来对数据进行获取处理,实现思路如下:


640.png


  1. zabbix提供了丰富的api,可以根据此api获取zabbix得主机信息,监控项ID,监控项的趋势数据和历史数据
  2. 首先根据主机组ID获取组内的所有主机信息,包括主机名和IP地址
  3. 循环主机组内的主机ID,并在循环里再嵌套一个根据监控项键值获取监控项ID的请求
  4. 根据获取到的监控项ID分别获取历史数据和趋势数据
  5. 将历史数据和趋势数据的值写到一个字典里,并把循环之后的所有字典添加到列表中
  6. 将列表中的信息写入到Excel中,把脚本放到定时任务中定时执行


定义获取的时间间隔


x=(datetime.datetime.now()-datetime.timedelta(minutes=120)).strftime("%Y-%m-%d %H:%M:%S")
y=(datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
def timestamp(x,y):
    p=time.strptime(x,"%Y-%m-%d %H:%M:%S")
    starttime = str(int(time.mktime(p)))
    q=time.strptime(y,"%Y-%m-%d %H:%M:%S")
    endtime= str(int(time.mktime(q)))
    return starttime,endtime


根据主机组ID获取主机信息


def get_hosts(groupids,auth):
    data ={
            "jsonrpc": "2.0",
             "method": "host.get",
             "params": {
             "output": [ "name"],
             "groupids": groupids,
             "filter":{
                 "status": "0"
             },
             "selectInterfaces": [   
                        "ip"
                    ],
            },
            "auth": auth,  # theauth id is what auth script returns, remeber it is string
            "id": 1
        }
    gethost=requests.post(url=ApiUrl,headers=header,json=data)
    return json.loads(gethost.content)["result"]


根据获取到的主机信息构建循环,获取主机监控项的数据


获取历史数据


host=[]
    print(hosts)
    for i in hosts:
        item1=[]
        item2=[]
        #print(i)
        dic1={}
        for j in ['vfs.fs.size[C:,total]','vm.memory.size[total]','system.cpu.num']:
            data={
                "jsonrpc": "2.0",
                "method": "item.get",
                "params": {
                    "output": [
                        "itemid"
                    ],
                    "search": {
                        "key_": j  
                    },
                    "hostids": i['hostid']
                },
                "auth":auth,
                "id": 1
            }
            getitem=requests.post(url=ApiUrl,headers=header,json=data)
            item=json.loads(getitem.content)['result']
            hisdata={
                "jsonrpc":"2.0",
                "method":"history.get",
                "params":{
                    "output":"extend",                    
                    "time_from":timestamp[0],
                    #"time_till":timestamp[1],
                    "history":0,
                    "sortfield": "clock",
                    "sortorder": "DESC",
                    "itemids": '%s' %(item[0]['itemid']),
                    "limit":1
                },
                "auth": auth,
                "id":1
                }
            gethist=requests.post(url=ApiUrl,headers=header,json=hisdata)
            hist=json.loads(gethist.content)['result']
            item1.append(hist)


获取趋势数据


for j in ['vfs.fs.size[C:,used]','vm.memory.size[used]','system.cpu.load']:
            data={
                "jsonrpc": "2.0",
                "method": "item.get",
                "params": {
                    "output": [
                        "itemid"
                    ],
                    "search": {
                        "key_": j  
                    },
                    "hostids": i['hostid']
                },
                "auth":auth,
                "id": 1
            }
            getitem=requests.post(url=ApiUrl,headers=header,json=data)
            item=json.loads(getitem.content)['result']
            trendata={
                "jsonrpc":"2.0",
                "method":"trend.get",
                "params":{
                    "output": [
                        "itemid",
                        "value_max",
                        "value_avg"
                    ],                    
                    "time_from":timestamp[0],
                    "time_till":timestamp[1],
                    "itemids": '%s' %(item[0]['itemid']),
                    "limit":1
                },
                "auth": auth,
                "id":1
                }
            gettrend=requests.post(url=ApiUrl,headers=header,json=trendata)
            trend=json.loads(gettrend.content)['result']
            item2.append(trend)


对获取到的数据进行处理,并导出到csv文件中


dic1['Hostname']=i['name']
        dic1['IP']=i['interfaces'][0]['ip']
        dic1['磁盘C:Total(B)']=round(float(item1[0][0]['value'])/1024**3,2)
        dic1['磁盘最大C:Used(B)']=round(float(item2[0][0]['value_max'])/1024**3,2)
        dic1['内存Total(B)']=round(float(item1[1][0]['value'])/1024**3,2)
        dic1['内存最大Used(B)']=round(float(item2[1][0]['value_max'])/1024**3,2)
        dic1['内存平均used(B)']=round(float(item2[1][0]['value_avg'])/1024**3,2)
        dic1['CPU负载最大值']=item2[2][0]['value_max']
        dic1['CPU负载平均值']=item2[2][0]['value_avg']
        dic1['CPU 核数']=item1[2][0]['value']
        x = time.localtime(int(item1[2][0]['clock']))
        item1[2][0]['clock'] = time.strftime("%Y-%m-%d %H:%M:%S", x)
        dic1['clock']=item1[2][0]['clock']
        host.append(dic1)  
        print(item)
    print(host)
    return host       
def writecsv(getitem1):
    with open('data.csv','w',encoding='utf-8-sig') as f:
        #f.write(codecs.BOM_UTF8)
        writer = csv.DictWriter(f,csvheader)
        writer.writeheader()
        for row in getitem1:
            writer.writerow(row)


实现效果如下:


640.png


完整代码可以访问github地址或者阅读原文:


    https://github.com/sunsharing-note/zabbix/blob/master/xunjian_auto.py


    zabbix API地址:


      https://www.zabbix.com/documentation/4.0/zh/manual/api/reference/history/get


      相关文章
      |
      4月前
      |
      NoSQL 关系型数据库 MySQL
      多人同时导出 Excel 干崩服务器?怎样实现一个简单排队导出功能!
      业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,还涉及文件输入、输出流的io操作,所以对服务器的性能会影响的比较大;结合以上原因,对导出操作进行排队; 刚开始拿到这个需求,第一时间想到就是需要维护一个FIFO先进先出的队列,给定队列一个固定size,在队列里面的人进行排队进行数据导出,导出完成后立马出队列,下一个排队的人进行操作;还考虑到异步,可能还需要建个文件导出表,主要记录文件的导出情况,文件的存放地址,用户根据文件列表情况下载导出文件。
      多人同时导出 Excel 干崩服务器?怎样实现一个简单排队导出功能!
      |
      4月前
      |
      监控 关系型数据库 Linux
      |
      2月前
      |
      弹性计算 对象存储 云计算
      云服务器 ECS产品使用问题之导出存档没有看到打包好的存档压缩包,该怎么办
      云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
      |
      1月前
      |
      监控 关系型数据库 MySQL
      如何在 Ubuntu 16.04 上安装和配置 Zabbix 以安全监控远程服务器
      如何在 Ubuntu 16.04 上安装和配置 Zabbix 以安全监控远程服务器
      17 0
      |
      4月前
      |
      弹性计算 Ubuntu Linux
      【阿里云】阿里云ECS云服务器幻兽帕鲁游戏优化及存档导出导入(Ubuntu)
      【阿里云】阿里云ECS云服务器幻兽帕鲁游戏优化及存档导出导入(Ubuntu)
      1551 4
      |
      4月前
      |
      缓存 监控 安全
      zabbix服务器监控之了解agent的启动过程
      zabbix服务器监控之了解agent的启动过程
      109 0
      |
      4月前
      |
      监控 前端开发
      Zabbix使用外部邮箱服务器发送邮件报警
      Zabbix使用外部邮箱服务器发送邮件报警
      |
      4月前
      |
      弹性计算 Linux 网络安全
      ECS快照问题之导出ECS快照到本地失败如何解决
      阿里云ECS用户可以创建的一个虚拟机实例或硬盘的数据备份,用于数据恢复和克隆新实例;本合集将指导用户如何有效地创建和管理ECS快照,以及解决快照过程中可能遇到的问题,确保数据的安全性和可靠性。
      |
      11月前
      |
      前端开发 Java 关系型数据库
      【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)
      【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)
      837 0
      |
      12月前
      |
      Web App开发 前端开发 JavaScript
      在 SAPGUI 里使用 ABAP 报表上传 SAP UI5 应用到 ABAP 服务器试读版
      在 SAPGUI 里使用 ABAP 报表上传 SAP UI5 应用到 ABAP 服务器试读版

      推荐镜像

      更多