018-zabbix_api

Zabbix API 簡介

Zabbix API 開始扮演着愈來愈重要的角色,尤爲是在集成第三方軟件和自動化平常任務時。
很難想象管理數千臺服務器而沒有自動化是多麼的困難。
Zabbix API 爲批量操做、第三方軟件集成以及其餘做用提供可編程接口。

Zabbix API 是在 1.8 版本中開始引進而且已經被普遍應用。全部的 Zabbix 移動客戶端都是基於 API,
甚至原生的 WEB 前端部分也是創建在它之上。
Zabbix API 中間件使得架構更加模塊化也避免直接對數據庫進行操做。
它容許你經過 JSON RPC 協議來建立、更新和獲取 Zabbix 對象而且作任何你喜歡的操做【固然前提是你擁有認證帳戶】。

Zabbix API 提供兩項主要功能:

1. 遠程管理 Zabbix 配置
2. 遠程檢索配置和歷史數據

使用 JSON
API 採用 JSON-RPC 實現。這意味着調用任何函數,都須要發送 POST 請求,輸入輸出數據都是以 JSON 格式。

Zabbix API 的使用流程

使用 API 的基本步驟

  1. 鏈接 http://x.x.x.x/api_jsonrpc.php 提供用戶名和密碼,
    並標識 HTTP 頭部 Content-Type:application/json,HTTP 方法爲 POST。
  2. 獲取 SESSIONID
  3. 經過 SESSIONID 創建後續的鏈接
  4. 提交 POST 數據,格式爲 JSON,其中放對應的方法,獲取須要的數據。

三、格式及參數說明php

zabbix-api的json格式主要包括如下內容:html

jsonrpc - API使用的JSON-RPC協議的版本; Zabbix API實現JSON-RPC版本2.0;前端

method - 調用的API方法;node

params - 將被傳遞給API方法的參數;python

auth -用戶認證令牌;linux

id - 請求的任意標識符;算法

zabbix表結構sql

hosts主要表結構和各字段的意思數據庫

hostid 主機ID/模版ID readonly編程

proxy_hostid 代理主機ID,即這臺主機經過該代理主機去監控

host 主機名,監控agent端ID字段

status 主機狀態

0 已啓用,監視這臺主機

1 停用的,不監視這臺主機

3 模版

5 主動模式 建立代理時使用

6 被動模式 建立代理時使用

available 客戶端agent主機是否可用 readonly

0 未知或模版

1 可用

2 不可用

description 描述主機

disable_until 下一次輪詢一個不可用主機的時間,默認只讀readonly

ipmi_authtype 認證算法

-1 默認

0 無

1 MD2

2 MD5

4 Straight

5 OEM

6 RMCP+

ipmi_privilege 特權級別

1 回調

2 用戶 默認

3 操做者

4 管理者

5 OEM

ipmi_available 可用的ipmiagent

0 未知

1 可用

2 不可用

ipmi_disable_until ipmi不可用時下一次的輪詢時間

ipmi_error ipmi不可用的錯誤信息

ipmi_errors_from ipmi不可用狀態從何時開始

ipmi_password ipmi 密碼

ipmi_username ipmi用戶名

jmx_available 可用的jmxagent

0 未知

1 可用

2 不可用

jmx_disable_until 當jmx不可用時下一次輪詢當時間

jmx_error jmx不可用錯誤信息

jmx_errors_from jmx 不可用狀態開始時間

maintenance_from 資產維護開始時間

maintenance_status 生效當狀態

0 不維護

1 維護生效

maintenance_type 生效維護的類型

0 經過數據收集維護 默認

1 非數據收集維護

maintenanceid 維護的ID,若是當前主機處於維護狀態,不然爲null

snmp_available snmp是否可用

0 未知

1 可用

2 不可用

snmp_disable_until 當snmp不可用時下一次輪詢時間

snmp_error 不可用時錯誤信息

snmp_errors_from 錯誤開始時間

error 當agent不可用時顯示當錯誤信息

error_from 故障時間 當agent不可用時開始的時間

name 主機顯示的名稱,便可見名稱,默認是用host字段是值填充

flags 主機來源

0 表示普通的主機

4 表示自動發現的主機

inventory_mode 主機資產類型

-1 禁用

0 手動,默認值

自動

監控項items

itemid 監控項ID

type 監控項類型

0 Zabbix 客戶端,

1 SNMPv1 客戶端,

2 Zabbix採集器,

3 簡單檢查,

4 SNMPv2 客戶端,

5 Zabbix內部,

6 SNMPv3 客戶端,

7 Zabbix客戶端(主動式),

8 Zabbix整合,

10 外部檢查,

11 數據庫監控,

12 IPMI客戶端,

13 SSH 客戶端,

14 TELNET客戶端,

15 可計算的,

16 JMX agent代理程序,

17 SNMP trap

hostid 關聯主機ID

name 監控項名稱

key_ 監控項key值

delay 間隔/秒

history 歷史數據保留時間/天

trends 趨勢數據保留時間/天 默認365天

status 監控項啓用狀態

0 啓用

1 禁用

value_type 數據類型,對應的存放歷史數據表

0 history表 numeric float

1 history_str表 character

2 history_log表 log

3 history_uint表 numeric unsigned

4 history_text表 text

authtype ssh認證方法,只有經過ssh代理方式時使用

0 密碼

1 public key

units 數據類型單位

data_type 數據類型

0 decimal 十進制

1 octal 八進制

2 hexadecimal 十六進制

3 boolean 布爾

delay_flex 自定義間隔

delta 存儲的值

0 (default) as is

1 Delta, speed per second

2 Delta, simple change

error 若是監控項有問題會自動更新這個錯誤信息 readonly

history 監控項保持的歷史數據時長,默認90天,單位天

formula 公式,自定義乘數

1 默認值

lastclock 監控項最後一次更新時間

logtimefmt 格式化日誌時間

templateid 監控項對應的父模版ID,該ID自關聯,模版對應的爲hostid至關於模版分組

flags 監控項來源

0 普通

4 自動發現

interfaceid 網卡IP,對應interface表interfaceid

params 額外的參數類型取決於監控項

針對ssh和telnet監控項 執行腳本

數據庫監控項 執行sql

計算類型 執行公式

port 針對snmp監控項,端口監控

password 密碼認證,針對簡單檢查,ssh,telnet,數據庫監視,jmx監控項

description 監控項描述信息

state 該監控項是否適用

0 支持

1不支持

 

用 curl 模擬 API 的使用

# 1. 獲取 SESSIONID [root@linux-node1 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' > { > "jsonrpc": "2.0", > "method": "user.login", > "params": { > "user": "Admin", > "password": "zabbix" > }, > "id": 1 > }' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": "6a0d235908c25a495f0d356157fbb3d3" } # 2. 用獲取的 SESSIONID 去調用 API 的 host.get 方法請求 hostid [root@linux-node1 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' > { > "jsonrpc": "2.0", > "method": "host.get", > "params": { > "output": ["hostid"] > }, > "auth": "6a0d235908c25a495f0d356157fbb3d3", > "id": 1 > }' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": [ { "hostid": "10084" }, { "hostid": "10120" } ] } 

能夠經過 API 來添加和刪除 Host,這裏就不舉例了,具體方法參考官網文檔。
在實際的 API 開發應用中,咱們能夠採用 Python 等其餘編程語言中來實現。 以下,就是用 Python 寫的用於認證獲取 SESSIONID 的代碼例子:

#!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json url = 'http://192.168.56.11/zabbix/api_jsonrpc.php' post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1 } post_header = {'Content-Type': 'application/json'} ret = requests.post(url, data=json.dumps(post_data), headers=post_header) zabbix_ret = json.loads(ret.text) if not zabbix_ret.has_key('result'): print 'login error' else: print zabbix_ret.get('result') 

執行腳本時,注意要安裝 Python requests 模塊。

[root@linux-node1 ~]# python zabbix_auth.py Traceback (most recent call last): File "zabbix_auth.py", line 4, in <module> import requests ImportError: No module named requests [root@linux-node1 ~]# yum install python-pip -y [root@linux-node1 ~]# pip install requests [root@linux-node1 ~]# python zabbix_auth.py f2453c4cc730d5158a87e0754940138e 

 

  

調用Zabbix api使用的是HTTP的POST請求方式

其中請求的頭部爲:

{"Content-Type": "application/json-rpc"}
 

請求的URL爲:

http://zabbix.aek.com/api_jsonrpc.php
 

若是url中包含目錄須要把目錄寫上,如http://zabbix.aek.com/zabbix/api_jsonrpc.php,最後就是請求的數據(data),好比獲取Token,建立主機,獲取主機ID,獲取模板ID,獲取組ID,刪除主機等。

 

接下以以Python調用 API爲例,例出用法案例:

測試鏈接是否成功

#!/usr/bin/python #coding:utf:8 import requests import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":None,"params":{}} request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)
 

上面的data用來測試是否可鏈接成功,官方文檔中auth的值爲null,但在python中null用None表示,因此須要改爲None。

成功後返回值大概以下:會顯示zabbix版本

{"jsonrpc":"2.0","result":"3.2.3","id":1}
 

獲取Token

#!/usr/bin/python #coding:utf:8 import requests import json url = "http://zabbix.aek.com/zabbix/api_jsonrpc.php" header = {"Content-Type": "application/json-rpc"} data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1, "auth": None } request = requests.post(url=url, headers=header, data=json.dumps(data)) print(request.content)
 

成功後返回值以下:會返回一個Token

{"jsonrpc":"2.0","result":"391277f070a3ebc5b2afe9cf466cb74c","id":1}
 

最後以一個完整的Python腳本經過zabbix API獲取全部主機的信息爲例:

#!/usr/bin/python #coding:utf:8 import requests import json class Zabbix: def __init__(self, url, header, username, password): self.url = url self.header = header self.username = username self.password = password def getToken(self): #獲取Token並返回字符Token字符串 data = {"jsonrpc": "2.0", "method": "user.login", "params": { "user": self.username, "password": self.password }, "id": 1, "auth": None } token = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(token.content)["result"] def getAllHost(self): #獲取全部主機信息 data = {"jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host", ], "selectGroups": "extend", "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 2, "auth": self.getToken() } hosts = requests.post(url=self.url, headers=self.header, data=json.dumps(data)) return json.loads(hosts.content)["result"] if __name__ == "__main__": header = {"Content-Type": "application/json-rpc"} url="http://zabbix.aek.com/zabbix/api_jsonrpc.php" test = Zabbix(url=url, header=header, username="Admin", password="zabbix") print(test.getAllHost())
 

經過以上的學習相信你們對Zabbix API已經有一個初步的認識,後面將會經過API去完成主機的自動添加,自動化報表等使用

 

 

 

python3(requests)調用zabbix-4.2.3-api添加修改主機

自動化是需求,手動太慢,自動發現沒玩過。用的比較多的就是調API來操做。

zabbix版本爲4.2.3 python3 須要reuquests,json模塊

下面是代碼,只寫了添加和刪除的功能,有需求的能夠本身加一下

'''
2019.6.19
zabbix API 修改主機
'''

import json,requests

headers={"Content-Type":"application/json"}
url 'http://www.zabbix.com/zabbix/api_jsonrpc.php'

def getAuth(user,password):
    try:
        global headers, url
        data = json.dumps({
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": user,
            "password": password
        },
        "id": 1,
        })
        res = requests.post(url,data=data,headers=headers)
        auth = res.json().get('result','')
        return  auth
    except Exception as err:
        pass

def getHost(auth):
    try:
        global headers,url
        data = json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {
                    "output": [
                        "hostid",
                        "host"],
                    "selectInterfaces": [
                        "interfaceid",
                        "ip"]},
                "id": 2,
                "auth": auth
            })
        res = requests.post(url,data=data,headers=headers)
        host = res.json()
        return  host
    except:
        pass


def getGroupid(auth,groupname):
    try:
        global headers, url
        data = json.dumps({
                "jsonrpc": "2.0",
                "method": "hostgroup.get",
                "params": {
                    "output": "extend",
                    "filter": {
                        "name": [groupname]}},
                "auth": auth,
                "id": 1
        })
        res = requests.post(url,data=data,headers=headers)
        groupid = res.json()['result'][0]['groupid']
        return groupid
    except:
        pass

def getTempid(auth,tempname):
    try:
        global headers, url
        # print(templist)
        data = json.dumps(
            {
                "jsonrpc": "2.0",
                "method": "template.get",
                "params": {
                    "output": "extend",
                    "filter": {
                        "host": tempname}},
                "auth": auth,
                "id": 1}
        )
        res = requests.post(url,data=data,headers=headers)
        tempid []
        for i in range(len(res.json()['result'])):
            id = res.json()['result'][i]['templateid']
            tempid.append(id)
        return  tempid
    except:
        pass

def createHost(auth,hostname,ip,port,groupid,templateid):
    try:
        global headers, url
        templist []
        # print(templateid)
        for i in templateid:
            var {}
            var['templateid'= i
            templist.append(var)
        data = json.dumps({
                "jsonrpc": "2.0",
                "method": "host.create",
                "params": {
                    "host": hostname,
                    "interfaces": [
                        {
                            "type": 1,
                            "main": 1,
                            "useip": 1,
                            "ip": ip,
                            "dns": "",
                            "port": port}],
                    "groups": [{"groupid": groupid}],
                    "templates": templist,},
                "auth": auth,
                "id": 1})
        res = requests.post(url,data=data,headers=headers)
        if 'result' in res.text:
            print ('主機: %s -------添加成功' %hostname)
        else:
            print ('主機: %s -------添加失敗'%hostname)
    except:
        pass

def host_get(auth,hostName=''):
    try:
        global url,headers
        data = json.dumps({
            "jsonrpc": "2.0",
            "method": "host.get",
            "params": {
                "output": "extend",
                "selectParentTemplates": ["host"],
                "filter": {"host": hostName}
            },
            "auth": auth,
            "id": 1
        })
        res = requests.post(url=url, data=data, headers=headers)
        response = json.loads(res.content)
        print("主機數量: \33[31m {} \33[0m".format(len(response['result'])))
        # print(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 HostName : %s Status :\33[32m%s\33[0m Available :\33[31m%s\33[0m" % (
                host['hostid'], host['name'], status[host['status']], available[host['available']]))
            else:
                print("HostID : %s HostName : %s Status :\33[32m%s\33[0m Available :\33[31m%s\33[0m" % (
                host['hostid'], host['name'], status[host['status']], available[host['available']]))                
return host['hostid']    
except:        
pass


def host_delete(auth, hostid):    
try:        
global url,headers        data 
= json.dumps({            
"jsonrpc": "2.0",            
"method": "host.delete",            
"params": [hostid],            
"auth": auth,            
"id": 1        
})        res 
= requests.post(url=url, data=data, headers=headers)        response 
= json.loads(res.content)        
print ("主機:%s  -----------已經刪除 !"%hostid)    
except:        
pass


if __name__ == '__main__':    
user 'admin'    password 
'password'    
#主機羣組名    groupname 
'Linux servers'    
#模版名    
# tempname = ["Template OS Linux","Template DB MySQL"]    tempname 
["Template OS Linux"]    
#獲取key    auth 
= getAuth(user,password)    
#獲取組id    groupid 
= getGroupid(auth,groupname)    
#獲取模版id    tempid 
= getTempid(auth,tempname)    
print('請先修改主機列表後執行')    

# createhostlist = [    
#     "center,172.17.0.12,10050"    
#     "logserver,172.17.0.12,10050"    
#     "testserver,172.17.0.12,10050"    
# ]    
# for host in createhostlist:    
#     list1 = host.split(',')    
#     hostname = list1[0]    
#     hostip = list1[1]    
#     port = list1[2]    
#     createHost(auth,hostname,hostip,port,groupid,tempid)    


# delhostlist = [    
#     "dxc_0_12,172.17.0.12,10050"    
# ]    
#    
# for host in delhostlist:    
#     list1 = host.split(',')    
#     hostname = list1[0]    
#     hostid = host_get(auth,hostname)    
#     host_delete(auth,hostid)
 
 

腳本1、進入監控主機
[root@server6 zabbix]# vim zabbix-api.sh
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "westos"
},
"id": 1,
"auth": null
}' http://172.25.23.1/zabbix/api_jsonrpc.php | python -m json.tool

[root@server6 zabbix]# sh zabbix-api.sh
{
"id": 1,
"jsonrpc": "2.0",
"result": "fc716ee078209e8e6c445ba67e9c93f8"
}

腳本2、查詢主機的信息
[root@server6 zabbix]# vim zabbix-api.sh

curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
#這裏的信息是第一個腳本里面查詢出來的
"auth": "fc716ee078209e8e6c445ba67e9c93f8"
}' http://172.25.23.1/zabbix/api_jsonrpc.php | python -m json.tool
[root@server6 zabbix]# sh zabbix-api.sh
{
"id": 2,
"jsonrpc": "2.0",
"result": [
{
"host": "Zabbix server",
"hostid": "10084",
"interfaces": [
{
"interfaceid": "1",
"ip": "127.0.0.1"
}
]
},
{
"host": "server6",
"hostid": "10258",
"interfaces": [
{
"interfaceid": "6",
"ip": "172.25.23.6"
}
]
}
]
}

 

腳本三:刪除監控主機
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.delete",
"params": [
"10259"
],
"auth": "fc716ee078209e8e6c445ba67e9c93f8",
"id": 2
}' http://172.25.23.1/zabbix/api_jsonrpc.php | python -m json.tool

[root@server6 zabbix]# sh zabbix-del.sh
{
"id": 2,
"jsonrpc": "2.0",
"result": {
"hostids": [
"10259"
]
}
}

 

腳本4、實現建立主機腳本
[root@server6 zabbix]# vim zabbix-create.sh


curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "Linux server",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "172.25.23.6",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "2"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"auth": "fc716ee078209e8e6c445ba67e9c93f8",
"id": 1
}' http://172.25.23.1/zabbix/api_jsonrpc.php | python -m json.tool

[root@server6 zabbix]# sh zabbix-create.sh
{
"id": 1,
"jsonrpc": "2.0",
"result": {
"hostids": [
"10260"
]
}
}

 

 

 

 

 

 

 

 

 測試過的批量添加腳本:

 

 
     

 [root@zabbix scripts]# echo 192.168.1.{20..100} | xargs -n1 > list.txt



[root@zabbix scripts]# cat zabbix_host_creates.sh #/bin/bash url='http://192.168.1.129/zabbix/api_jsonrpc.php' user=Admin pass=zabbix token=`curl -s -X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "'$user'", "password": "'$pass'" }, "id": 1 }' $url | python -m json.tool ` jsson=`echo "$token" | grep result | awk -F '"' '{print $4}'` #echo $jsson #create hosts for ip in `cat list.txt` do curl -s -X POST -H "Content-Type: application/json" -d ' { "jsonrpc": "2.0", "method": "host.create", "params": { "host": "'$ip'", "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": "'$ip'", "dns": "", "port": "10050" } ], "groups": [ { "groupid": "16" } ], "templates": [ { "templateid": "10001" } ] }, "auth": "'$jsson'", "id": 1 }' $url | python -m json.tool done

建立須要添加的ip列表

[root@zabbix scripts]# cat list.txt 
192.168.1.20
192.168.1.21
192.168.1.22
192.168.1.23
192.168.1.24
192.168.1.25
192.168.1.26
192.168.1.27
192.168.1.28
192.168.1.29
192.168.1.30
192.168.1.31
192.168.1.32
192.168.1.33
192.168.1.34
192.168.1.35
192.168.1.36
192.168.1.37
192.168.1.38
192.168.1.39
192.168.1.40
192.168.1.41
192.168.1.42
192.168.1.43
192.168.1.44
192.168.1.45
192.168.1.46
192.168.1.47
192.168.1.48
192.168.1.49
192.168.1.50
192.168.1.51
192.168.1.52
192.168.1.53
192.168.1.54
192.168.1.55
192.168.1.56
192.168.1.57
192.168.1.58
192.168.1.59
192.168.1.60
192.168.1.61
192.168.1.62
192.168.1.63
192.168.1.64
192.168.1.65
192.168.1.66
192.168.1.67
192.168.1.68
192.168.1.69
192.168.1.70
192.168.1.71
192.168.1.72
192.168.1.73
192.168.1.74
192.168.1.75
192.168.1.76
192.168.1.77
192.168.1.78
192.168.1.79
192.168.1.80
192.168.1.81
192.168.1.82
192.168.1.83
192.168.1.84
192.168.1.85
192.168.1.86
192.168.1.87
192.168.1.88
192.168.1.89
192.168.1.90
192.168.1.91
192.168.1.92
192.168.1.93
192.168.1.94
192.168.1.95
192.168.1.96
192.168.1.97
192.168.1.98
192.168.1.99
192.168.1.100

 

 

編輯Excel模板

主機名、顯示名、IP、主機組、模板

 

編寫Python腳本,參考http://www.361way.com/zabbix-api-2/3681.html

#!/usr/bin/python
#coding:utf-8
 
import json
import urllib.request
from urllib.error import URLError
import sys,argparse
import xlrd
 
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
    reload(sys)
    sys.setdefaultencoding(defaultencoding)
 
class zabbix_api:
        def __init__(self):
            self.url = 'http://zabbix 服務器地址/zabbix/api_jsonrpc.php' #修改URL
            self.header = {"Content-Type":"application/json"}
 
 
        def user_login(self):
            data = json.dumps({
                               "jsonrpc": "2.0",
                               "method": "user.login",
                               "params": {
                                          "user": "帳號",
                                          "password": "密碼"
                                          },
                               "id": 0
                               })
 
            # data = urllib.parse.quote_plus(data).encode("utf-8")
            data = data.encode("utf-8")
            request = urllib.request.Request(self.url, data)
            for key in self.header:
                request.add_header(key, self.header[key])
 
            try:
                result = urllib.request.urlopen(request)
            except URLError as e:
                print ("用戶認證失敗,請檢查 !", e.code)
            else:
                response = json.loads(result.read())
                result.close()
                self.authID = response['result']
                return self.authID
 
        def host_get(self,hostName=''):
            data=json.dumps({
                    "jsonrpc": "2.0",
                    "method": "host.get",
                    "params": {
                              "output": "extend",
                              "filter":{"host":hostName}
                              },
                    "auth": self.user_login(),
                    "id": 1
                    })
            data = data.encode("utf-8")
            request = urllib.request.Request(self.url,data)
            for key in self.header:
                request.add_header(key, self.header[key])
 
            try:
                result = urllib.request.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()
                print ("主機數量: %s"%(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 Status :%s \t Available :%s"%(host['hostid'],host['name'],status[host['status']],available[host['available']]))
                        else:
                                print ("HostID : %s\t HostName : %s\t Status :%s \t Available :%s"%(host['hostid'],host['name'],status[host['status']],available[host['available']]))
                                return host['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,
                               })
            data = data.encode("utf-8")
            request = urllib.request.Request(self.url,data)
            for key in self.header:
                request.add_header(key, self.header[key])
 
            try:
                result = urllib.request.urlopen(request)
            except URLError as e:
                print ("Error as ", e)
            else:
                #print result.read()
                response = json.loads(result.read())
                result.close()
                #print response()
                for group in response['result']:
                        if  len(hostgroupName)==0:
                                print ("hostgroup:  %s \tgroupid : %s" %(group['name'],group['groupid']))
                        else:
                                print ("hostgroup:  %s\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,
                               })
 
            data = data.encode("utf-8")
            request = urllib.request.Request(self.url, data)
            for key in self.header:
                request.add_header(key, self.header[key])
 
            try:
                result = urllib.request.urlopen(request)
            except URLError as e:
                print ("Error as ", e)
            else:
                response = json.loads(result.read())
                result.close()
                #print response
                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  %s is exist !"%hostgroupName)
                sys.exit(1)
            data = json.dumps({
                              "jsonrpc": "2.0",
                              "method": "hostgroup.create",
                              "params": {
                              "name": hostgroupName
                              },
                              "auth": self.user_login(),
                              "id": 1
                              })
            data = data.encode("utf-8")
            request=urllib.request.Request(self.url,data)
 
            for key in self.header:
                request.add_header(key, self.header[key])
 
            try:
                result = urllib.request.urlopen(request)
            except URLError as e:
                print ("Error as ", e)
            else:
                response = json.loads(result.read())
                result.close()
                print ("添加主機組:%s  hostgroupID : %s"%(hostgroupName,response['result']['groupids']))
 
 
        def host_create_andy(self,hostName,visibleName, hostip, hostgroupName, templateName):
            if self.host_get(hostip):
                print ("該主機已經添加!")
                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,
                                         "name": visibleName,
                                         "interfaces": [
                                         {
                                         "type": 2,    #1:表示IP;2表示SNMP
                                         "main": 1,
                                         "useip": 1,
                                         "ip": hostip,
                                         "dns": "",
                                         "port": "161"  #IP端口10051;SNMP端口161
                                          }
                                         ],
                                       "groups": group_list,
                                       "templates": template_list,
                                         },
                               "auth": self.user_login(),
                               "id":1
            })
            data = data.encode("utf-8")
            request = urllib.request.Request(self.url, data)
            for key in self.header:
                request.add_header(key, self.header[key])
 
            try:
                result = urllib.request.urlopen(request)
            except URLError as e:
                print ("Error as ", e)
            else:
                response = json.loads(result.read())
                result.close()
            try:
                print ("添加主機 :%s \tid :%s" % (hostip, response['result']['hostids']))
            except KeyError as e:
                print ("信息 :%s \tid :%s" % (hostip, response['error']['data']))
 
        def host_create(self, hostip, hostgroupName, templateName):
            if self.host_get(hostip):
                print ("該主機已經添加!")
                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": hostip,
                                         "interfaces": [
                                         {
                                         "type": 2,
                                         "main": 1,
                                         "useip": 1,
                                         "ip": hostip,
                                         "dns": "",
                                         "port": "161"
                                          }
                                         ],
                                       "groups": group_list,
                                       "templates": template_list,
                                         },
                               "auth": self.user_login(),
                               "id":1
            })
            data = data.encode("utf-8")
            request = urllib.request.Request(self.url, data)
            for key in self.header:
                request.add_header(key, self.header[key])
 
            try:
                result = urllib.request.urlopen(request)
            except URLError as e:
                print ("Error as ", e)
            else:
                response = json.loads(result.read())
                result.close()
                print ("添加主機 : %s \tid :%s" % (hostip, response['result']['hostids']))
 
 
 
        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
                })
                data = data.encode("utf-8")
                request = urllib.request.Request(self.url,data)
                for key in self.header:
                        request.add_header(key, self.header[key])
                try:
                        result = urllib.request.urlopen(request)
                except URLError as e:
                        print ("Error as ", e)
                else:
                        response = json.loads(result.read())
                        result.close()
                        print ('----主機如今狀態------------')
                        print (self.host_get(hostip))
 
 
        def host_delete(self,hostid):
            hostid_list=[]
            #print type(hostid)
            for i in hostid.split(','):
                var = {}
                var['hostid'] = self.host_get(i)
                hostid_list.append(var)
            data=json.dumps({
                                "jsonrpc": "2.0",
                                "method": "host.delete",
                                "params": hostid_list,
                    "auth": self.user_login(),
                    "id": 1
                    })
 
            data = data.encode("utf-8")
            request = urllib.request.Request(self.url,data)
            for key in self.header:
                request.add_header(key, self.header[key])
 
            try:
                result = urllib.request.urlopen(request)
            except Exception as e:
                print  (e)
            else:
 
                result.close()
                print ("主機  %s  已經刪除 !"%hostid)
 
 
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='查詢主機')
        parser.add_argument('-G','--group',nargs='?',dest='listgroup',default='group',help='查詢主機組')
        parser.add_argument('-T','--template',nargs='?',dest='listtemp',default='template',help='查詢模板信息')
        parser.add_argument('-A','--add-group',nargs=1,dest='addgroup',help='添加主機組')
        parser.add_argument('-C','--add-host',dest='addhost',nargs=3,metavar=('192.168.2.1', 'test01,test02', 'Template01,Template02'),help='添加主機,多個主機組或模板使用分號')
        parser.add_argument('-d','--disable',dest='disablehost',nargs=1,metavar=('192.168.2.1'),help='禁用主機')
        parser.add_argument('-L','--allin',dest='allin',nargs='?',default='allin',help='從Excel批量導入主機')
        parser.add_argument('-D','--delete',dest='deletehost',nargs='+',metavar=('192.168.2.1'),help='刪除主機,多個主機之間用分號')
        parser.add_argument('-v','--version', action='version', version='%(prog)s 1.0')
        if len(sys.argv)==1:
                print (parser.print_help())
        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])
                if args.disablehost:
                        zabbix.host_disable(args.disablehost)
                if args.deletehost:
                        zabbix.host_delete(args.deletehost[0])
                if args.allin != 'allin':
                        workbook = xlrd.open_workbook('zabbix_host_add.xlsx')     #Excel名
                        for row in range(workbook.sheets()[0].nrows):
                            hostname = workbook.sheets()[0].cell(row, 0).value
                            visible = workbook.sheets()[0].cell(row, 1).value
                            hostip = workbook.sheets()[0].cell(row, 2).value
                            hostgroup = workbook.sheets()[0].cell(row, 3).value
                            hosttemp = workbook.sheets()[0].cell(row, 4).value
 
                            zabbix.host_create_andy(hostname,visible,hostip,hostgroup, hosttemp)

  

將命名爲「zabbix_host_add.xlsx」的EXCEL表,放置與腳本統一目錄下,而後執行腳本「 python 腳本.py -參數」便可。

 

轉載至:http://www.javashuo.com/article/p-atzdlznr-c.html

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息