【问题标题】:How to upload Zabbix template using API如何使用 API 上传 Zabbix 模板
【发布时间】:2023-03-26 05:14:01
【问题描述】:

有谁知道,如何使用 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 模板?

【问题讨论】:

    标签: api templates zabbix


    【解决方案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 上使用它并且不记得谁是原作者 - 如果有人发现我会在这里提到他/她以获得创建这个的功劳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多