python3 调用zabbix API实现批量增加删除主机,主机各种监控项------实战
在以前的博客中谈到了利用zabbix接口来对主机进行批量的增删改查
这里在不用环境中实战遇到了不同问题,这里记录下来以便后续review
以下为实战中获取token的代码,在zabbix标准接口文档中 写道
POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
但是由于部署的方式不同 在生产环境中
http://XXX/api_jsonrpc.php 应该是这个地址(这里卡了很久 由于不是本人部署)
import requests import json def getToken(): url = 'http://XXX/api_jsonrpc.php' headers = {'Content-Type': 'application/json'} auth = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "XXXXX", ###验证 "password": "XXXXX#123" }, "id": 1, "auth": None } response = requests.post(url, data=json.dumps(auth), headers=headers) authid = json.loads(response.text)['result'] ### auth的id 也就是token print(authid) getToken()
结果如下获取到token
获取到token之后由于需要批量加聚合图形,所以我们先看下加聚合图形需要那些参数 https://www.zabbix.com/documentation/3.4/zh/manual/api/reference/screen/create
{ "jsonrpc": "2.0", "method": "screen.create", "params": { "name": "Graphs", "hsize": 3, "vsize": 2, "screenitems": [ { "resourcetype": 0, "resourceid": "612", "rowspan": 0, "colspan": 0, "x": 0, "y": 0 } ] }, "auth": "038e1d7b1735c6a5436ee9eae095879e", "id": 1 }
上图是一个典型的request,其中 jsonrpc method 数固定的
hsize:水平尺寸 可以简单的理解为 这个聚合图形最多可以有多少行
vsize:垂直尺寸 同理,这个聚合图形最多可以有多少列
resourcetye :图形的类型 0 代表graph 1 简单graph 2 文本 。。。。
resourceid :ID of the screen that the item belongs to. 也就是说需要加入的图形它的ID是多少,那么图形ID怎么获取呢? 接下来讲解
rowspan:屏幕项目将跨越的行数。
colspan:屏幕项目将跨越的列数。 意思就是图形占多少行多少列 这里 默认为0就行(1行1列) 不需要太大
x: 代表列!!!!!!!!!!!!!不是行
y: 这里的x y代表的是图形的坐标 0 0 就是第一行第一列 0 1 第一行第二列 依次类推(这里需要依靠前面设置的hsize,vsize不能超过了),测试的时候这里面体比较大,想要把多个监控放在一行:解决办法是x相同y不同
auth : 认证信息
id : 识别方法
下面是我的代码
def create_screen(): neirong = { "jsonrpc": "2.0", "method": "screen.create", "params": { "name": "Graphsall(disk,cpu,mem)", "hsize": 3, ###代表创建的时候 有多少列 "vsize": 45, ## 行 "screenitems": [ {'resourcetype': 0, 'resourceid': '42183', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 0}, {'resourcetype': 0, 'resourceid': '42189', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 0}, {'resourcetype': 0, 'resourceid': '42186', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 0}, {'resourcetype': 0, 'resourceid': '42195', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 1}, {'resourcetype': 0, 'resourceid': '42210', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 1}, {'resourcetype': 0, 'resourceid': '42198', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 1}, {'resourcetype': 0, 'resourceid': '42204', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 2}, {'resourcetype': 0, 'resourceid': '42213', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 2}, {'resourcetype': 0, 'resourceid': '42207', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 2}, {'resourcetype': 0, 'resourceid': '53703', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 3}, {'resourcetype': 0, 'resourceid': '53709', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 3}, {'resourcetype': 0, 'resourceid': '53706', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 3}, {'resourcetype': 0, 'resourceid': '53715', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 4}, {'resourcetype': 0, 'resourceid': '53739', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 4}, {'resourcetype': 0, 'resourceid': '53718', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 4}, {'resourcetype': 0, 'resourceid': '53724', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 5}, {'resourcetype': 0, 'resourceid': '53742', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 5}, {'resourcetype': 0, 'resourceid': '53727', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 5}, {'resourcetype': 0, 'resourceid': '53733', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 6}, {'resourcetype': 0, 'resourceid': '53745', 'rowspan': 1, 'colspan': 1, 'x': 1, 'y': 6}, {'resourcetype': 0, 'resourceid': '53736', 'rowspan': 1, 'colspan': 1, 'x': 2, 'y': 6}, {'resourcetype': 0, 'resourceid': '53751', 'rowspan': 1, 'colspan': 1, 'x': 0, 'y': 7}, ] }, "auth": authid, "id": 4 }
这里用的是笨办法 将所有数据想办法生成统一格式,然后批量加,其实可以潜逃变量来完成
这里面有个resourceid 获取的方法如下
def get_graid(): global graphid graphid = [] for i in hostidlist: neirong = { "jsonrpc": "2.0", "method": "graph.get", "params": { "output": "extend", "hostids": i, "sortfield": "name" }, "auth": authid, "id": 1 } response1 = requests.post(url, data=json.dumps(neirong), headers=headers) result1 = (response1.text) result2 = json.loads(result1) #print("zhujiname is %s"%i) #print("reeeeeeeeee is %s"%result2) graphid11 = [] #result2['result']代表的是一个主机的全部图形 # print(result2) for i in result2['result']: if i['name']=='CPU utilization' or i['name']=='Memory usage' or i['name']=='Disk space usage /' : graphid11.append(i['graphid']) if(len(graphid11)) == 3: ## 如果等于3 那么再次循环把这些记录下来。。 比较笨拙 需要改进 for i in result2['result']: if i['name']=='CPU utilization' or i['name']=='Memory usage' or i['name']=='Disk space usage /' : graphid.append(i['graphid']) #获取到的图形id的列表 print(graphid)
上面的程序对每个主机的图形数量进行了比较,因为我们目的是 每台主机在聚合图形中显示一行 分别是CPU utilization Memory usage Disk space usage
上图上还有个hostid变量这个变量需要gethost来获取
import requests import json url = 'http://zabbix.XXXXX.com.cn/api_jsonrpc.php' headers = {'Content-Type': 'application/json'} def getToken(): url = 'http://zabbix.pagoda.com.cn/api_jsonrpc.php' headers = {'Content-Type': 'application/json'} auth = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "XXXX", ###验证 "password": "XXX" }, "id": 1, "auth": None } response = requests.post(url, data=json.dumps(auth), headers=headers) global authid authid = json.loads(response.text)['result'] ### auth的id 也就是token def getHosts(): neirong = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host" ], "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 2, "auth": authid } response = requests.post(url, data=json.dumps(neirong), headers=headers) result1=(response.text) result2=json.loads(result1) global hostidlist hostidlist=[] for i in result2['result']: #将主机放到一个列表里面 hostidlist.append(i['hostid'])
如上图所示