Python封装zabbix-get接口的代码分享

Zabbix 是一款强大的开源网管监控工具,该工具的客户端与服务端是分开的,我们可以直接使用自带的zabbix_get命令来实现拉取客户端上的各种数据,在本地组装参数并使用Popen开子线程执行该命令,即可实现批量监测。
封装Engine类: 该类的主要封装了Zabbix接口的调用,包括最基本的参数收集.

import subprocess,datetime,time,mathclass Engine():def __init__(self,address,port):self.address = addressself.port = portdef GetValue(self,key):try:command = "get.exe -s {0} -p {1} -k {2}".format(self.address,self.port,key).split(" ")start = datetime.datetime.now()process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)while process.poll() is None:time.sleep(1)now = datetime.datetime.now()if (now - start).seconds > 2:return 0return str(process.stdout.readlines()[0].split()[0],"utf-8")except Exception:return 0# ping检测def GetPing(self):ref_dict = {"Address":0,"Ping":0}ref_dict["Address"] = self.addressref_dict["Ping"] = self.GetValue("agent.ping")if ref_dict["Ping"] == "1":return ref_dictelse:ref_dict["Ping"] = "0"return ref_dictreturn ref_dict# 获取主机组基本信息def GetSystem(self):ref_dict = { "Address" : 0 ,"HostName" : 0,"Uname":0 }ref_dict["Address"] = self.addressref_dict["HostName"] = self.GetValue("system.hostname")ref_dict["Uname"] = self.GetValue("system.uname")return ref_dict# 获取CPU利用率def GetCPU(self):ref_dict = { "Address": 0 ,"Core": 0,"Active":0 , "Avg1": 0 ,"Avg5":0 , "Avg15":0 }ref_dict["Address"] = self.addressref_dict["Core"] = self.GetValue("system.cpu.num")ref_dict["Active"] = math.ceil(float(self.GetValue("system.cpu.util")))ref_dict["Avg1"] = self.GetValue("system.cpu.load[,avg1]")ref_dict["Avg5"] = self.GetValue("system.cpu.load[,avg5]")ref_dict["Avg15"] = self.GetValue("system.cpu.load[,avg15]")return ref_dict# 获取内存利用率def GetMemory(self):ref_dict = { "Address":"0","Total":"0","Free":0,"Percentage":"0" }ref_dict["Address"] = self.addressfps = self.GetPing()if fps['Ping'] != "0":ref_dict["Total"] = self.GetValue("vm.memory.size[total]")ref_dict["Free"] = self.GetValue("vm.memory.size[free]")# 计算百分比: percentage = 100 - int(Free/int(Total/100))ref_dict["Percentage"] = str( 100 - int( int(ref_dict.get("Free")) / (int(ref_dict.get("Total"))/100)) ) + "%"return ref_dictelse:return ref_dict# 获取磁盘数据def GetDisk(self):ref_list = []fps = self.GetPing()if fps['Ping'] != "0":disk_ = eval( self.GetValue("vfs.fs.discovery"))for x in range(len(disk_)):dict_ = {"Address": 0, "Name": 0, "Type": 0, "Free": 0}dict_["Address"] = self.addressdict_["Name"] = disk_[x].get("{#FSNAME}")dict_["Type"] = disk_[x].get("{#FSTYPE}")if dict_["Type"] != "UNKNOWN":pfree = self.GetValue("vfs.fs.size[\"{0}\",pfree]".format(dict_["Name"]))dict_["Free"] = str(math.ceil(float(pfree)))else:dict_["Free"] = -1ref_list.append(dict_)return ref_listreturn ref_list# 获取进程状态def GetProcessStatus(self,process_name):fps = self.GetPing()dict_ = {"Address": '0', "ProcessName": '0', "ProcessCount": '0', "Status": '0'}if fps['Ping'] != "0":proc_id = self.GetValue("proc.num[\"{}\"]".format(process_name))dict_['Address'] = self.addressdict_['ProcessName'] = process_nameif proc_id != "0":dict_['ProcessCount'] = proc_iddict_['Status'] = "True"else:dict_['Status'] = "False"return dict_return dict_# 获取端口开放状态def GetNetworkPort(self,port):dict_ = {"Address": '0', "Status": 'False'}dict_['Address'] = self.addressfps = self.GetPing()if fps['Ping'] != "0":port_ = self.GetValue("net.tcp.listen[{}]".format(port))if port_ == "1":dict_['Status'] = "True"else:dict_['Status'] = "False"return dict_return dict_# 检测Web服务器状态 通过本地地址:端口 => 检测目标地址:端口def CheckWebServerStatus(self,check_addr,check_port):dict_ = {"local_address": "0", "remote_address": "0", "remote_port": "0", "Status":"False"}fps = self.GetPing()dict_['local_address'] = self.addressdict_['remote_address'] = check_addrdict_['remote_port'] = check_portif fps['Ping'] != "0":check_ = self.GetValue("net.tcp.port[\"{}\",\"{}\"]".format(check_addr,check_port))if check_ == "1":dict_['Status'] = "True"else:dict_['Status'] = "False"return dict_return dict_

当我们需要使用时,只需要定义变量调用即可,其调用代码如下。
from engine import Engineif __name__ == "__main__":ptr_windows = Engine("127.0.0.1","10050")ret = ptr_windows.GetDisk()if len(ret) != 0:for item in ret:addr = item.get("Address")name = item.get("Name")type = item.get("Type")space = item.get("Free")if type != "UNKNOWN" and space != -1:print("地址: {} --> 盘符: {} --> 格式: {} --> 剩余空间: {}".format(addr,name,type,space))

【Python封装zabbix-get接口的代码分享】到此这篇关于Python封装zabbix-get接口的代码分享的文章就介绍到这了,更多相关Python封装zabbix-get接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读