zabbix api로 정보 얻기
이번에는 정보를 얻으려고합니다.
파이썬이라면 편리한 pyzabbix 등도 있지만,
회사의 서버 환경에서 설치에 저항이 있다고 가정합니다.
json과 urllib2를 사용해 보았습니다.
또, 할 수 있는 쪽은 모듈에까지 떨어뜨림을 한 다음에 사용한다고 생각합니다만,
이번에는 거기까지 실시하지 않습니다.
Python 초보자를 위해서 작성에 있어서 선인분의 내용을 참고로 했습니다
[참고하겠습니다]
http://www.zumwalt.info/blog/2012/11/pyhton에서 zabbix-api를 만져보세요 /
이번 시도에 할 일이라고 가정
파이썬 스크립트
동작은,zabbix2.0계,zabbix2.4계에서 확인했습니다
설정 정보
client의 url 부분은 Listen 하고 있는 주소로 재기록해 주세요
그리고 http or https 설정도 잊지 말고
이번 내용
인벤토리 가져 오기.py#!/usr/bin/python
# coding: utf-8
import os
import sys
import getpass
import json
import urllib2
if len(sys.argv) != 2 :
print ' ERROR : Please check Search hostname.'
print ' Usage: ' + os.path.basename(__file__) + ' [search hostname]'
sys.exit()
client = 'https://127.0.0.1/zabbix/api_jsonrpc.php'
postheader = {'Content-Type': 'application/json-rpc'}
userid = raw_input('Please Enter Zabbix Web Account : ')
passwd = getpass.getpass('PASSWORD :')
while userid == '':
print 'type the account.'
userid = raw_input('Please Enter Zabbix Web Account : ')
while passwd == '':
print 'type the password'
passwd = getpass.getpass('PASSWORD :')
# auth
authquery = json.dumps({'jsonrpc':'2.0', 'method':'user.login', 'params':{'user':userid, 'password':passwd}, 'auth':None, 'id': 1})
authreq = urllib2.Request(client, authquery, postheader)
try :
getauthresult = urllib2.urlopen(authreq).read()
authresult = json.loads(getauthresult)
except Exception as e :
print ' %s %s' % ('ERROR :',e)
print ' Please check zabbix URL Setting or Others.'
sys.exit()
if 'error' in authresult :
print ' %s %s' % ('API Error :',authresult['error']['data'])
sys.exit()
# query
## メソッドとパラメータ
# host.get : ホスト情報取得のメソッド
# output : Object properties to be returned.今ドキュメント見たらdefaultがextend
# filter : 'status:0' = 監視有効のホスト, 'host:[hogehoge]' 指定したホスト名でフィルタする
# inventory : インベントリ情報の項目の出力指定 extend = 全部表示
# 特定ホストのインベントリの取得だけであればfilterのhost,select inventoryのみで良さそうである
postquery = json.dumps({'jsonrpc':'2.0', 'method':'host.get', 'params':{'output':'extend', 'filter':{'status':'0', 'host':sys.argv[1]}, 'selectInventory':'extend'}, 'auth':authresult['result'], 'id':1})
postreq = urllib2.Request(client, postquery, postheader)
getpostresult = urllib2.urlopen(postreq).read()
postresult = json.loads(getpostresult)
# result is empty
if not postresult['result'] :
print 'no such host.'
sys.exit()
# result data export
info=[]
for data in postresult['result'] :
if not data['inventory'] :
print 'no such inventory .'
sys.exit()
info = data['inventory']['notes']
print '--------------------------------------------------'
print '%s%s%s%s%s' % ('# INFO -> ', sys.argv[1], ' : ', '\n', info)
실행 테스트
#!/usr/bin/python
# coding: utf-8
import os
import sys
import getpass
import json
import urllib2
if len(sys.argv) != 2 :
print ' ERROR : Please check Search hostname.'
print ' Usage: ' + os.path.basename(__file__) + ' [search hostname]'
sys.exit()
client = 'https://127.0.0.1/zabbix/api_jsonrpc.php'
postheader = {'Content-Type': 'application/json-rpc'}
userid = raw_input('Please Enter Zabbix Web Account : ')
passwd = getpass.getpass('PASSWORD :')
while userid == '':
print 'type the account.'
userid = raw_input('Please Enter Zabbix Web Account : ')
while passwd == '':
print 'type the password'
passwd = getpass.getpass('PASSWORD :')
# auth
authquery = json.dumps({'jsonrpc':'2.0', 'method':'user.login', 'params':{'user':userid, 'password':passwd}, 'auth':None, 'id': 1})
authreq = urllib2.Request(client, authquery, postheader)
try :
getauthresult = urllib2.urlopen(authreq).read()
authresult = json.loads(getauthresult)
except Exception as e :
print ' %s %s' % ('ERROR :',e)
print ' Please check zabbix URL Setting or Others.'
sys.exit()
if 'error' in authresult :
print ' %s %s' % ('API Error :',authresult['error']['data'])
sys.exit()
# query
## メソッドとパラメータ
# host.get : ホスト情報取得のメソッド
# output : Object properties to be returned.今ドキュメント見たらdefaultがextend
# filter : 'status:0' = 監視有効のホスト, 'host:[hogehoge]' 指定したホスト名でフィルタする
# inventory : インベントリ情報の項目の出力指定 extend = 全部表示
# 特定ホストのインベントリの取得だけであればfilterのhost,select inventoryのみで良さそうである
postquery = json.dumps({'jsonrpc':'2.0', 'method':'host.get', 'params':{'output':'extend', 'filter':{'status':'0', 'host':sys.argv[1]}, 'selectInventory':'extend'}, 'auth':authresult['result'], 'id':1})
postreq = urllib2.Request(client, postquery, postheader)
getpostresult = urllib2.urlopen(postreq).read()
postresult = json.loads(getpostresult)
# result is empty
if not postresult['result'] :
print 'no such host.'
sys.exit()
# result data export
info=[]
for data in postresult['result'] :
if not data['inventory'] :
print 'no such inventory .'
sys.exit()
info = data['inventory']['notes']
print '--------------------------------------------------'
print '%s%s%s%s%s' % ('# INFO -> ', sys.argv[1], ' : ', '\n', info)
$ scriptname.py [検索対象ホスト名(zabbixに設定している)]
$ ./get.py test
Please Enter Zabbix Web Account : test
PASSWORD :
--------------------------------------------------
# INFO -> test :
test test test
テストだって
aaaaaaaaaaa
출력은 어색하지만 이런 느낌으로 추출을 할 수 있습니다
서버에 로그인하기 전에 매번 확인하는 것을 습득하면 편리하게 될까라고 생각했지만 규칙화는 어렵다
이 스크립트 실행 중 오류
URL 지정이 잘못되었을 경우
$ ./get.py test
Please Enter Zabbix Web Account : test
PASSWORD :
ERROR : <urlopen error [Errno 111] Connection refused>
Please check zabbix URL Setting or Others.
$ ./get.py test
Please Enter Zabbix Web Account : test
PASSWORD :
ERROR : HTTP Error 404: Not Found
Please check zabbix URL Setting or Others.
계정 또는 비밀번호 실수
$ ./get.py test
Please Enter Zabbix Web Account :a
PASSWORD :
API Error : Login name or password is incorrect.
인벤토리가 비활성화된 호스트가 존재하지 않음(권한 없음 참조)
$ ./get.py test1
Please Enter Zabbix Web Account : test
PASSWORD :
no such host.
$ ./get.py test2
Please Enter Zabbix Web Account : test
PASSWORD :
no such inventory.
당연합니다만 메소드나 파라미터를 바꾸는 것에 의해 여러가지 취득할 수 있습니다
그리고 이번 Inventory 정보는 selectInventory에서 취득하는 항목의 지정도 할 수 있었던 것 같습니다만
왠지 내가 실패한 기억이 있기 때문에 extend로 데이터 처리하고 있습니다.
Reference
이 문제에 관하여(zabbix api로 정보 얻기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rotekxyz/items/67676ea7d2aea0cee38e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)