利用zabbix的API功能能夠方便地經過其餘程序調用zabbix,從而實現靈活的擴展Zabbix方式。
php
1、zabbixAPI簡介
前端
Zabbix的API具備重要的功能,爲第三方調用zabbix、批量操做提供可編程接口,從而輕鬆地用於本身的業務系統,將zabbix監控系統與運維繫統相集成。zabbix API是基於前端HTTP協議實現的,也就是能夠經過HTTP請求實現的API,數據傳輸採用JSON RPC協議。java
JSON-RPC是基於JSON的跨語言遠程調用協議,比XML-RPC、Webservice等基於文本的協議傳輸數據量要小;相比Hessian、java-RPC等二進制協議更便於調試、實現、擴展、是很是優秀的一種遠程調用協議。目前主流語言都已有JSON-RPC的實現框架,java語言中較好的JSON-RPC實現框架有jsonrpc4j、Jproxy、JSON-RPC,其中jsonrpc4j既能夠獨立使用,又能夠與Spring無縫結合,比較適合用於基於Spring的項目開發python
2、zabbix API的簡單使用
mysql
zabbix api相關:官方文檔:https://www.zabbix.com/documentation/2.4/manual/api/ git
一、使用user.login方法 params後面的用戶名和密碼是zabbix的web界面登陸名和密碼!!! #curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"user.login","params":{"user":"admin","password":"密碼xxx"},"auth": null,"id":0}' http://10.0.18.12/zabbix/api_jsonrpc.php HTTP/1.1 200 OK Date: Mon, 24 Oct 2016 10:33:34 GMT Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.3.3 Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Methods: POST Access-Control-Max-Age: 1000 Content-Length: 68 Connection: close Content-Type: application/json {"jsonrpc":"2.0","result":"a21db81b19908971f9a8518b5092b414","id":0} 執行OK: 到zabbix庫中查看session mysql> select * from zabbix.sessions; +----------------------------------+--------+------------+--------+ | sessionid | userid | lastaccess | status | +----------------------------------+--------+------------+--------+ | 0123b9ec3295562c23a13bc87e8f8b28 | 1 | 1457432079 | 0 | | 0b13dce7637ea03667b2cae9199db559 | 2 | 1477302663 | 0 | | 0e2ef1a01dca95bc23171d314d82f1c8 | 1 | 1469440342 | 0 | | 1a6439ab2bcdd6e6a4dd549e02a09173 | 1 | 1473418801 | 0 | | 294643838565c4b2c57902c06f0e6e12 | 2 | 1477302700 | 0 | | 4062d9f3a89a14f734ea73299130a19f | 1 | 1465352471 | 0 | | 5d14d651069a95c30f313753dfdcd541 | 1 | 1477304346 | 0 | | 5f2cbe9a9c406f1053ffe8fd7c98e376 | 1 | 1477302828 | 1 | | 750f97a0b59b00f8ea1a2af05e52c7c8 | 1 | 1464612638 | 0 | | 910945f4f8ba5b27489c963e73619039 | 1 | 1477363990 | 0 | | 925832711e34d009245232da998d9382 | 1 | 1453813826 | 0 | | 986a8661ecab7676fd8716da60c1f9f0 | 1 | 1477375294 | 0 | | a1d15429a29ae56e8a347647ba600d51 | 1 | 1453814055 | 0 | | a21db81b19908971f9a8518b5092b414 | 1 | 1477305214 | 0 | ##能夠看到了 | a43e362ed8268af31d8b15c8d3234acb | 1 | 1476275454 | 0 | | b29b878a0868f344896b78f5cf843a5c | 2 | 1477302723 | 0 | | b55a3b569c95b9158ec5bf67b8c4870f | 1 | 1476434671 | 0 | | c4703a34d0afe9130cbb921995ad4f7e | 1 | 1473669065 | 0 | | db2111abc2e6d96f6baaaa5089a538c1 | 1 | 1453962136 | 0 | +----------------------------------+--------+------------+--------+ 19 rows in set (0.00 sec) 二、使用host.get方法 這裏host留空,表示查看全部的 #curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"host.get","params":{"output":"hostid","selectGroups":"extend","filter":{"host":""}},"auth":"a21db81b19908971f9a8518b5092b414","id":1}' http://10.0.18.12/zabbix/api_jsonrpc.php HTTP/1.1 200 OK Date: Tue, 25 Oct 2016 06:49:20 GMT Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.3.3 Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Methods: POST Access-Control-Max-Age: 1000 Connection: close Transfer-Encoding: chunked Content-Type: application/json {"jsonrpc":"2.0","result":[{"hostid":"10084","groups":[{"groupid":"4","name":"Zabbix servers","internal":"0","flags":"0"}]},{"hostid":"10105","groups":[{"groupid":"2","name":"Linux servers","internal":"0","flags":"0"}]},{"hostid":"10106","groups": ………………………… 太多了 ………………………… 查看Linux servers組,以下: #curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"host.get","params":{"output":"extend","filter":{"host":"Linux servers"}},"auth":"a21db81b19908971f9a8518b5092b414","id":1}' http://10.0.18.12/zabbix/api_jsonrpc.php HTTP/1.1 200 OK Date: Tue, 25 Oct 2016 06:27:19 GMT Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.3.3 Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Methods: POST Access-Control-Max-Age: 1000 Content-Length: 36 Connection: close Content-Type: application/json {"jsonrpc":"2.0","result":[],"id":1}
三、查看zabbix監控的hosts,這裏有一個腳本github
#cat zabbixgethost.py #!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" #10.0.18.12是我本身的zabbix serverip zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" #web界面進入zabbix的用戶名 zabbix_pass = "xxxx" #web界面進入zabbix的密碼 auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json json_data={ "method":"host.get", "params":{ "output": "extend", } } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print response #顯示主機的個數 print "Number Of Hosts: ", len(response['result']) 執行: #python zabbixgethost.py {u'jsonrpc': u'2.0', u'result': [{u'available': u'1', u'maintenance_type': u'0', u'ipmi_errors_from': u'0', u'ipmi_username': u'', u'snmp_disable_until': u'0', u'ipmi_authtype': u'-1', u'ipmi_disable_until': …………………… 省略 '10267', u'name': u'datainsight_backstage1', u'jmx_errors_from': u'0', u'jmx_disable_until': u'0', u'flags': u'0', u'error': u'', u'maintenance_from': u'0', u'errors_from': u'0'}], u'id': 1} Number Of Hosts: 160 一共有160臺主機!
四、使用api批量添加新主機web
腳本以下:sql
#cat zabbixhostcreate.py #!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" zabbix_pass = "xxxx" auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json json_data={ "method": "host.create", "params": { "host": "", #新主機hostname,這裏留空爲了批量添加 "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": "", #新主機ip地址,這裏留空爲了批量添加 "dns": "", "port": "10050" #zabbix client 端口 } ], "groups": [ { "groupid": "2" #組id } ], "templates": [ { "templateid": "10001" #模板id } ], "inventory": { "macaddress_a": "", "macaddress_b": "" } } } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) print json_data #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) with open("serverlist.txt") as f: #這裏是一個從serverlist獲取新hosts的hostname和ip的方法 data=f.readlines() f.close() for line in data: host,ip=line.split() json_data['params']['host']=host json_data['params']['interfaces'][0]['ip']=ip print json_data #到這裏結束 if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print response #顯示主機的個數 print "Number Of Hosts: ", len(response['result']) 開始批量添加 #cat serverlist.txt #將須要加入監控的新主機按照以下格式寫入serverlist文件中 point_soa1 10.1.12.177 point_soa2 10.1.12.178 執行: #python zabbixhostcreate.py {'jsonrpc': '2.0', 'params': {'templates': [{'templateid': '10001'}], 'host': '', 'interfaces': [{'ip': '', 'useip': 1, 'dns': '', 'main': 1, 'type': 1, 'port': '10050'}], 'groups': [{'groupid': '2'}], 'inventory': {'macaddress_b': '', 'macaddress_a': ''}}, 'method': 'host.create', 'auth': u'550390eace5ebcd60168d791c38b4f0d', 'id': 1} {'jsonrpc': '2.0', 'params': {'templates': [{'templateid': '10001'}], 'host': 'point_soa1', 'interfaces': [{'ip': '10.1.12.177', 'useip': 1, 'dns': '', 'main': 1, 'type': 1, 'port': '10050'}], 'groups': [{'groupid': '2'}], 'inventory': {'macaddress_b': '', 'macaddress_a': ''}}, 'method': 'host.create', 'auth': u'550390eace5ebcd60168d791c38b4f0d', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'hostids': [u'10289']}, u'id': 1} Number Of Hosts: 1 {'jsonrpc': '2.0', 'params': {'templates': [{'templateid': '10001'}], 'host': 'point_soa2', 'interfaces': [{'ip': '10.1.12.178', 'useip': 1, 'dns': '', 'main': 1, 'type': 1, 'port': '10050'}], 'groups': [{'groupid': '2'}], 'inventory': {'macaddress_b': '', 'macaddress_a': ''}}, 'method': 'host.create', 'auth': u'550390eace5ebcd60168d791c38b4f0d', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'hostids': [u'10290']}, u'id': 1} Number Of Hosts: 1 能夠看到一共添加了2臺host!到zabbix的web界面查看,是添加成功的!
可是以上的批量添加的腳本只能實現添加一個模板,即Template OS Linux (id爲10001)這個基本模板,若是想添加2個後者多個模板,須要使用下面這個改動過的腳本,以下:數據庫
#cat zabbixhostcreate2.py #!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" zabbix_pass = "xxxx" auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json template_list=["10001","10107"] #定義list,寫入模板id json_data={ "method": "host.create", "params": { "host": "", "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": "", "dns": "", "port": "10050" } ], "groups": [ { "groupid": "2" } ], "templates": template_list, #由以前的改成了list格式 "inventory": { "macaddress_a": "", "macaddress_b": "" } } } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) print json_data #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) with open("serverlist.txt") as f: data=f.readlines() f.close() for line in data: host,ip=line.split() json_data['params']['host']=host json_data['params']['interfaces'][0]['ip']=ip print json_data if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print response #顯示主機的個數 print "Number Of Hosts: ", len(response['result']) 執行腳本以下: #cat serverlist.txt cmk_bs1 10.1.12.210 cmk_bs2 10.1.12.211 cmk_soa2 10.1.12.209 開始執行: #python zabbixhostcreate2.py {'jsonrpc': '2.0', 'params': {'templates': [{'templateid': '10001'}], 'host': '', 'interfaces': [{'ip': '', 'useip': 1, 'dns': '', 'main': 1, 'type': 1, 'port': '10050'}], 'groups': [{'groupid': '2'}], 'inventory': {'macaddress_b': '', 'macaddress_a': ''}}, 'method': 'host.create', 'auth': u'550390eace5ebcd60168d791c38b4f0d', 'id': 1} {'jsonrpc': '2.0', 'params': {'templates': ['10001', '10107'], 'host': 'cmk_bs1', 'interfaces': [{'ip': '10.1.12.210', 'useip': 1, 'dns': '', 'main': 1, 'type': 1, 'port': '10050'}], 'groups': [{'groupid': '2'}], 'inventory': {'macaddress_b': '', 'macaddress_a': ''}}, 'method': 'host.create', 'auth': u'60341ac795bc16de28993f0ce5ad7ee6', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'hostids': [u'10286']}, u'id': 1} Number Of Hosts: 1 {'jsonrpc': '2.0', 'params': {'templates': ['10001', '10107'], 'host': 'cmk_bs2', 'interfaces': [{'ip': '10.1.12.211', 'useip': 1, 'dns': '', 'main': 1, 'type': 1, 'port': '10050'}], 'groups': [{'groupid': '2'}], 'inventory': {'macaddress_b': '', 'macaddress_a': ''}}, 'method': 'host.create', 'auth': u'60341ac795bc16de28993f0ce5ad7ee6', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'hostids': [u'10287']}, u'id': 1} Number Of Hosts: 1 {'jsonrpc': '2.0', 'params': {'templates': ['10001', '10107'], 'host': 'cmk_soa2', 'interfaces': [{'ip': '10.1.12.209', 'useip': 1, 'dns': '', 'main': 1, 'type': 1, 'port': '10050'}], 'groups': [{'groupid': '2'}], 'inventory': {'macaddress_b': '', 'macaddress_a': ''}}, 'method': 'host.create', 'auth': u'60341ac795bc16de28993f0ce5ad7ee6', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'hostids': [u'10288']}, u'id': 1} Number Of Hosts: 1 添加了3臺主機,而且爲每臺主機添加了2個模板!
五、批量刪除host
腳本以下:
#cat zabbixhostdelete.py #!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" zabbix_pass = "xxxx" auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json json_data={ "method":"host.delete", "params":[''] #留空是爲了批量刪除 } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) with open("deletelist.txt") as f: #刪除列表從deletelist中獲取 data=f.readlines() f.close() for line in data: id=line.split() json_data['params']=id print json_data #到此結束 if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print response #顯示主機的個數 print "Number Of Hosts: ", len(response['result']) 批量刪除: mysql> select hostid,host from hosts where host='point_soa1'; +--------+------------+ | hostid | host | +--------+------------+ | 10292 | point_soa1 | +--------+------------+ 1 row in set (0.00 sec) mysql> select hostid,host from hosts where host='point_soa2'; +--------+------------+ | hostid | host | +--------+------------+ | 10290 | point_soa2 | +--------+------------+ 1 row in set (0.00 sec) 將查到的hostid寫入到deletelist.txt中,以下: #cat deletelist.txt 10290 10292 執行腳本 #python zabbixhostdelete.py {'jsonrpc': '2.0', 'params': ['10290'], 'method': 'host.delete', 'auth': u'f844af3cbbd2546410ab8ae8c441cfe1', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'hostids': [u'10290']}, u'id': 1} Number Of Hosts: 1 {'jsonrpc': '2.0', 'params': ['10292'], 'method': 'host.delete', 'auth': u'f844af3cbbd2546410ab8ae8c441cfe1', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'hostids': [u'10292']}, u'id': 1} Number Of Hosts: 1 刪除2個host!到zabbix的web界面查看,是刪除成功的!
也能夠改爲以下:
#!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" zabbix_pass = "xxxx" auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json json_data={ "method":"host.delete", "params":[] #改爲這樣 } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) with open("deletelist.txt") as f: #改爲這樣 data=f.readlines() f.close() for line in data: json_data['params'].append(line) print json_data #結束 if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print response #顯示主機的個數 print "Number Of Hosts: ", len(response['result'])
3、zabbix API 建立維護模式
在某些時候,監控的主機進行代碼迭代,重啓端口,就會常常報警,這個時候報警就成了負擔,若是一次作不少臺server的升級,一直髮郵件很煩人,因此不必再發郵件了,若是將這些主機自動進入維護模式,那就不用收到那麼多報警郵件了。
一、以組爲單位進入維護模式
簡單來講就是假若有10臺server須要發佈升級代碼,這10臺server屬於一個組server1,那麼就能夠將server1組添加到維護狀態,就不會收到報警郵件了,腳本代碼以下:
#cat zabbixaddmaintenance.py #!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" zabbix_pass = "xxxx" auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json json_data={ "method": "maintenance.create", #調用的方法 "params": { "name": "test maintenance", #自定義維護模式的名稱 "active_since": 1477584000, #維護開始時間 "active_till": 1509120000, #維護結束時間 "groupids": ["13"], #維護的server1的組id "timeperiods": [ { "timeperiod_type": 2, #type類型,2是Daily,3是Weekly "every": 1, #一天一次 "dayofweek": 64, "start_time": 32400 , #維護開始的時間,這裏是9h,換算成秒 "period": 75600 #維護時長,這裏21個小時,換算成秒 } ], } } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) print json_data #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print response #顯示主機的個數 print "The Number Of Maintenance: ", len(response['result']) 生成時間的命令: 假如維護時間是從2016-10-28 00:00 - 2017-10-28 00:00 轉換成zabbix時間以下: #timer1=`date -d "2016-10-28 00:00" +%s` #echo $timer1 1477584000 #timer2=`date -d "2017-10-28 00:00" +%s` #echo $timer2 1509120000 執行腳本 #python zabbixaddmaintenance.py {'jsonrpc': '2.0', 'params': {'timeperiods': [{'timeperiod_type': 2, 'dayofweek': 64, 'start_time': 32400, 'every': 1, 'period': 75600}], 'active_since': 1477584000, 'active_till': 1509120000, 'name': 'test maintenance', 'groupids': ['13']}, 'method': 'maintenance.create', 'auth': u'02dd31060aa2bae5dc90dae489a7a887', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'maintenanceids': [u'8']}, u'id': 1} The Number Of Maintenance: 1 能夠看到建立OK! PS:查看組id,是在zabbix庫中的groups表,以下: mysql>select * from groups;
到web界面查看:http://10.0.18.12/zabbix
進入查看:
點擊「Periods」:
能夠看到維護的時間!
點擊「Hosts & Groups」:
而後將point_soa組中的2臺server:point_soa1和point_soa2的zabbix agentd停掉,查看狀態是處於unreachable的維護狀態,可是沒有發送報警郵件!
二、將多個組添加進入維護模式
在某些環境,有時候發佈代碼升級的server分屬不一樣的組,好比分屬point_soa和agent_soa,若是想將這兩個組都加入到維護模式,上面的腳本,就須要修改,而且執行2次,這個效率較低,將上面的腳本稍微修改了一下,而後能夠同時將2個組加入到維護模式,腳本以下:
#cat zabbixaddmaintenance.py #!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" zabbix_pass = "xxxx" auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json json_data={ "method": "maintenance.create", "params": { "name": "test maintenance", "active_since": 1477584000, "active_till": 1509120000, "groupids": [], ##是一個列表,內容從txt文件中獲取 "timeperiods": [ { "timeperiod_type": 2, "every": 1, "dayofweek": 64, "start_time": 32400 , "period": 75600 } ], } } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) print json_data #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) with open("addmainten.txt") as f: #添加的代碼,開始 data=f.readlines() f.close() for line in data: json_data['params']['groupids'].append(line.strip("\n")) #處理換行符,否則會報錯。 print json_data ##結束 if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print response #顯示主機的個數 print "The Number Of Maintenance: ", len(response['result']) 先到zabbix數據庫查看組id: mysql> select * from groups where name like '%soa'; +---------+-----------+----------+-------+ | groupid | name | internal | flags | +---------+-----------+----------+-------+ | 13 | point_soa | 0 | 0 | | 14 | agent_soa | 0 | 0 | +---------+-----------+----------+-------+ 2 rows in set (0.00 sec) 將須要加入維護模式的組,添加到addmainten.txt中,以下: #cat addmainten.txt 13 14 執行腳本 #python zabbixaddmaintenance.py {'jsonrpc': '2.0', 'params': {'timeperiods': [{'timeperiod_type': 2, 'dayofweek': 64, 'start_time': 32400, 'every': 1, 'period': 75600}], 'active_since': 1477584000, 'active_till': 1509120000, 'name': 'test maintenance', 'groupids': []}, 'method': 'maintenance.create', 'auth': u'4677074d13da0baf955f78ea2c2e2164', 'id': 1} {'jsonrpc': '2.0', 'params': {'timeperiods': [{'timeperiod_type': 2, 'dayofweek': 64, 'start_time': 32400, 'every': 1, 'period': 75600}], 'active_since': 1477584000, 'active_till': 1509120000, 'name': 'test maintenance', 'groupids': ['13', '14']}, 'method': 'maintenance.create', 'auth': u'4677074d13da0baf955f78ea2c2e2164', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'maintenanceids': [u'19']}, u'id': 1} The Number Of Maintenance: 1 能夠看到添加成功了,而後到web界面查看,以下:
能夠看到agent_soa和point_soa兩個組添加到維護模式了!將其中的幾臺服務器的agent客戶端停掉,會報警,可是不會觸發郵件。以下:
三、刪除維護模式
zabbix的維護模式是在特定時間有效,當再也不須要維護的時候,就須要刪除維護模式,以避免真的出現問題的時候,沒法及時發送報警,進而影響業務!如下腳本,能夠實現刪除建立的維護模式:
先在zabbix數據庫查看已經建立的維護模式id: mysql> select * from maintenances; +---------------+------------------+------------------+-------------+--------------+-------------+ | maintenanceid | name | maintenance_type | description | active_since | active_till | +---------------+------------------+------------------+-------------+--------------+-------------+ | 19 | test maintenance | 0 | | 1477584000 | 1509120000 | | 20 | update | 0 | | 1477929600 | 1509552000 | +---------------+------------------+------------------+-------------+--------------+-------------+ 2 rows in set (0.00 sec) 能夠看到有2個維護狀態。 將在數據庫查到的id加入文本文件中,實現批量刪除 #cat deletemain.txt 19 20 查看腳本: #cat deletemaintenance.py #!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" zabbix_pass = "xxxx" auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json json_data={ "method": "maintenance.delete", "params": [], #定義一個列表 } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) print json_data #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) with open("deletemain.txt") as f: #將須要刪除的維護id放在deletemain.txt中 data=f.readlines() f.close() for line in data: #循環獲取id json_data['params'].append(line.strip("\n")) #去除換行符這個特殊符號 print json_data if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print response #顯示主機的個數 print "Delete Number Of Maintenance: ", len(response['result']) #python deletemaintenance.py {'jsonrpc': '2.0', 'params': [], 'method': 'maintenance.delete', 'auth': u'ea11a835164c73a8da6673ef4522c3cb', 'id': 1} {'jsonrpc': '2.0', 'params': ['19', '20'], 'method': 'maintenance.delete', 'auth': u'ea11a835164c73a8da6673ef4522c3cb', 'id': 1} {u'jsonrpc': u'2.0', u'result': {u'maintenanceids': [u'19', u'20']}, u'id': 1} Delete Number Of Maintenance: 1 PS:提示信息Delete Number Of Maintenance: 1 雖然是數字1,這個打印結果是腳本自己的一個小問 能夠忽略,實際上列在deletemain.txt中的maintenanceid都刪除OK了!
四、更新維護模式
遇到一種狀況:不想從新建立維護模式,想將這個維護模式中的server更換成另一個或者多個server,這個時候須要使用zabbix API的maintenance.update方法了!
假如以前建立了一個維護模式:test maintenance,以下圖:
如今經過腳本將cmk_bs1和cmk_bs2兩臺服務器覆蓋掉,加入新的2臺服務器,腳本以下:
首先查看維護模式的id,以下: mysql> select * from maintenances; +---------------+------------------+------------------+-------------+--------------+-------------+ | maintenanceid | name | maintenance_type | description | active_since | active_till | +---------------+------------------+------------------+-------------+--------------+-------------+ | 22 | test maintenance | 0 | | 1477584000 | 1509120000 | +---------------+------------------+------------------+-------------+--------------+-------------+ 1 row in set (0.00 sec) 能夠看到id爲22!!! #cat zabbixupdatemain.py #!/usr/bin/env python #coding=utf-8 #導入模塊,urllib2是一個模擬瀏覽器HTTP方法的模塊 import json import urllib2 import sys from urllib2 import Request, urlopen, URLError, HTTPError #url and url header #zabbix的api 地址,用戶名,密碼,這裏修改成本身實際的參數 zabbix_url="http://10.0.18.12/zabbix/api_jsonrpc.php" zabbix_header = {"Content-Type":"application/json"} zabbix_user = "admin" zabbix_pass = "xxxx" auth_code = "" #auth user and password #用戶認證信息的部分,最終的目的是獲得一個SESSIONID #這裏是生成一個json格式的數據,用戶名和密碼 auth_data = json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params": { "user":zabbix_user, "password":zabbix_pass }, "id":0 }) # create request object request = urllib2.Request(zabbix_url,auth_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) #auth and get authid try: result = urllib2.urlopen(request) #對於出錯新的處理 except HTTPError, e: print 'The server couldn\'t fulfill the request, Error code: ', e.code except URLError, e: print 'We failed to reach a server.Reason: ', e.reason else: response=json.loads(result.read()) result.close() #判斷SESSIONID是否在返回的數據中 if 'result' in response: auth_code=response['result'] else: print response['error']['data'] # request json json_data={ "method": "maintenance.update", "params": { "maintenanceid": "22", ##維護模式id "active_since": 1477584000, "active_till": 1509120000, "hostids": [], ##留空,從txt中獲取hostid "timeperiods": [ #timeperiods根據狀況自行修改 { "timeperiod_type": 2, "every": 1, "dayofweek": 64, "start_time": 32400 , "period": 75600 #將維護時間由原來的2小時改成21小時 } ], } } json_base={ "jsonrpc":"2.0", "auth":auth_code, "id":1 } json_data.update(json_base) print json_data #用獲得的SESSIONID去經過驗證,獲取主機的信息(用http.get方法) with open("addmainten.txt") as f: #讀取txt文件中的hostsid #開始行 data=f.readlines() f.close() for line in data: json_data['params']['hostids'].append(line.strip("\n")) print json_data #結束行 if len(auth_code) == 0: sys.exit(1) if len(auth_code) != 0: get_host_data = json.dumps(json_data) # create request object request = urllib2.Request(zabbix_url,get_host_data) for key in zabbix_header: request.add_header(key,zabbix_header[key]) # get host list try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) result.close() #將全部的主機信息顯示出來 print "///////" print response #顯示主機的個數 print "The Number Of Maintenance: ", len(response['result'])
到zabbix數據庫查出更新host的hostid,以下
mysql> select hostid,name from hosts where name like 'agent_soa%'; +--------+------------+ | hostid | name | +--------+------------+ | 10154 | agent_soa1 | | 10155 | agent_soa2 | +--------+------------+ 2 rows in set (0.00 sec) 將查到的id寫入到txt文件中: #cat addmainten.txt 10154 10155 執行腳本 #python zabbixupdatemain.py {'jsonrpc': '2.0', 'params': {'hostids': [], 'active_since': 1477584000, 'active_till': 1509120000, 'maintenanceid': '22', 'timeperiods': [{'timeperiod_type': 2, 'dayofweek': 64, 'start_time': 32400, 'every': 1, 'period': 75600}]}, 'method': 'maintenance.update', 'auth': u'bd0f78f684f03546345001197eae8839', 'id': 1} {'jsonrpc': '2.0', 'params': {'hostids': ['10154', '10155'], 'active_since': 1477584000, 'active_till': 1509120000, 'maintenanceid': '22', 'timeperiods': [{'timeperiod_type': 2, 'dayofweek': 64, 'start_time': 32400, 'every': 1, 'period': 75600}]}, 'method': 'maintenance.update', 'auth': u'bd0f78f684f03546345001197eae8839', 'id': 1} /////// {u'jsonrpc': u'2.0', u'result': {u'maintenanceids': [u'22']}, u'id': 1} The Number Of Maintenance: 1 能夠看到執行成功,沒有報錯,到web界面查看update以後的維護模式
維護的主機由原來的兩臺cmk機器update成爲了agent兩臺機器!
PS:維護模式的update方法在CentOS 6.6+zabbix 2.4.4 +Python 2.7.12 版本執行成功,可是在CentOS 6.5+zabbix 2.2.4+Python 2.6.6執行報錯以下:
{u'jsonrpc': u'2.0', u'id': 1, u'error': {u'message': u'Invalid params.', u'code': -32602, u'data': u'Maintenance "" already exists.'}}
百思不得其解,google了好多資料,也沒有解決,若是有朋友碰巧遇到了類似狀況,還請多多指導,謝謝!
補充:
命令行調用方法:
curl -i -X POST -H 'Content-Type:application/json-rpc' -d '{ "jsonrpc": "2.0","method": "host.create","params": {"user":"admin","password":"123456","host": "salesagent","interfaces": [{"type": 1,"main": 1,"useip": 1,"ip": "10.11.20.100","dns": "","port": "10050"}],"groups": [{"groupid": "67"}],"templates": [{"templateid": "10001"}],"inventory_mode": 0,"inventory": {"macaddress_a": "01234","macaddress_b": "56768"}},"auth": "432075611467a50738c5cd76c173b36c", "id": 1}' http://ip/api_jsonrpc.php
參考腳本連接:https://github.com/itnihao/zabbix-book/tree/master/13-chapter/zabbix-api-example
不足之處,請多多指出!