利用zabbix API批量查詢(xún)主機(jī)肛鹏、模板逸邦、添加刪除主機(jī)

一、API簡(jiǎn)介

Zabbix API是在1.8版本中開(kāi)始引進(jìn)并且已經(jīng)被廣泛應(yīng)用龄坪。所有的Zabbix移動(dòng)客戶(hù)端都是基于API昭雌,甚至原生的WEB前端部分也是建立在它之上复唤。Zabbix API 中間件使得架構(gòu)更加模塊化也避免直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作健田。它允許你通過(guò)JSON
RPC協(xié)議來(lái)創(chuàng)建、更新和獲取Zabbix對(duì)象并且做任何你喜歡的操作【當(dāng)然前提是你擁有認(rèn)證賬戶(hù)】佛纫。

Zabbix API提供兩項(xiàng)主要功能:

遠(yuǎn)程管理Zabbix配置

遠(yuǎn)程檢索配置和歷史數(shù)據(jù)

使用JSON
API 采用JSON-RPC實(shí)現(xiàn)妓局。這意味著調(diào)用任何函數(shù),都需要發(fā)送POST請(qǐng)求呈宇,輸入輸出數(shù)據(jù)都是以JSON格式好爬。大致工作流如下:

  • 準(zhǔn)備JSON對(duì)象,它描述了你想要做什么(創(chuàng)建主機(jī)甥啄,獲取圖像存炮,更新監(jiān)控項(xiàng)等)。
  • 獲取JSON格式響應(yīng)。
  • 注:請(qǐng)求除了必須是POST方法之外有额,HTTP Header Content-Type必須為【application/jsonrequest般又,application/json-rpc,application/json】其中之一巍佑。

可以采用腳本或者任何"手動(dòng)"支持JSON RPC的工具來(lái)使用API茴迁。而首先需要了解的就是如何驗(yàn)證和如何使用驗(yàn)證ID來(lái)獲取想要的信息。后面的演示會(huì)以Python腳本和基于Curl的例子來(lái)呈現(xiàn)API的基本使用萤衰。

基本請(qǐng)求格式
Zabbix API 簡(jiǎn)化的JSON請(qǐng)求如下:

 {
 "jsonrpc": "2.0",
 "method": "method.name",
 "params": {
 "param_1_name": "param_1_value",
 "param_2_name": "param_2_value"
 },
 "id": 1,
 "auth": "159121b60d19a9b4b55d49e30cf12b81",
}

一行一行來(lái)看:

  • "jsonrpc": "2.0"-這是標(biāo)準(zhǔn)的JSON RPC參數(shù)以標(biāo)示協(xié)議版本笋熬。所有的請(qǐng)求都會(huì)保持不變。
  • "method": "method.name"-這個(gè)參數(shù)定義了真實(shí)執(zhí)行的操作腻菇。例如:host.create胳螟、item.update等等
  • "params"-這里通過(guò)傳遞JSON對(duì)象來(lái)作為特定方法的參數(shù)昔馋。如果你希望創(chuàng)建監(jiān)控項(xiàng),"name"和"key_"參數(shù)是需要的糖耸,每個(gè)方法需要的參數(shù)在Zabbix API文檔中都有描述秘遏。
  • "id": 1-這個(gè)字段用于綁定JSON請(qǐng)求和響應(yīng)。響應(yīng)會(huì)跟請(qǐng)求有相同的"id"嘉竟。在一次性發(fā)送多個(gè)請(qǐng)求時(shí)很有用邦危,這些也不需要唯一或者連續(xù)
  • "auth": "159121b60d19a9b4b55d49e30cf12b81"-這是一個(gè)認(rèn)證令牌【authentication token】用以鑒別用戶(hù)、訪(fǎng)問(wèn)API舍扰。這也是使用API進(jìn)行相關(guān)操作的前提-獲取認(rèn)證ID倦蚪。

以上參考zabbix小結(jié)(八)Zabbix api

二 、直接上工具腳本

下面參考利用zabbix api 添加監(jiān)控

集合腳本边苹,包含查詢(xún)主機(jī)陵且,主機(jī)組,模板个束,添加開(kāi)啟禁用刪除主機(jī)等功能

> vim zbx_tool.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import json
import sys
import urllib2
import argparse

from urllib2 import URLError

reload(sys)
sys.setdefaultencoding('utf-8')

class zabbix_api:
    def __init__(self):
        self.url = 'http://zabbix.xxx.com/api_jsonrpc.php'
        self.header = {"Content-Type":"application/json"}


    def user_login(self):
        data = json.dumps({
                           "jsonrpc": "2.0",
                           "method": "user.login",
                           "params": {
                                      "user": "admin",
                                      "password": "zabbix"
                                      },
                           "id": 0
                           })

        request = urllib2.Request(self.url, data)

        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            print "\033[041m 認(rèn)證失敗慕购,請(qǐng)檢查URL !\033[0m",e.code
        except KeyError as e:
            print "\033[041m 認(rèn)證失敗,請(qǐng)檢查用戶(hù)名密碼 !\033[0m",e
        else:
            response = json.loads(result.read())
            result.close()
            #print response['result']
            self.authID = response['result']
            return self.authID

    def hostid_get_hostname(self, hostId=''):
        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "host.get",
            "params": {
                "output": "extend",
                "filter": {"hostid": hostId}
            },
            "auth": self.user_login(),
            "id": 1
        })
        request = urllib2.Request(self.url, data)
        for key in self.header:
            request.add_header(key, self.header[key])
        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            if hasattr(e, 'reason'):
                print 'We failed to reach a server.'
                print 'Reason: ', e.reason
            elif hasattr(e, 'code'):
                print 'The server could not fulfill the request.'
                print 'Error code: ', e.code
        else:
            response = json.loads(result.read())
            #print response
            result.close()

            if not len(response['result']):
                print "hostId is not exist"
                return False

            #print "主機(jī)數(shù)量: \33[31m%s\33[0m" % (len(response['result']))
            host_dict=dict()
            for host in response['result']:
                status = {"0": "OK", "1": "Disabled"}
                available = {"0": "Unknown", "1": "available", "2": "Unavailable"}
                #if len(hostId) == 0:
                #    print "HostID : %s\t HostName : %s\t Status :\33[32m%s\33[0m \t Available :\33[31m%s\33[0m" % (
                #        host['hostid'], host['name'], status[host['status']], available[host['available']])
                #else:
                #    print "HostID : %s\t HostName : %s\t Status :\33[32m%s\33[0m \t Available :\33[31m%s\33[0m" % (
                #        host['hostid'], host['name'], status[host['status']], available[host['available']])
                host_dict['name']=host['name']
                host_dict['status']=status[host['status']]
                host_dict['available']=available[host['available']]
                return host_dict

    def hostid_get_hostip(self, hostId=''):
        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "hostinterface.get",
            "params": {
                "output": "extend",
                "filter": {"hostid": hostId}
            },
            "auth": self.user_login(),
            "id": 1
        })
        request = urllib2.Request(self.url, data)
        for key in self.header:
            request.add_header(key, self.header[key])
        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            if hasattr(e, 'reason'):
                print 'We failed to reach a server.'
                print 'Reason: ', e.reason
            elif hasattr(e, 'code'):
                print 'The server could not fulfill the request.'
                print 'Error code: ', e.code
        else:
            response = json.loads(result.read())
            # print response
            result.close()

            if not len(response['result']):
                print "\033[041m hostid \033[0m is not exist"
                return False

            #print "主機(jī)數(shù)量: \33[31m%s\33[0m" % (len(response['result']))
            for hostip in response['result']:
                #print hostip
                #if len(hostip) == 0:
                #    print "HostID : %s\t HostIp : %s \t Port : %s " % (hostip['hostid'], hostip['ip'], hostip['port'])
                #else:
                #    print "HostID : %s\t HostIp :\33[32m%s\33[0m \t Port :\33[31m%s\33[0m" % (
                #        hostip['hostid'], hostip['ip'], hostip['port'])
                return hostip['ip']

    def host_get(self,hostName=''):
        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {
                          "output": "extend",
                          #"filter":{"host":""}
                          "filter":{"host":hostName}
                          },
                "auth": self.user_login(),
                "id": 1
                })
        request = urllib2.Request(self.url,data)
        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            if hasattr(e, 'reason'):
                print 'We failed to reach a server.'
                print 'Reason: ', e.reason
            elif hasattr(e, 'code'):
                print 'The server could not fulfill the request.'
                print 'Error code: ', e.code
        else:
            response = json.loads(result.read())
            #print reqponse
            result.close()

            if not len(response['result']):
                print "\033[041m %s \033[0m is not exist" % hostName
                return False

            print "主機(jī)數(shù)量: \033[31m%s\033[0m"%(len(response['result']))
            for host in response['result']:
                status={"0":"OK","1":"Disabled"}
                available={"0":"Unknown","1":"available","2":"Unavailable"}
                #print host
                if len(hostName)==0:
                    print "HostID : %s\t HostName : %s\t HostIp : %s\t Status :%s \t Available :%s"%(host['hostid'],host['name'],self.hostid_get_hostip(hostId=host['hostid']),status[host['status']],available[host['available']])
                else:
                    print "HostID : %s\t HostName : %s\t HostIp : %s\t Status :\033[32m%s\033[0m \t Available :\033[31m%s\033[0m"%(host['hostid'],host['name'],self.hostid_get_hostip(hostId=host['hostid']),status[host['status']],available[host['available']])
                    return host['hostid']

    def hostip_get(self, hostIp=''):
        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "hostinterface.get",
            "params": {
                "output": "extend",
                "filter": {"ip": hostIp}
            },
            "auth": self.user_login(),
            "id": 1
        })
        request = urllib2.Request(self.url, data)
        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            if hasattr(e, 'reason'):
                print 'We failed to reach a server.'
                print 'Reason: ', e.reason
            elif hasattr(e, 'code'):
                print 'The server could not fulfill the request.'
                print 'Error code: ', e.code
        else:
            response = json.loads(result.read())
            # print response
            result.close()

            if not len(response['result']):
                print "\033[041m hostip \033[0m is not exist"
                return False

            print "主機(jī)數(shù)量: \33[31m%s\33[0m" % (len(response['result']))
            for hostip in response['result']:
                host = self.hostid_get_hostname(hostip['hostid'])
                if len(hostip) == 0:
                    print "HostID : %s\t HostName : %s\t HostIp : %s\t Status :\33[32m%s\33[0m \t Available :\33[31m%s\33[0m"%(hostip['hostid'],host['name'],hostip['ip'],host['status'],host['available'])
                else:
                    print "HostID : %s\t HostName : %s\t HostIp : %s\t Status :\33[32m%s\33[0m \t Available :\33[31m%s\33[0m"%(hostip['hostid'],host['name'],hostip['ip'],host['status'],host['available'])
                    return hostip['hostid']

    def hostgroup_get(self, hostgroupName=''):
        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method":"hostgroup.get",
                           "params":{
                                     "output": "extend",
                                     "filter": {
                                                "name": hostgroupName
                                                }
                                     },
                           "auth":self.user_login(),
                           "id":1,
                           })

        request = urllib2.Request(self.url,data)
        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            print "Error as ", e
        else:
            # result.read()
            response = json.loads(result.read())
            result.close()
            #print response()
            if not len(response['result']):
                print "\033[041m %s \033[0m is not exist" % hostgroupName
                return False

            for group in response['result']:
                if  len(hostgroupName)==0:
                    print "hostgroup:  \033[31m%s\033[0m \tgroupid : %s" %(group['name'],group['groupid'])
                else:
                    print "hostgroup:  \033[31m%s\033[0m\tgroupid : %s" %(group['name'],group['groupid'])
                    self.hostgroupID = group['groupid']
            return group['groupid']

    def template_get(self,templateName=''):
        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method": "template.get",
                           "params": {
                                      "output": "extend",
                                      "filter": {
                                                 "name":templateName
                                                 }
                                      },
                           "auth":self.user_login(),
                           "id":1,
                           })

        request = urllib2.Request(self.url, data)
        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            print "Error as ", e
        else:
            response = json.loads(result.read())
            result.close()
            #print response
            if not len(response['result']):
                print "\033[041m %s \033[0m is not exist" % templateName
                return False

            for template in response['result']:
                if len(templateName)==0:
                    print "template : %s \t id : %s" % (template['name'], template['templateid'])
                else:
                    self.templateID = response['result'][0]['templateid']
                    print "Template Name :%s"%templateName
                    return response['result'][0]['templateid']

    def hostgroup_create(self,hostgroupName):
        if self.hostgroup_get(hostgroupName):
            print "hostgroup  \033[42m%s\033[0m is exist !" % hostgroupName
            sys.exit(1)

        data = json.dumps({
                          "jsonrpc": "2.0",
                          "method": "hostgroup.create",
                          "params": {
                          "name": hostgroupName
                          },
                          "auth": self.user_login(),
                          "id": 1
                          })
        request=urllib2.Request(self.url,data)

        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
        except URLError as e:
            print "Error as ", e
        else:
            response = json.loads(result.read())
            result.close()
            print "添加主機(jī)組:%s  hostgroupID : %s"%(hostgroupName,self.hostgroup_get(hostgroupName))

    def host_create(self, hostIp, hostgroupName, templateName, hostName):
        if self.host_get(hostName) or self.hostip_get(hostIp):
            print "該主機(jī)已經(jīng)添加!"
            sys.exit(1)

        group_list=[]
        template_list=[]
        for i in hostgroupName.split(','):
            var = {}
            var['groupid'] = self.hostgroup_get(i)
            group_list.append(var)
        for i in templateName.split(','):
            var={}
            var['templateid']=self.template_get(i)
            template_list.append(var)

        data = json.dumps({
                           "jsonrpc":"2.0",
                           "method":"host.create",
                           "params":{
                                     "host": hostName,
                                     "interfaces": [
                                     {
                                     "type": 1,
                                     "main": 1,
                                     "useip": 1,
                                     "ip": hostIp,
                                     "dns": "",
                                     "port": "10050"
                                      }
                                     ],
                                   "groups": group_list,
                                   "templates": template_list,
                                     },
                           "auth": self.user_login(),
                           "id":1
        })
        request = urllib2.Request(self.url, data)
        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
            response = json.loads(result.read())
            result.close()
            print "add host : %s id :%s" % (hostIp, hostName)
        except URLError as e:
            print "Error as ", e
        except KeyError as e:
            print "\033[041m 主機(jī)添加有誤茬底,請(qǐng)檢查模板正確性或主機(jī)是否添加重復(fù) !\033[0m",e
            print response

    def host_disable(self,hostip):
        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "host.update",
                "params": {
                "hostid": self.host_get(hostip),
                "status": 1
                },
                "auth": self.user_login(),
                "id": 1
                })
        request = urllib2.Request(self.url,data)
        #opener = urllib2.build_opener(urllib2.HTTPBasicAuthHandler(TerminalPassword()))
        for key in self.header:
                request.add_header(key, self.header[key])
        try:
            result = urllib2.urlopen(request)
            #result = opener.open(request)
        except URLError as e:
            print "Error as ", e
        else:
            response = json.loads(result.read())
            result.close()
            print '------------主機(jī)現(xiàn)在狀態(tài)------------'
            print self.host_get(hostip)

    def host_enable(self,hostip):
        data=json.dumps({
            "jsonrpc": "2.0",
            "method": "host.update",
            "params": {
            "hostid": self.host_get(hostip),
            "status": 0
            },
            "auth": self.user_login(),
            "id": 1
            })
        request = urllib2.Request(self.url,data)
        for key in self.header:
            request.add_header(key, self.header[key])
        try:
            result = urllib2.urlopen(request)
            #result = opener.open(request)
        except URLError as e:
            print "Error as ", e
        else:
            response = json.loads(result.read())
            result.close()
            print '------------主機(jī)現(xiàn)在狀態(tài)------------'
            print self.host_get(hostip)

    def host_delete(self,hostNames):
        hostid_list=[]
        for hostName in hostNames.split(','):
            hostid = self.host_get(hostName=hostName)
            if not hostid:
                print "主機(jī) \033[041m %s\033[0m  刪除失敗 !" % hostName
                sys.exit()
            hostid_list.append(hostid)

        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "host.delete",
                "params": hostid_list,
                "auth": self.user_login(),
                "id": 1
                })

        request = urllib2.Request(self.url,data)
        for key in self.header:
            request.add_header(key, self.header[key])

        try:
            result = urllib2.urlopen(request)
            result.close()
            print "主機(jī) \033[041m %s\033[0m  已經(jīng)刪除 !" % hostName
        except Exception,e:
            print  e

if __name__ == "__main__":
    zabbix=zabbix_api()
    parser=argparse.ArgumentParser(description='zabbix api ',usage='%(prog)s [options]')
    parser.add_argument('-H','--host',nargs='?',dest='listhost',default='host',help='查詢(xún)主機(jī)')
    parser.add_argument('-G','--group',nargs='?',dest='listgroup',default='group',help='查詢(xún)主機(jī)組')
    parser.add_argument('-T','--template',nargs='?',dest='listtemp',default='template',help='查詢(xún)模板信息')
    parser.add_argument('-A','--add-group',nargs=1,dest='addgroup',help='添加主機(jī)組')
    parser.add_argument('-C','--add-host',dest='addhost',nargs=4,metavar=('192.168.2.1', 'groupname', 'Template01,Template02', 'hostName'),help='添加主機(jī),多個(gè)主機(jī)組或模板使用逗號(hào)')
    parser.add_argument('-d','--disable',dest='disablehost',nargs='+',metavar=('sh-aa-01'),help='禁用主機(jī),填寫(xiě)主機(jī)名沪悲,多個(gè)主機(jī)名之間用逗號(hào)')
    parser.add_argument('-e','--enable',dest='enablehost',nargs=1,metavar=('sh-aa-01'),help='開(kāi)啟主機(jī)')
    parser.add_argument('-D','--delete',dest='deletehost',nargs='+',metavar=('sh-aa-01'),help='刪除主機(jī),多個(gè)主機(jī)之間用逗號(hào)')
    parser.add_argument('-v','--version', action='version', version='%(prog)s 1.0')

    if len(sys.argv) == 1:
        #print parser.print_help()
        #print zabbix.host_get(hostName='bbb')
        #print zabbix.hostip_get(hostIp='127.0.0.1')
        #print zabbix.hostid_get_hostname(hostId='10108')
        #print zabbix.hostid_get_hostid(hostId='10105')
        #print zabbix.hostgroup_get(hostgroupName='Linux servers')
        #print zabbix.hostgroup_get(hostgroupName='aaa')
        # ...
        print zabbix.host_delete('hz-aaa-02')
    else:
        args = parser.parse_args()
        if args.listhost != 'host':
            if args.listhost:
                zabbix.host_get(args.listhost)
            else:
                zabbix.host_get()
        if args.listgroup != 'group':
            if args.listgroup:
                zabbix.hostgroup_get(args.listgroup)
            else:
                zabbix.hostgroup_get()
        if args.listtemp != 'template':
            if args.listtemp:
                zabbix.template_get(args.listtemp)
            else:
                zabbix.template_get()
        if args.addgroup:
            zabbix.hostgroup_create(args.addgroup[0])
        if args.addhost:
            zabbix.host_create(args.addhost[0], args.addhost[1], args.addhost[2], args.addhost[3])
        if args.disablehost:
            zabbix.host_disable(args.disablehost)
        if args.deletehost:
            zabbix.host_delete(args.deletehost[0])
  • 先用pip安裝argparse

用法如下

> python zbx_tool.py -h
usage: zbx_tool.py [options]

zabbix api

optional arguments:
  -h, --help            show this help message and exit
  -H [LISTHOST], --host [LISTHOST]
                        查詢(xún)主機(jī)
  -G [LISTGROUP], --group [LISTGROUP]
                        查詢(xún)主機(jī)組
  -T [LISTTEMP], --template [LISTTEMP]
                        查詢(xún)模板信息
  -A ADDGROUP, --add-group ADDGROUP
                        添加主機(jī)組
  -C 192.168.2.1 groupname Template01,Template02 hostName, --add-host 192.168.2.1 groupname Template01,Template02 hostName
                        添加主機(jī),多個(gè)主機(jī)組或模板使用逗號(hào)
  -d sh-aa-01 [sh-aa-01 ...], --disable sh-aa-01 [sh-aa-01 ...]
                        禁用主機(jī),填寫(xiě)主機(jī)名,多個(gè)主機(jī)名之間
                        ¨逗號(hào)
  -e sh-aa-01, --enable sh-aa-01
                        開(kāi)啟主機(jī)
  -D sh-aa-01 [sh-aa-01 ...], --delete sh-aa-01 [sh-aa-01 ...]
                        刪除主機(jī),多個(gè)主機(jī)之間用逗號(hào)
  -v, --version         show program's version number and exit

執(zhí)行查看

> python zbx_tool.py -H
主機(jī)數(shù)量: 1
HostID : 10084   HostName : Zabbix server    Status :OK      Available :available

> python zbx_tool.py -G
hostgroup:  Templates   groupid : 1
hostgroup:  Linux servers   groupid : 2
hostgroup:  Zabbix servers  groupid : 4
hostgroup:  Discovered hosts    groupid : 5
hostgroup:  Virtual machines    groupid : 6
hostgroup:  Hypervisors     groupid : 7

> python zbx_tool.py -T
template : Template OS Linux     id : 10001
template : Template App Zabbix Server    id : 10047
template : Template App Zabbix Proxy     id : 10048
template : Template App Zabbix Agent     id : 10050
template : Template SNMP Interfaces      id : 10060
...

> python zbx_tool.py -C 1.1.1.10 'Linux servers','Zabbix servers' 'Template OS Linux' hz-aaa-01
主機(jī)數(shù)量: 0
hostgroup:  Linux servers   groupid : 2
hostgroup:  Zabbix servers  groupid : 4
Template Name :Template OS Linux
add host : 1.1.1.10 id :[u'10105']
> python zbx_tool.py -C 1.1.1.10 'Linux servers','Zabbix servers' 'Template OS Linux' hz-aaa-01
主機(jī)數(shù)量: 0
hostgroup:  Linux servers   groupid : 2
hostgroup:  Zabbix servers  groupid : 4
Template Name :Template OS Linux
 主機(jī)添加有誤阱表,請(qǐng)檢查模板正確性或主機(jī)是否添加重復(fù) ! 'result'
{u'jsonrpc': u'2.0', u'id': 1, u'error': {u'message': u'Invalid params.', u'code': -32602, u'data': u'Host with the same name "hz-aaa-01" already exists.'}}

> 還有其他用法就不一一舉例了

腳本完成殿如,在原作者基礎(chǔ)上略作修改,以適應(yīng)自己的項(xiàng)目 ~

三最爬、批量操作腳本

準(zhǔn)備target文件

> vim target
sh-aaa-01,1.1.1.1
sh-aaa-02,1.1.1.2
sh-aaa-03,1.1.1.3
sh-aaa-04,1.1.1.4

批量添加主機(jī)的target文件如上涉馁,主機(jī)名和ip用逗號(hào)分隔;
其他批量操作烂叔,只寫(xiě)入主機(jī)名即可谨胞;

批量腳本

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import os
import sys
import argparse

# 導(dǎo)入zabbix_tool.py的zabbix_api類(lèi)                                                                                                                             
from zbx_tool import zabbix_api  

reload(sys)
sys.setdefaultencoding('utf-8')

host_file = 'target'
base_templates = "'aaa',"
cmd = 'python zbx_tool.py'

# 實(shí)例化zabbix_api                                                                                                                                                                   
zabbix=zabbix_api()  

def create_hosts():
    groups = raw_input("Please Input Group Name: ")
    add_templates = raw_input("Please Input Template Name: ")
    templates = base_templates + add_templates
    cmd1 = cmd + ' -A ' + groups
    os.system(cmd1)

    with open(host_file) as fb:
        host_info = dict(line.strip().split(',') for line in fb)

    for hostname in host_info:
        cmd2 = cmd + ' -C ' + host_info[hostname] + ' ' + groups + ' ' +templates + ' ' + hostname
        os.system(cmd2)

# 如果本機(jī)是sat,target文件可以只寫(xiě)主機(jī)名蒜鸡,然后用salt獲取ip,上一段腳本如下修改:
#    with open(host_file) as fb:
#        host_info = list(line.strip() for line in fb)
#
#    for hostname in host_info:
#        ip_cmd='salt ' + hostname + ' grains.item fqdn_ip4|xargs'
#        ip = os.popen(ip_cmd).read().split()[4]
#        cmd2 = cmd + ' -C ' + ip + ' ' + groups + ' ' +templates + ' ' + hostname
#        os.system(cmd2)

def get_hosts(): 
   with open(host_file) as fb:                                                                                                                                  
       [zabbix.host_get(line.strip()) for line in fb] 

def delete_hosts():
   with open(host_file) as fb:
       [zabbix.host_delete(line.strip()) for line in fb] 

def enable_hosts():
   with open(host_file) as fb:
       [zabbix.host_enablee(line.strip()) for line in fb] 

def disable_hosts():
   with open(host_file) as fb:
       [zabbix.host_disable(line.strip()) for line in fb] 

if __name__ == "__main__":
    if len(sys.argv) == 1 or sys.argv[1] == '-h':
        print "you need a argv,like:"
        print """
        python zbx_cli.py -A #批量添加主機(jī)
        python zbx_cli.py -C #批量查詢(xún)主機(jī)
        python zbx_cli.py -D #批量刪除主機(jī)
        python zbx_cli.py -e #批量開(kāi)啟主機(jī)
        python zbx_cli.py -d #批量禁止主機(jī)
        """
    else:
        if sys.argv[1] == '-A':
            create_hosts()
        elif sys.argv[1] == '-C':
            get_hosts()
        elif sys.argv[1] == '-D':
            delete_hosts()
        elif sys.argv[1] == '-e':
            disable_hosts()
        elif sys.argv[1] == '-d':
            enable_hosts()

執(zhí)行測(cè)試

python zbx_cli.py -D
主機(jī)數(shù)量: 1
HostID : 12440   HostName : hz-xxx-xxx-api-online-07     HostIp : 1.1.1.1    Status :OK      Available :available
主機(jī)  hz-xxx-xxx-api-online-07 已經(jīng)刪除 !
主機(jī)數(shù)量: 1
HostID : 12439   HostName : hz-xxx-xxx-api-online-08     HostIp : 1.1.1.2    Status :OK      Available :available
主機(jī)  hz-xxx-xxx-api-online-08  已經(jīng)刪除 !
主機(jī)數(shù)量: 1
...

其他就不貼執(zhí)行效果了胯努,自己試;
這兩個(gè)腳本最好放一塊逢防,因?yàn)閦abbix_cli.py的批量操作是通過(guò)調(diào)用zabbix_tool.py完成的

~ 好了叶沛,zabbix API 嘗試到此結(jié)束
腳本完成,在原作者基礎(chǔ)上略作修改忘朝,以適應(yīng)自己的項(xiàng)目 ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灰署,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溉箕,老刑警劉巖晦墙,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肴茄,居然都是意外死亡晌畅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)寡痰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抗楔,“玉大人,你說(shuō)我怎么就攤上這事拦坠×铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵贞滨,是天一觀的道長(zhǎng)入热。 經(jīng)常有香客問(wèn)我,道長(zhǎng)疲迂,這世上最難降的妖魔是什么才顿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任莫湘,我火速辦了婚禮尤蒿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幅垮。我一直安慰自己腰池,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布忙芒。 她就那樣靜靜地躺著示弓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呵萨。 梳的紋絲不亂的頭發(fā)上奏属,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音潮峦,去河邊找鬼囱皿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛忱嘹,可吹牛的內(nèi)容都是我干的嘱腥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拘悦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼齿兔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤分苇,失蹤者是張志新(化名)和其女友劉穎添诉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體医寿,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吻商,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糟红。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾帐。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盆偿,靈堂內(nèi)的尸體忽然破棺而出柒爸,到底是詐尸還是另有隱情,我是刑警寧澤事扭,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布捎稚,位于F島的核電站,受9級(jí)特大地震影響求橄,放射性物質(zhì)發(fā)生泄漏今野。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一罐农、第九天 我趴在偏房一處隱蔽的房頂上張望条霜。 院中可真熱鬧,春花似錦涵亏、人聲如沸宰睡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拆内。三九已至,卻和暖如春宠默,著一層夾襖步出監(jiān)牢的瞬間麸恍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工搀矫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抹沪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓艾君,卻偏偏與公主長(zhǎng)得像采够,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冰垄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Zabbix簡(jiǎn)介 Zabbix官方網(wǎng)站Zabbix中文文檔 本文系統(tǒng)環(huán)境是CentOS7x86_64, Zabbi...
    Zhang21閱讀 8,016評(píng)論 0 37
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理蹬癌,服務(wù)發(fā)現(xiàn)权她,斷路器,智...
    卡卡羅2017閱讀 134,702評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,297評(píng)論 25 707
  • 什么是API接口 API(Application Programming Interface逝薪,應(yīng)用程序編程接口)是...
    運(yùn)維阿文閱讀 3,490評(píng)論 0 1
  • 教育在中國(guó)人的心中一直有很高的重視程度隅要,這本身很好! 但教育有些時(shí)候大部分人進(jìn)入了一些誤區(qū)董济,比如教育許多人把這件事...
    何蓉閱讀 280評(píng)論 0 1