API 操作 zabbix

  1. zabbix 官网API 4.0, 请选择你自己的zabbix 版本
  2. 通过对zabbix 服务器发送 http 请求,可以完成配置,尤其是大量和需要自动化的时候
  3. 创建大量主机还有一种方式就是通过xml文件,需要事先将文件导出(export),修改后将文件导入(import)
  4. 本文主题 通过API 为 zabbix 添加主机,使用语言为 Python
  • API 使用基础
  • 获取主机信息
  • 主机的基本属性
  • 配置(创建)主机
  • 创建主机时的常见错误

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
  1. 下表为主要参数解释,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
  1. 获取的信息部分
"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")
  1. 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
  1. Incorrect arguments passed to function.
  • 该错误是因为参数写错了,比如useip 不要写成 userip,别问我咋知道的
  1. No interfaces for host "My LInux s1erver
  • 你忘记填写 interfaces了
  1. Host "My LInux s1erver" cannot be without host group.
  • 你忘记填写groups了

最后奉上代码 Github