官方文档地址:https://www.zabbix.com/documentation/3.4/zh/manual
设置前端后,你就可以使用远程HTTP请求来调用API。为此,需要向 api_jsonrpc.php
位于前端目录中的文件发送HTTP POST请求。例如,如果你的Zabbix前端安装在 http://company.com/zabbix, 那么用HTTP请求来调用 apiinfo.version
方法就如下面这样:
POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc
{"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params":{}}
请求的 Content-Type
头部必须设置为以下值之一: application/json-rpc
, application/json
或 application/jsonrequest
。
你可以使用任何HTTP客户端或JSON-RPC测试工具手动执行API请求,但对于开发应用程序,我们建议使用 社区维护的程序库。
接口请求地址:http://192.168.106.72/zabbix/api_jsonrpc.php
基于http协议向api_jsonrpc.php发送POST请求
伪装http请求的头部字段Content-Type 的值是以下三种之一:
application/json
application/jsonrequest
application/json-rpc
客户端和API之间的请求和响应使用JSON格式
json.dumps(字典)
json.loads(json数据)
用来发送HTTP请求
安装模块:
PS E:\python_venv> pip install requests
get使用演示
import requests
result = requests.get("http://www.baidu.com")
#这里接收到的是访问地址返回的http的相应数据
print(result)
#只接收纯字符的结果
print(result.text)
#只接收状态码
print (result.status_code)
post使用
这里还是以百度为例,发送用户信息(由于是访问百度,会返回错误)
import requests
userinfo = {"username":"admin","passwd":"test"}
result = requests.post(url="http://www.baidu.com", data=userinfo)
print(result)
#这里就可以用.text和.status_code方法,处理接受到的数据,返回码和字符结果
#print(result.text)
POST里可以以url指定地址,可以传递data(例子里使用data传递了一个字典),也可以是json格式的数据。还支持一个参数是headers,用来伪装http的请求头部
(官方文档案例)
在访问Zabbix中的任何数据之前,你需要登录并获取身份验证令牌。这可以使用该 user.login 方法完成。让我们假设你想要以标准Zabbix Admin用户身份登录。然后,你的JSON请求将如下所示:
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1,
"auth": null
}
让我们仔细看看请求对象。它具有以下属性:
jsonrpc
- API使用的JSON-RPC协议的版本; Zabbix API实现JSON-RPC版本2.0;method
- 调用的API方法;params
- 将被传递给API方法的参数;id
- 请求的任意标识符;auth
-用户认证令牌; 因为我们还没有一个,它的设置null。如果你正确提供了凭据,API返回的响应将包含用户身份验证令牌:
{ "jsonrpc": "2.0", "result": "0424bd59b807674191e7d77572075f33", "id": 1}
响应对象又包含以下属性:
jsonrpc
- JSON-RPC协议的版本;result
- 方法返回的数据;id
- 相应请求的标识符。获得结果如下:
{“jsonrpc”:“2.0”,“result”:[{“hostid”:“10254”,“host”:“node1.song”,“interfaces”:[{“interfaceid”:“2”,“ip”:“192.168.106.73”}]},{“hostid”:“10084”,“host”:“Zabbix server”,“interfaces”:[{“interfaceid”:“1”,“ip”:“127.0.0.1”}]}],“id”:2}
其中包含了jsonrpc的版本号,和result中是主机的信息,ID是请求的ID。
整理格式大概是这样:
一个字典里包含了三个内容,其中result里是一个列表写了主机的信息。
通过这个结构可以清楚的获取里边的hostID和接口ID:
result = requests.post(url=zabbix_url,data=json.dumps(data),headers=head)
#取hostid,先用loads将结果转成字典,get获取字典里的result键对应的值(是个列表)取下标为0的(是第一个字典),再get键为hostid的。
hostid = json.loads(result.text).get("result")[0].get("hostid")
#取接口ID,先用loads将结果转成字典,get获取字典里的result键对应的值(是个列表)取下标为0的(是第一个字典),再get键为interfaces的值(是个列表)取下标为0,再get键为interfaceid。
interface_id = json.loads(result.text).get("result")[0].get("interfaces")[0].get("interfaceid")
print(hostid,interface_id)
#两个结果输出到一个变量里是以元组格式输出,两个变量会分别接收
创建成功会返回监控项的ID
接口中key_的值是写手动创建时的监控项的键值:
#通过API添加主机监控项
import json
import requests
#定义变量
zabbix_url = "http://192.168.106.72/zabbix/api_jsonrpc.php"
zabbix_user = "Admin"
zabbix_passwd = "zabbix"
#定义函数,登录zabbix获取用户令牌token
def getUserToken():
#这里用官网提供的格式
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": zabbix_user,
"password": zabbix_passwd
},
"id": 1
#"auth": null 用不到可以去掉
}
# 定义Content-Type头部,后边引用
head = {"Content-Type":"application/json"}
result = requests.post(url=zabbix_url,data=json.dumps(data),headers=head)
#获取到令牌
#print(result.text)
#截取令牌
#print(json.loads(result.text).get("result"))
#使用return将这个值作为函数的返回值输出出来
return json.loads(result.text).get("result")
#获取被监控主机的信息
def GetHostID():
#定义一个变量,取token函数中的返回值
user_token = getUserToken()
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
#输出内容
"hostid",
"host"
],
"selectInterfaces": [
#这里输出的是主机配置里的给agent设置的接口方式对应的ID和ip
"interfaceid",
"ip"
]
},
"id": 2,
#auth中写的是token值
"auth": user_token
}
head = {"Content-Type":"application/json"}
result = requests.post(url=zabbix_url,data=json.dumps(data),headers=head)
#取hostid,先用loads将结果转成字典,get获取字典里的result键对应的值(是个列表)取下标为0的(是第一个字典),再get键为hostid的。
hostid = json.loads(result.text).get("result")[0].get("hostid")
#取接口ID,先用loads将结果转成字典,get获取字典里的result键对应的值(是个列表)取下标为0的(是第一个字典),再get键为interfaces的值(是个列表)取下标为0,再get键为interfaceid。
interface_id = json.loads(result.text).get("result")[0].get("interfaces")[0].get("interfaceid")
#print(hostid,interface_id)
#定义return返回结果,这里返回两个结果,接收的时候会把结果放在一个元组里
return hostid, interface_id
#创建新的监控项:监控/分区大小
def itemCreate():
user_token = getUserToken()
#定义两个变量别接收hostid和interfaceID
host_id, interface_id = GetHostID()
data = {
"jsonrpc": "2.0",
#这里item.create是接口指定的方法
"method": "item.create",
"params": {
"name": "Free disk space on $1",
#这里格式是vfs.fs.size是定义监控项时选择的键值[分区,free表示剩余空间]
"key_": "vfs.fs.size[/,free]",
"hostid": host_id,
"type": 0,
"value_type": 3,
"interfaceid": interface_id,
"delay": 30
},
"auth": user_token,
"id": 3
}
head = {"Content-Type":"application/json"}
result = requests.post(url=zabbix_url, data=json.dumps(data), headers=head)
print(result.text)
if __name__ == '__main__':
itemCreate()
zabbix接口更多方法参考:https://www.zabbix.com/documentation/3.4/zh/manual/api/reference
接口官方介绍:https://www.zabbix.com/documentation/3.4/zh/manual/api
目的:用户输入服务器名称、ip完成自动添加到主机并使用Linux服务的监控模板
需求:主机组指定Linux server 模板使用Template OS Linux
用到的接口:
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
#传主机名
"host": "Linux server",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
#被监控端的ip
"ip": "192.168.3.1",
"dns": "",
#agent端口
"port": "10050"
}
],
"groups": [
{
#需要添加到那个主机组。主机组ID
"groupid": "50"
}
],
"templates": [
{
#使用的模板,模板ID
"templateid": "20045"
}
],
#inventory部分给主机添加清单信息可以不用
"inventory_mode": 0,
"inventory": {
"macaddress_a": "01234",
"macaddress_b": "56768"
}
},
"auth": "038e1d7b1735c6a5436ee9eae095879e",
"id": 1
}
前边例子可以看到每个函数都要发送请求和指定头部数据,这里吧这个内容写到一个函数里
和前边例子一样,只是通过定义的函数发送请求
这里因为添加过了,所以提示失败
成功截图:
#自动添加主机,并使用Template OS Linux模板,自动添加主机组到Linux Servers
import json
import requests
import sys
#定义变量
zabbix_url = "http://192.168.106.72/zabbix/api_jsonrpc.php"
zabbix_user = "Admin"
zabbix_passwd = "zabbix"
#定义一些重复的操作的函数,并接收data变量数据
def SendPost(data):
#定义头部信息
head = {"Content-type":"application/json"}
# 判断请求发送失败,加一个try异常捕获
try:
#定义请求结果,这里用到接收进来的data内容,并把接收的字典格式转成json请求
result = requests.post(url=zabbix_url,data=json.dumps(data),headers=head)
except Exception as e:
print("———post请求失败!!!———")
#输出错误信息
print(e)
#退出程序
sys.exit()
#成功执行后,以字典形式返回访问结果
return json.loads(result.text)
#获取用户令牌
def getUserToken():
#这里用官网提供的格式
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": zabbix_user,
"password": zabbix_passwd
},
"id": 1
#"auth": null 用不到可以去掉
}
# 这里就不用在指定头部信息和request请求了,直接调用SendPost函数,并把data传过去就可以了
result = SendPost(data=data)
return result.get("result")
#也可以写成:这个get先用和return中用都可以
# result = SendPost(data=data).get("result")
# return result
#获取主机组Linux Servers的ID
def getHostGroupID():
#定义token变量
user_token = getUserToken()
data = {
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend",
"filter": {
"name": [
#主机组名,这里可以写多个,用逗号隔开
"Linux servers"
]
}
},
"auth": user_token,
"id": 1
}
result = SendPost(data=data)
return result.get("result")[0].get("groupid")
#获取模板ID
def getTemplateID():
user_token = getUserToken()
data = {
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": "extend",
"filter": {
"host": [
#模板名称,这里可以写多个,用逗号隔开
"Template OS Linux"
]
}
},
"auth": user_token,
"id": 1
}
result = SendPost(data=data).get("result")[0].get("templateid")
return result
#创建监控主机,并接收主机名和ip两个变量
def AddHost(hostname, hostip):
#设置变量
user_token = getUserToken()
host_group_id = getHostGroupID()
template_id = getTemplateID()
data = {
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": hostname,
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": hostip,
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": host_group_id
}
],
"templates": [
{
"templateid": template_id
}
]
},
"auth": user_token,
"id": 1
}
result = SendPost(data=data)
#这里可以加个判断,如果失败返回值里会有error,通过这个判断,并提示结果
if "error" not in result:
print("服务器%s监控添加成功" % hostip)
else:
print("服务器%s监控添加失败" % hostip)
if __name__ == '__main__':
hostname = input("请设置服务器名称:")
hostip = input("请输入服务器地址:")
AddHost(hostname=hostname,hostip=hostip)
zabbix接口更多方法参考:https://www.zabbix.com/documentation/3.4/zh/manual/api