溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

zabbixAPI的包裝pyzabbix

發(fā)布時(shí)間:2020-07-11 15:43:29 來(lái)源:網(wǎng)絡(luò) 閱讀:945 作者:今歌 欄目:安全技術(shù)

       pyzabbix是zabbixAPI的第三方python包裝。從網(wǎng)上莫名其妙地搞到了一份源碼,看了一下之后發(fā)現(xiàn)實(shí)現(xiàn)方法還蠻巧妙的,感覺挺好的就記下來(lái)了。那些個(gè)源碼本身其實(shí)也是一個(gè)個(gè)單獨(dú)操作的腳本,可以用命令行參數(shù)直接操作。pyzbx用了json來(lái)encode和decode請(qǐng)求數(shù)據(jù)和返回?cái)?shù)據(jù),并且用了urllib2中的一些方法來(lái)進(jìn)行通訊

  如果不是直接用它的腳本,而是自己定制相關(guān)程序的話基本上只用到ZabbixAPI這個(gè)類:

  

from pyzabbix import ZabbixAPI

zapi = ZabbixAPI("server")    #server是指zabbixweb界面的url,比如http://192.168.1.101/zabbixzapi.login("username","password")    #指的是zabbix系統(tǒng)里的用戶名和密碼,不是服務(wù)器本身的用戶名和密碼

  之后就可以用zapi這個(gè)對(duì)象來(lái)實(shí)現(xiàn)程序和zabbixAPI之間的通訊了。

  官方文檔地址:http://www.zabbix.com/documentation/2.4/manual/api

  zapi主要可以用的方法:

    zapi.host.get , zapi.host.create , zapi.hostgroup.get , zapi.host.update , ........等等??梢钥吹?,這些方法和API的分類是一致的,這是寫了這個(gè)pyzabbix模塊的人包裝得很巧妙的おかげ,用起來(lái)就方便很多了。 此外,這些方法大多都支持string/list的雙重參數(shù)格式。意思就是說(shuō),當(dāng)你想操作多次,但是又不想一條一條語(yǔ)句寫的時(shí)候,可以直接傳一個(gè)list進(jìn)去,它會(huì)自動(dòng)給你解析出來(lái)的。

  使用方法:

zapi.hostgroup.get(filter={‘groupid‘:‘xxx‘},output=[‘name‘,‘groupid‘],selectHosts=[‘name‘,‘hostid‘])

  類似這樣的語(yǔ)句。一個(gè)方法對(duì)應(yīng)了官方API說(shuō)明中的一種操作,這種對(duì)應(yīng)關(guān)系很好懂,比如hostgroup.get就是獲取主機(jī)組的信息,host.update就是更新主機(jī)的一些信息等等。至于每個(gè)方法的參數(shù),就是和這個(gè)方法對(duì)應(yīng)的那個(gè)API操作里規(guī)定的請(qǐng)求json串有關(guān)了。看幾個(gè)請(qǐng)求串和方法參數(shù)的對(duì)應(yīng)就會(huì)有感覺了= =。。字段是參數(shù)名,而字段值是參數(shù)值。

  比如詳細(xì)解釋一下上面這條語(yǔ)句,它的意思就是

    我要獲取一些主機(jī)組的信息。

    這個(gè)(些)主機(jī)組的groupid是xxx(filter的功能,如果不寫filter,系統(tǒng)就默認(rèn)把所有組的信息都返回給你了,當(dāng)然通過(guò)指定groupid過(guò)濾出來(lái)的組肯定只有一個(gè)咯,但是返回來(lái)的json串仍然是個(gè)列表的形式,即使只有一項(xiàng),這個(gè)后面還會(huì)說(shuō)到)

    我要得到的是這個(gè)(些)組的name和groupid字段(output的功能,output一定得是一個(gè)列表,可以是空,但是無(wú)論如何至少一定會(huì)返回groupid這個(gè)字段。如果寫[‘extend‘]則是把所有字段的信息都返回)

    此外我還要獲取一些這個(gè)主機(jī)組里主機(jī)的信息,那么可以用selectHosts這個(gè)參數(shù),列表中的值指定了我想知道的這些主機(jī)哪些字段的信息。

  最后返回回來(lái)的json可能是這樣的:

[
    {
        "hosts": [
            {
                "hostid": "10001", 
                "name": "主機(jī)1"
            }, 
            {
                "hostid": "10002", 
                "name": "主機(jī)2"
            }
        ], 
        "groupid": "10", 
        "name": "主機(jī)組1"
    }
]

   *不要問(wèn)為什么hosts不是寫在output里的一個(gè)參數(shù)= =。它的API就是這么設(shè)計(jì)的,即使是寫json請(qǐng)求串也是要把selectHosts和output分開兩個(gè)字段寫的。。

  このように,利用這類包裝好的方法來(lái)獲取json串,然后從json串里解析出我想要的信息就是一般的做法了。get基本上就是這樣了,其他的什么create啦,update啦,主要還是要結(jié)合官方給出的請(qǐng)求串的格式以及可用字段,然后思考一下我的參數(shù)該怎么寫,測(cè)試一下就好了??傮w來(lái)時(shí)pyzabbix并不難用,只是zabbixAPI本身有些邏輯比較異于常理,需要適應(yīng)適應(yīng)。。

 

  以下是一些我在使用過(guò)程中碰到的一些需要注意的地方:

  ●  本身參數(shù)不存在,或者參數(shù)的值不合法的情況下(比如在上面那條語(yǔ)句中加個(gè)testpara="testvalue"之類的或者把output寫成[‘name‘,‘groupid‘,‘testitem‘]),zabbixAPI不會(huì)報(bào)錯(cuò),而是默認(rèn)忽略這個(gè)參數(shù),這一點(diǎn)比較坑,需要注意的。

  ●  主機(jī)有一個(gè)屬性是status,這個(gè)屬性可以在host.update中使用來(lái)實(shí)現(xiàn)通過(guò)api enable和disable某個(gè)主機(jī)的操作。但是需要注意的是這個(gè)status的值是u‘0‘或者u‘1‘,不是int也不是str,是unicode

  ●  host.update的時(shí)候在確定要update哪臺(tái)主機(jī)的時(shí)候用的不是filter參數(shù)(事實(shí)上可能出了get方法以外,其他的用的都不是filter),而是直接有個(gè)hostid參數(shù)來(lái)指定一個(gè)hostid,從而確定一臺(tái)特定的主機(jī)。這么做的依據(jù)是因?yàn)閔ostid是主機(jī)與生俱來(lái)且唯一的,可以這么做。。

  ●host在create的時(shí)候可以加上macros參數(shù)來(lái)添加宏。比如macros=[{‘macro‘:‘{$INSTANCE}‘,‘value‘:‘frankid‘},{‘macro‘:‘{$ACCOUNT}‘,‘value‘:‘test_account‘}]

  ●未完待續(xù)。。。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI