zabbix 添加主机 API

  • Post author:
  • Post category:其他




API 操作 zabbix


  1. zabbix 官网API 4.0

    , 请选择你自己的zabbix 版本
  2. 通过对zabbix 服务器发送 http 请求,可以完成配置,尤其是大量和需要自动化的时候
  3. 创建大量主机还有一种方式就是通过xml文件,需要事先将文件导出(export),修改后将文件导入(import)
  4. 本文主题

    通过API 为 zabbix 添加主机

    ,使用语言为 Python




API 使用基础


  1. zabbix API 文档
  2. zabbix API 通过Restful 风格API进行http请求,完成对 application(对象) 的信息获取和修改
  3. zabbix 使用json 格式的文件进行传输,理论上支持多种语言进行操作,本文使用

    python

    进行操作
  4. API 支持四种操作

    create

    ,

    get

    ,

    delete

    ,

    update

    ,分别对应创建,获取,删除,更改
  5. API 操作都需要先执行登陆操作获取token,而后携带token进行访问
  6. 下面是登陆获取token 的操作

    def login_zabbix():
        '''
            retrieve the token, Authentication
        :return:
        '''
        login_data = {
                "jsonrpc":"2.0",
                "method":"user.login",
                "id":1,
                "auth":None,
                "params":{
                    "user": "Admin",
                    "password": "zabbix"
                }
        }
    
        resp_login = requests.post(url=URL, json=login_data)
        auth = resp_login.json().get("result")
        return auth
    
  7. 下表为主要参数解释,url 通常为

    http://ip/zabbix/api_jsonrpc.php

    , 填写自己的ip地址,端口为 80,默认不填写
参数 解释 类型 备注
jsonrpc api的版本 string 为2.0
method 操作方法 string 查看相应文档
id 默认为 1 int 官网上说是标识符,填 1 就行了
auth 登陆的token str 执行登陆操作可不填写
params 参数项 dict




获取主机信息

  1. 这一步主要为了创建主机时做准备,因为主机的很多配置信息在zabbix 中都是以数字代号的形式存在的
  2. 为了获取相对应的代号和配置名称之前的关系,需要你手动在zabbix 中配置一台主机
  3. 而后,获取这一台模板主机的信息,从而进行配置
  4. 下面是进行获取操作,主要获取配置信息是 template 和 group

    def get_hosts():
        """
            获取配置信息
        :return:
        """
        data = {"jsonrpc":"2.0",
                "method":"host.get",
                "id":1,"auth":None,
                "params":{
                    "selectGroups": ["groupid", "name"],
                    "selectParentTemplates": ["templateid","name"],
                }
        }
        auth = login_zabbix()
        data.update({"auth": auth})
        resp = requests.post(url=URL, json=data)
        # 美化打印
        print(json.dumps(resp.json().get("result"), indent=4, separators=(",", ":")))
        result = resp.json().get("result")
        return result
    
  5. 获取的信息部分

      "groups":[
          {
               "groupid":"12",
               "name":"Templates/Applications"
           }
       ],
       "parentTemplates":[
           {
               "templateid":"10001",
               "name":"Template OS Linux"
           }
       ]
    




主机的基本属性


  1. 主机信息一览表
  2. 主机的信息有很多,主要介绍一些关键的参数
参数 解释 类型 备注
host 主机名 str 唯一标识该主机的字段,不可重复
name 可见主机名(visible name) str 在监控中显示的可见名称
interfaces 接口配置项 list(数组) 获取远程数据的方式和具体ip,port
groups 主机组配置项 list 用来区分主机的性质
templates 监控项配置(模板) list 模板就是多个监控项的集合




配置(创建)主机

  1. 获取到参数后,接下来就是进行创建,method 为

    host.create
  2. 下面是具体代码

    def create_hosts():
        data = {
              "method": "host.create",
              "params": {
                "host": "My LInux servers",
                "name": "192.168.8.1_linux",
                "interfaces": [
                  {
                    "type": 1,
                    "main": 1,
                    "useip": 1,
                    "ip": "192.168.8.1",
                    "dns": "",
                    "port": "10051"
                  }
                ],
                "groups": [
                  {
                    "groupid": "11"
                  }
                ],
                "templates": [
                  {
                    "templateid": "10001"
                  }
                ],
              },
              "id": 1,
              "auth": "199d2e96ccc8bc7a0d5c8d6065e1a91f",
              "jsonrpc": "2.0"
            }
        auth = login_zabbix()
        data.update({"auth": auth})
        resp = requests.post(url=URL, json=data)
        print(resp.json())
        return resp.json().get("result")
    
  3. interfaces 中的 type 是接口类型
类型id 含义
1 agent 代理
2 snmp
3 IPMI
4 JMX
  1. 结果返回

    	{'jsonrpc': '2.0', 'result': {'hostids': ['10272']}, 'id': 1}
    




创建主机时的常见错误


  1. No permissions to referred object or it does not exist!

    • 该错误是因为对象不存在或权限限制导致
    • 排查时应该先检查填写的对象是否存在,比如 groupid,填写前查看所有可用的groupid

  2. Incorrect arguments passed to function.

    • 该错误是因为参数写错了,比如useip 不要写成 userip,别问我咋知道的

  3. No interfaces for host "My LInux s1erver

    • 你忘记填写 interfaces了

  4. Host "My LInux s1erver" cannot be without host group.

    • 你忘记填写groups了

最后奉上代码

Github



版权声明:本文为weixin_42290927原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。