API 操作 zabbix
-
zabbix 官网API 4.0
, 请选择你自己的zabbix 版本 - 通过对zabbix 服务器发送 http 请求,可以完成配置,尤其是大量和需要自动化的时候
- 创建大量主机还有一种方式就是通过xml文件,需要事先将文件导出(export),修改后将文件导入(import)
-
本文主题
通过API 为 zabbix 添加主机
,使用语言为 Python
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
版权声明:本文为weixin_42290927原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。