您好,登錄后才能下訂單哦!
Python編寫從ZabbixAPI獲取信息
此腳本用Python3.6執行是OK的。 # -*- coding: utf-8 -*- import json import urllib.request, urllib.error, urllib.parse class ZabbixAPI: def __init__(self): self.__url = 'http://192.168.56.102/zabbix/api_jsonrpc.php' self.__user = 'admin' self.__password = 'zabbix' self.__header = {"Content-Type": "application/json-rpc"} self.__token_id = self.UserLogin() #登陸獲取token def UserLogin(self): data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": self.__user, "password": self.__password }, "id": 0, } return self.PostRequest(data) #推送請求 def PostRequest(self, data): request = urllib.request.Request(self.__url,json.dumps(data).encode('utf-8'),self.__header) result = urllib.request.urlopen(request) response = json.loads(result.read().decode('utf-8')) try: # print response['result'] return response['result'] except KeyError: raise KeyError #主機列表 def HostGet(self,hostid=None,hostip=None): data = { "jsonrpc":"2.0", "method":"host.get", "params":{ "output":"extend", "selectGroups": "extend", "selectParentTemplates": ["templateid","name"], "selectInterfaces": ["interfaceid","ip"], "selectInventory": ["os"], "selectItems":["itemid","name"], "selectGraphs":["graphid","name"], "selectApplications":["applicationid","name"], "selectTriggers":["triggerid","name"], "selectScreens":["screenid","name"] }, "auth": self.__token_id, "id":1, } if hostid: data["params"]={ "output": "extend", "hostids": hostid, "sortfield": "name" } return self.PostRequest(data) #主機列表 def HostCreate(self,hostname,hostip,groupid=None,templateid=None): data = { "jsonrpc":"2.0", "method":"host.create", "params": { "host": hostname, "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": hostip, "dns": "", "port": "10050" } ], "groups": [ { "groupid": groupid } ], "templates": [ { "templateid": templateid } ] }, "auth": self.__token_id, "id":1, } return self.PostRequest(data) #主機組列表 def HostGroupGet(self,hostid=None,itemid=None): data = { "jsonrpc":"2.0", "method":"hostgroup.get", "params":{ "output": "extend", "hostids": hostid, "itemids": itemid, "sortfield": "name" }, "auth": self.__token_id, "id":1, } return self.PostRequest(data) #監控項列表 def ItemGet(self,hostid=None,itemid=None): data = { "jsonrpc":"2.0", "method": "item.get", "params": { "output": "extend", "hostids": hostid, "itemids": itemid, "sortfield": "name" }, "auth": self.__token_id, "id":1, } return self.PostRequest(data) #模板列表 def TemplateGet(self, hostid=None,templateid=None): data = { "jsonrpc":"2.0", "method": "template.get", "params": { "output": "extend", "hostids": hostid, "templateids": templateid, "sortfield": "name" }, "auth": self.__token_id, "id":1, } return self.PostRequest(data) #圖像列表 def GraphGet(self,hostid=None,graphid=None): data = { "jsonrpc":"2.0", "method": "graph.get", "params": { "output": "extend", "hostids": hostid, "graphids": graphid, "sortfield": "name" }, "auth": self.__token_id, "id":1, } return self.PostRequest(data) #歷史數據 def History(self,itemid,data_type): data = { "jsonrpc": "2.0", "method": "history.get", "params": { "output": "extend", "history": data_type, "itemids": itemid, "sortfield": "clock", "sortorder": "DESC", "limit": 30 }, "auth": self.__token_id, "id": 2 } return self.PostRequest(data) #測試:python manager.py shell ; from ZABBIX.ZabbixAPI import * ; main(),代碼修改了要ctrl+Z退出重進 def main(): zapi=ZabbixAPI() token=zapi.UserLogin() print(token) #39378ec03aa101c2b17d1d2bd6f4ef16 hosts=zapi.HostGet() print(hosts) #[{u'host': u'Zabbix server', u'hostid': u'10084', u'interfaces': [{u'interfaceid': u'1', u'ip': u'127.0.0.1'}]}] if __name__ == '__main__': main()
下面看下使用python實現 Zabbix-API 監控的方法
做運維的朋友應該知道,公司IDC機房經常有上架、下架、報修和報廢的服務器。如果服務器數量很多的時候很容易造成監控遺漏。
大的互聯網公司把監控系統和CMDB(資產管理系統|配置管理數據庫系統)集成在一起,當上架一臺新機器的時候CMDB里面會記錄相關的信息,Zabbix根據CMDB里面信息自動Link相關的模塊,添加|刪除監控。很多小的公司沒有資產管理系統,但作為監控的負責人應該每天知道上架了哪些新的機器,確保能添加到Zabbix監控里面。
首先給大家說一下腳本思路:
1)通過Nmap工具掃描網段,掃描出已經使用的IP地址。
2)通過Nmap檢測已經掃描IP的3389或者22端口是否開放,可以判斷那些事windows機器,那些是Linux機器。
3)Linux下面通過ssh + hostname命令找出Linux主機名。
4)Windows下面通過nmblookup -A 命令找出Windows主機名。
5)用Python腳本讀掃描結果文件,把主機名寫到列表里面。
6)用Zabbix python API 調用已經監控的主機名,寫到列表里面。
7)兩個列表取交集,用for循環判斷哪些主機名沒有監控。
8)發郵件通知監控負責人。
下面我分享一下我寫的Python寫的腳本,其中scan_machine.sh是我調用的用Shell寫的關于Nmap掃描的腳本,scan_hostname.log是Nmap掃描的結果,里面內容是IP 主機名。
#!/usr/bin/env python#create by:sfzhang 20140820#coding=utf-8import os,sysimport jsonimport urllib2import datetime,timefrom urllib2 import URLError nmap_cmd = "/shell/machine/scan_machine.sh"def runCmd(command): global mail_cmd mail_cmd = '''mail -s "Report on not monitor Hosts of Zabbix" shifeng_zhang88 < /shell/machine/result/result.txt''' return os.system(command)runCmd(nmap_cmd)def nmap_host(): hostiplst = [] hostnamelst = [] f = file('/shell/machine/result/scan_hostname.log') for line in f.readlines(): hostip = line.split()[0] hostname = line.split()[1] hostiplst.append(hostip) hostnamelst.append(hostname) hostnamelst.sort() #print hostiplst return hostnamelst f.close()def zabbix_host(): zabbixhostlst= [] #based url and required header url = "http://192.168.161.128/api_jsonrpc.php" header = {"Content-Type": "application/json"} #request json data = json.dumps( { "jsonrpc": "2.0", "method": "host.get", "params":{ "output":["hostid","name"], "filter":{"host":""} }, #auth id "auth":"Zabbix Auth ID", "id": 1, }) #create request object request = urllib2.Request(url,data) for key in header: request.add_header(key,header[key]) #get host list try: result = urllib2.urlopen(request) except URLError as e: print "The server could not fulfill the request.",e.reason else: reponse = json.loads(result.read()) result.close() #print "Number of Hosts:",len(reponse['result']) for host in reponse['result']: #print "Host ID:",host['hostid'],"Host Name:",host['name'] zbxhosts=host['name'] zabbixhostlst.append(zbxhosts) zabbixhostlst.sort() return zabbixhostlst def main(): nmaphostlst = nmap_host() zbxhostlst = zabbix_host() diff = list(set(nmaphostlst) ^ set(zbxhostlst)) content = "\n" nomonitorlst = [] if len(diff) != 0: for host in diff: if host in nmaphostlst: nomonitorlst.append(host) else: sys.exit() #print zbxhostlst string = '\n'.join(nomonitorlst) f = file('/shell/machine/result/result.txt','w') f.write(string) f.flush() f.close() runCmd(mail_cmd)if __name__ == "__main__": main()
把腳本添加到crontab,每臺會收到關于那些主機沒有添加監控的信息。
總結:
1)Zabbix API相關信息可以查看官方詳細資料,看不懂英文的可以參考下面這篇文檔。http://paperplane.ruhoh.com/zabbix/intro-to-zabbix-api/
2)通過該腳本可以知道那些主機沒有添加監控,希望對大家有幫助,如果有更好的解決方法歡迎多多交流。
以上所述是小編給大家介紹的使用Python腳本實現Zabbix-API 監控,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。