API 操作 zabbix
- zabbix 官网API 4.0, 请选择你自己的zabbix 版本
- 通过对zabbix 服务器发送 http 请求,可以完成配置,尤其是大量和需要自动化的时候
- 创建大量主机还有一种方式就是通过xml文件,需要事先将文件导出(export),修改后将文件导入(import)
- 本文主题
通过API 为 zabbix 添加主机
,使用语言为 Python
- API 使用基础
- 获取主机信息
- 主机的基本属性
- 配置(创建)主机
- 创建主机时的常见错误
API 使用基础
- zabbix API 文档
- zabbix API 通过Restful 风格API进行http请求,完成对 application(对象) 的信息获取和修改
- zabbix 使用json 格式的文件进行传输,理论上支持多种语言进行操作,本文使用python进行操作
- API 支持四种操作
create
,get
,delete
,update
,分别对应创建,获取,删除,更改 - API 操作都需要先执行登陆操作获取token,而后携带token进行访问
- 下面是登陆获取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
- 下表为主要参数解释,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 |
获取主机信息
- 这一步主要为了创建主机时做准备,因为主机的很多配置信息在zabbix 中都是以数字代号的形式存在的
- 为了获取相对应的代号和配置名称之前的关系,需要你手动在zabbix 中配置一台主机
- 而后,获取这一台模板主机的信息,从而进行配置
- 下面是进行获取操作,主要获取配置信息是 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
- 获取的信息部分
"groups":[
{
"groupid":"12",
"name":"Templates/Applications"
}
],
"parentTemplates":[
{
"templateid":"10001",
"name":"Template OS Linux"
}
]
主机的基本属性
- 主机信息一览表
- 主机的信息有很多,主要介绍一些关键的参数
参数 | 解释 | 类型 | 备注 |
host | 主机名 | str | 唯一标识该主机的字段,不可重复 |
name | 可见主机名(visible name) | str | 在监控中显示的可见名称 |
interfaces | 接口配置项 | list(数组) | 获取远程数据的方式和具体ip,port |
groups | 主机组配置项 | list | 用来区分主机的性质 |
templates | 监控项配置(模板) | list | 模板就是多个监控项的集合 |
配置(创建)主机
- 获取到参数后,接下来就是进行创建,method 为
host.create
- 下面是具体代码
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")
- interfaces 中的 type 是接口类型
类型id | 含义 |
1 | agent 代理 |
2 | snmp |
3 | IPMI |
4 | JMX |
- 结果返回
{'jsonrpc': '2.0', 'result': {'hostids': ['10272']}, 'id': 1}
创建主机时的常见错误
No permissions to referred object or it does not exist!
- 该错误是因为对象不存在或权限限制导致
- 排查时应该先检查填写的对象是否存在,比如 groupid,填写前查看所有可用的groupid
Incorrect arguments passed to function.
- 该错误是因为参数写错了,比如useip 不要写成 userip,别问我咋知道的
No interfaces for host "My LInux s1erver
- 你忘记填写 interfaces了
Host "My LInux s1erver" cannot be without host group.
- 你忘记填写groups了
最后奉上代码 Github