3

APIを使用してZabbixテンプレートをアップロードする方法を知っている人はいますか?

Java と Zabbix 2.0 API を使用しようとしています。私たちの目標は、さまざまなホストから Zabbix グラフ (png 画像) を取得し、それらを監視ページに表示することです。テンプレートを使用して、さまざまなホストの監視対象パラメーターをカスタマイズできるようにする必要があります。また、監視テンプレートから zabbix サーバーへのアップロードの問題に直面しています。

2 つの異なる 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 サーバー上にテンプレート エンティティを作成できますが、パラメータが表示されません。テンプレート データ自体 - これを使用してファイルをアップロードすることはできません。

これら2つの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 に答える