zabbix 添加主机 API
其他
2019-04-04 15:03:51
阅读次数: 0
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",
"visiblename": "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
-
Host "My LInux s1erver" cannot be without host group.
最后奉上代码 Github
转载自blog.csdn.net/weixin_42290927/article/details/88292931