前言

今天写了一个zabbix api,这里整理一下,过程中自己也学习了一些东西。

需求

我们需要查一个文件内容如下:

cat /ops/flume_hosts
node1
node2

需要把这个文件里面的host添加到flume的group里面并且关联flume的template做监控,以后我们部署flume的机器只需要改这个文件,然后一执行这个命令就OK了

部署与实施

写了小一天,又把代码该删删该减减,做成了如下样子(用了一个requests模块,python版本是3.6):

#!/opt/python3/bin/python3
# -*- coding: utf-8 -*-
# Copyright (c) 2017 - hongzhi.wang 
'''
Author: hongzhi.wang
Create Date: 2017/10/16
Modify Date: 2017/10/16
'''
import json
import requests


REQUEST_URL = "https://192.168.3.3/api_jsonrpc.php"
FLUME_GROUP_ID = 322 
FLUME_TEMPLATE_ID = 108
LOGIN_INFO = {
        "user": "admin",
        "password": "admin"
    }
FLUME_HOST_FILE = "/ops/flume_hosts"


def zabbix_post(method, params, auth=None):
    res = requests.post(
        url=REQUEST_URL,
        json={
            "jsonrpc": "2.0",
            "method": method,
            "params": params,
            "id": 1,
            "auth": auth
        }
    )
    print(method, res.status_code)
    return json.loads(res.text)

with open(FLUME_HOST_FILE) as f:
    host_list = [host.strip() for host in f]

auth_key = zabbix_post(method="user.login", params=LOGIN_INFO)["result"]
try:
    host_id_dict_list = zabbix_post(
        method="host.get",
        params={
            "output": ["hostid"],
            "filter": {
                "host": host_list
            }
        },
        auth=auth_key,
    )["result"]
    host_id_list = [item.get("hostid") for item in host_id_dict_list]

    zabbix_post(
        method="hostgroup.massupdate",
        params={
            "groups": [
                {
                    "groupid": FLUME_GROUP_ID
                }
            ],
            "hosts": host_id_dict_list
        },
        auth=auth_key
    )
    zabbix_post(
        method="template.update",
        params={
            "templateid": FLUME_TEMPLATE_ID,
            "hosts": host_id_list
        },
        auth=auth_key
    )
finally:
    zabbix_post(
            method="user.logout",
            params=[],
            auth=auth_key
        )

总结

这次开始遇到的问题是登录进去,就会有authkey(用postman测试的,每个接口都测试了几次,发现半个月前的authkey还能用。。。),如果不logout的话,会存很多,仔细查了一下网上的资料,这个authkey是存在数据库的sessions表里面,程序会定期清除一年前的authkey,所以如果量不大的话可以等着自动删除,这个没有去看源码确认。