zabbix api二次开发

zabbix api

zabbix api 是zabbix基于php开发的一套API,可以利用API实现一些批量、自动化的动作。

为何使用API?

当然你如果数据库很熟、业务逻辑很熟悉,也可以直接读写数据库,例如直接删除监控项, 但麻烦的是你需要自己写业务逻辑,删除监控项的同时还得删掉对应的触发器等这些。

官方的API设计的时候就已经考虑了这些,所以我们尽量还是调用官方的,会多一重逻辑判断 保证安全和逻辑完整。

API入门

其实zabbix的资料还是官网是最全的,看了好多文档,还是官方的感觉最靠谱: getting_started

权限

为啥要说这个权限呢,如果看了上面的文档就会发现,登录验证是使用平时登录的账号、 密码是无法登录的,会报”No API access”:

in Zabbix 1.8, users that are not in “API access” group do not have an access to Zabbix API by default. In order to use API with the given user, you need to set “API access” to “Enabled” for the user group of that user or place that user into a predefined “API access” group.

这是因为默认是没有开启API的访问权限的, 所以使用API的第一步我还是建议准备好权限。解决方法也很简单,将对应的用户加入 API组即可。

验证

zabbix API是必须要权限验证的,所以使用API的前提是你必须登录,参考官方的例子:

{
   "jsonrpc": "2.0",
   "method": "user.login",
   "params": {
      "user": "Admin",
      "password": "zabbix"
   },
   "id": 1
}

其实这里我们就很明白了,api这玩意没啥神秘的,就是按照官网的规范写json串,post 到服务器就可以了。

至于post的方法可以是curl也可以使用php、python等脚本语法弄过去,随你便了。

不过到这里你应该也可以发现其实官方提供的api其实也挺糙的。。。

为何要二次开发?

半天了终于到我要写的主题了,不过说api二次开发确实有点标题党的嫌疑,因为 说到底我也这是针对官方的api进行了一些二次封装,目前还没有针对涉及到自己 去做底层的逻辑。

那为啥要自己进行”开发”呢?

  • 官方提供的API太糙了,例如我想批量删除某批主机的某个监控项,利用1.8的API 就不好直接去做。而且对业务部门,总不能说你先看看zabbix官方,然后安装 1验证,2拼凑json串,3提交的方式去做吧;

  • 自行定制一些更高层次的API,直接给用户提供删除某个监控项等功能,省去 验证呀,拼json串等操作;

  • 权限控制,这个意思说的是默认的情况下API访问权限不应该对所有人开放,但 某些情况下还必须提供给业务部门,那只能我们在API中控制了,可以在我们的API 中进行权限校验、根据权限只提供某些API功能等;

python版的雏形

下面的代码是看了一个网友的文章模仿写的,基本就是抄了人家整个结构:

python调用zabbix的api接口添加主机、查询组、主机、模板

#!/usr/bin/env python
#coding=utf-8
import json
import urllib2

class zabbix_tools:
        def __init__(self):
                self.url="http://1x5.1x2.5x.x3/zabbix/api_jsonrpc.php"
                self.header={"Content-Type": "application/json"}
                self.authID=self.user_login()

        def user_login(self):
                data = json.dumps(
                {
                    "jsonrpc": "2.0",
                    "method": "user.login",
                    "params": {
                        "user": "huangsicong",
                        "password": "password"
                        },
                    "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 "Auth Failed, Please Check Your Name And Password:",e.code
                else:
                                       response = json.loads(result.read())
                    authID = response['result']
                    result.close()
                    return authID

        def get_data(self,data,hostip=""):

                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
                    return 0
                else:
                    response = json.loads(result.read())
                    result.close()
                    return response


        def delete_items(self,itemids):

                data = json.dumps(
                {
                        "jsonrpc":"2.0",
                        "method":"item.delete",
                        "params": itemids,
                        "auth":self.authID,
                        "id":2
                })

                res = self.get_data(data)
                return res

        def get_hostids(self,ip):

                data = json.dumps(
                {
                        "jsonrpc":"2.0",
                        "method":"host.get",
                        "params":{
                                "output":"extend",
                                "filter":{
                                    "host": ip
                                }
                            },
                        "auth":self.authID,
                        "id":2
                })
                res = self.get_data(data)['result']
                hostids = []
                for i in range(len(res)):
                        hostids.append(res[i]['hostid'])
                return  hostids

        def get_itemids(self,key,ip):

                hostids = self.get_hostids(ip)
                data = json.dumps(
                {
                        "jsonrpc":"2.0",
                        "method":"item.get",
                        "params":{
                                "output":"shorten",
                                "search": {"key_": key},
                                "hostids": hostids,
                                "limit": 10
                        },
                        "auth": self.authID,
                        "id":2
                })
                
                itemids = []
                res = self.get_data(data)['result']
                for i in range(len(res)):
                        itemids.append(res[i]['itemid'])
                return  itemids

def main():
        test = zabbix_tools()
        test.user_login()
        itemids = test.get_itemids("vfs.fs.size[/letv,pused]",["1.1x0.91.1x2","10.1x0.1x0.31","1x2.72.5x.x1",])
        #print itemids
        print test.delete_items(itemids)

if __name__ =="__main__":
        main()
                                                                              

很简单,到处都是封装json,然后post到服务器上去。

我主要是封装了官方的两个API去返回主机的hostid和itemid,然后执行对应的操作。

总结

* API很简单,但如果自己二次开发改过zabbix的验证的话,那估计会麻烦点,我们这边
就是结合了cas系统去做了验证,所以这部分直接调用官方的API去登录的时候,是会失败的。。。

* 尽可能提供高层次的API封装,去掉json封装等这些繁琐的操作;

目前只是一个雏形,我后续会逐步更新、完善。

2 Responses to “zabbix api二次开发”

  1. […] python版本的可以参考下 思聪大神的博客 http://www.furion.info/640.html […]

  2. […] python版本的可以参考下 思聪大神的博客 http://www.furion.info/640.html […]

Leave a Reply

Your email address will not be published. Required fields are marked *


To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax