批量添加主机的操作思路非常简单,首先试一下单独加一台设备,试一下没问题就写个函数,然后把设备IP等信息写道excel文件里(推荐CSV,python自带csv模块非常方便操作),然后写一个for循环,不断调用host creat函数就好了。还可以添加一些基础的判断,系统中是否已有相关的hostname或IP,hostgroup或template是否存在做一些冗错机制,再加上系统exception,完美。
第一篇的文章里简单的介绍了如何用Crul 获取token,现在可以通过python实现了,通过requests模块和Zabbix API 进行交互。为了避免多次重复操作重复获取token对Zabbix服务器增加压力,可以采用requests的模块中的session方式,保持TCP的连接,多次发送请求,通过类的方法,类实例化的时候直接初始化这个session,在每个函数里面仍使用这个session收发数据。
# -*- coding: utf-8 -*-
#__author__胡菠萝汁
import requests
import json
import csv
headers = {
'Content-Type': 'application/json'
}
class GetZabbix:
def __init__(self):
#用户信息
self.username = "zabbix_api_name"
self.password = "zabbix_api_pass"
#Zabbix API URL更换IP
self.url = "http://X.X.X.X/zabbix/api_jsonrpc.php"
#初始化session
self.s = requests.Session()
#获取token
self.token = self.getToken()
#获取token的函数
def getToken(self):
data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": self.username,
"password": self.password
},
"id": 1,
"auth": None
}
r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))
token = json.loads(r.content).get("result")
return token
一、确定添加Host所需要的信息
Zabbix API 通过host.creat来添加一个host,
必要的参数有四个:Hostname, IP, group_id, template_id,默认监控方式是agent,我们主要用SNMP监控网络设备,因此tpye:2,port:161。几个必要参数中,Hostname和IP可以直接确定,但是grogroup_idup_id和template_id需要通过group_name和template_name通过API获取。因此需要另外两个函数用来获取group_id和template_id。下面代码已经添加了相关exception,并打印了一些信息,便于排错。如果不需要可以注释掉。
def getGrouId(self,group_name):
data ={
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend",
"filter": {
"name": group_name
}
},
"auth": self.token,
"id": 1
}
try:
r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))
Group_Id = json.loads(r.content)["result"][0]["groupid"]
print(Group_Id)
print(r.content)
return Group_Id
except Exception as e:
print(e)
return False
def getTemplateId(self,Templat_Nmae):
data ={
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": "extend",
"filter": {
"host": Templat_Nmae
}
},
"auth": self.token,
"id": 1
}
try:
r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))
Template_Id = json.loads(r.content)["result"][0]["templateid"]
print(Template_Id)
print(r.content)
return Template_Id
except Exception as e:
print(e)
return False
如果需求不大,只是把host添加到单独的group,使用单独的template的化,有一个‘little trick’可以使用以下,在Zabbix里面找到对应的group或者template,点击名称,可以在URL里面看到group或者template的id,如图:
二、host.creat 函数
准备好了相关信息就可以编写host.creat函数了。
哦,忘了判断host是否存在的函数,补上。
def get_host(self,host_name):
data={
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"filter": {
"host": host_name
}
},
"auth": self.token,
"id": 1
}
try:
r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))
hostz_result = json.loads(r.content)["result"]
if hostz_result ==[]:
print("没有这个主机名,可以添加")
return True
else:
print("已有主机")
return False
# print(Group_Id)
print(r.content)
# return Group_Id
except Exception as e:
print(e)
return False
同样,也把host.creat函数加上,也添加相关exception。
def create_host_snmp(self,name,ip,groupname,templatename):
data={
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host":name,
"interfaces": [
{
"type": 2,
"main": 1,
"useip": 1,
"ip": ip,
"dns": "",
"port": "161"
}
],
"groups": [
{
"groupid": self.getGrouId(groupname)
}
],
"templates": [
{
"templateid": self.getTemplateId(templatename)
}
]
},
"auth": self.token,
"id": 1
}
try:
r = self.s.post(url=self.url, headers=headers, data=json.dumps(data))
hostcreat_result = json.loads(r.content)["result"]
print(name,"创建成功",hostcreat_result)
except Exception as e:
print(e,name,"创建失败")
三、文件读取信息,批量添加主机。
文件的信息基本就按照hostname、IP、hostgroup、template的顺序,每个host一列批量添加保存。然后写一个for循环,加上一些判断批量添加,大吉大利。
start = GetZabbix()
with open('zabbix_host_add.csv', 'r') as zabbix_host_add_file:
read_file = csv.reader(zabbix_host_add_file)
for row in read_file:
host_name=row[0]
print(start.get_host(host_name))
host_ip = row[1]
group_name=row[2]
template_name=row[3]
#判断是否可以加
if start.get_host(host_name):
if start.getGrouId_session(group_name):
if start.getTemplateId("V-Space_PDU_WITH_TEMPERATURE"):
#添加主机
start.create_host_snmp(host_name,host_ip,group_name,template_name)
else:
print(host_name, "添加失败", "template: %s不存在" % template_name)
else:
print(host_name,"添加失败","group: %s不存在"%group_name)
else:
print(host_name,"添加失败","hostname: %s已存在存在"%host_name)
在上面定义的函数中print()比较多,如果嫌乱的,把不必要的都删掉就好了。