3

有谁知道,如何使用 API 上传 Zabbix 模板?

我们正在尝试使用 java 和 Zabbix 2.0 API。我们的目标是获取不同主机的 Zabbix 图表(png 图片),并将它们显示在我们的监控页面上。我们需要有可能通过使用模板为不同的主机定制监控​​参数。我们遇到了一个监控模板到zabbix服务器上传的问题。

有两种不同的 API 调用:

  1. configuration.import ( https://www.zabbix.com/documentation/2.0/manual/appendix/api/configuration/import ) 使用它我们可以将我们的模板上传到 zabbix 服务器,但我们无法在 UI 上看到它或使用它以任何其他方式。Zabbix 服务器报告“true”,这意味着模板成功上传。但是我们在任何地方都找不到。

  2. template.create ( https://www.zabbix.com/documentation/2.0/manual/appendix/api/template/create ) 使用 template.create 我们可以在 zabbix 服务器上创建模板实体,但是我们看不到任何参数模板数据本身 - 我们不能使用它上传我们的文件。

有谁知道如何将这两个 API 调用紧密结合在一起,以及如何在 zabbix 服务器上配置 zabbix 模板?

4

1 回答 1

1

所以嗯..因为我一直在 TEST 到 PROD 中使用模板导出+导入脚本,反之亦然(在我以前的工作中),这是一个有助于导入任务的完整 python 脚本:

#!/usr/bin/env python3
"""
Import XML configuration files using Zabbix API:
https://www.zabbix.com/documentation/3.4/manual/api/reference/configuration/import
"""
import argparse
from urllib import request
import json
import sys
from pprint import pformat
import os
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

def zbxrequest(url, method, auth, params):

    if params is None:
        params = {}
    data = { "jsonrpc": "2.0", "id": 1, "method": method, "auth": auth, "params": params }
    # Convert to string and then to byte
    data = json.dumps(data).encode('utf-8')
    req = request.Request(args.url, headers={'Content-Type': 'application/json'}, data=data)
    resp = request.urlopen(req)
    # Get string
    resp = resp.read().decode('utf-8')
    # Convert to object
    resp = json.loads(resp, encoding='utf-8')
    return resp


try:
    # Parse command line arguments
    parser = argparse.ArgumentParser(description='Import XML configuration files using Zabbix API')
    parser.add_argument('template_file')
    parser.add_argument('-u', '--user', required=True, help='user name')
    parser.add_argument('-p', '--password', '--pass', required=True, help='password', metavar='PASSWORD')
    parser.add_argument('-s', '--url', default='http://127.0.0.1:80/api_jsonrpc.php',
                        help='Zabbix API URL, default is http://127.0.0.1:80/api_jsonrpc.php')
    args = parser.parse_args()

    # TODO: add API version check
    # r=zbxrequest(args.url, method="apiinfo.version", auth=None, params={})
    # print(r)

    # Get authentication token
    # https://www.zabbix.com/documentation/3.4/manual/api/reference/user/login
    auth_result = zbxrequest(args.url, method="user.login", auth=None,
                             params={"user": args.user, "password": args.password})

    # If authentication was not OK
    if 'result' not in auth_result:
        raise Exception('ERROR: auth failed\n' + pformat(auth_result))

    auth_token = auth_result['result']

    # Read template file content
    with open(args.template_file, 'r', encoding='utf-8') as f:
        source = f.read()

    # Set import parameters, including template file content
    params = {'format': 'xml',
              'rules': {'groups': {'createMissing': True},
                        'hosts': {'createMissing': True, 'updateExisting': True},
                        'items': {'createMissing': True, 'updateExisting': True},
                        'applications': {'createMissing': True},
                        'templates': {'createMissing': True, 'updateExisting': True},
                        'templateLinkage': {'createMissing': True},
                        'templateScreens': {'createMissing': True, 'updateExisting': True},
                        'discoveryRules': {'createMissing': True, 'updateExisting': True},
                        'triggers': {'createMissing': True, 'updateExisting': True},
                        'graphs': {'createMissing': True, 'updateExisting': True},
                        'valueMaps': {'createMissing': True},
                        'images': {'createMissing': True, 'updateExisting': True},
                        'maps': {'createMissing': True, 'updateExisting': True},
                        'screens': {'createMissing': True, 'updateExisting': True}
                        },
              'source': source
              }

    # https://www.zabbix.com/documentation/3.4/manual/api/reference/configuration/import
    import_result = zbxrequest(args.url, method="configuration.import", auth=auth_token, params=params)
    # Something like: {'id': 1, 'jsonrpc': '2.0', 'result': True}

    if 'result' in import_result and import_result['result']:
        print('SUCCESS: configuration import')
    else:
        raise Exception('ERROR: configuration import failed\n' + pformat(import_result))

    exit_code = 0

except Exception as e:

   print(str(e), file=sys.stderr)
   exit_code=1

finally:
    # Logout to prevent generation of unnecessary open sessions
    # https://www.zabbix.com/documentation/3.4/manual/api/reference/user/logout
    if 'auth_token' in vars():
        zbxrequest(args.url, method="user.logout", auth=auth_token, params={})

这就是您在 bash 中调用此类脚本的方式:

python3 ./import.py --url $URL/api_jsonrpc.php --user $USER --password $PASSWD $TEMPLATE_FILE

不用说,您需要满足 python 中的所有依赖项才能正常运行。此外,我最后一次在 zabbix 4.0 LTS 上使用它并且不记得谁是原作者 - 如果有人发现我会在这里提到他/她以获得创建这个的功劳。

于 2021-12-19T23:19:04.853 回答