zabbix api로 정보 얻기

13303 단어 파이썬zabbix
파이썬에서 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)
    

    실행 테스트


  • 각 참조 권한이 붙은 계정을 준비합니다 (Admin등으로 ok입니다만)
  • 테스트용 인벤토리 정보를 기재 이번에는 비고(notes)를 사용합니다
  • 스크립트를 두드리는$ 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로 데이터 처리하고 있습니다.

    좋은 웹페이지 즐겨찾기