Ad Widget

Collapse

Вопрос по Zabbix API

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • EdwardK
    Junior Member
    • Nov 2016
    • 18

    #1

    Вопрос по Zabbix API

    Всем привет.

    Столкнулся с проблемой,а именно с получением Inventory хоста,нужны конкретно широта и долгота хостаУдалось подключится к Забиксу используя Java и блиотеку David Webb.

    Подключение и токен :

    Code:
    import org.json.JSONObject;
    import org.json.JSONException;
    import com.goebl.david.Webb;
     
    public class Zabbix_auth {
     
       public static void main(String[] args) throws JSONException {
     
         try {
     
           JSONObject mainJObj = new JSONObject();
           JSONObject paramJObj = new JSONObject();
     
           mainJObj.put("jsonrpc", "2.0");
           mainJObj.put("method", "user.login");
     
           paramJObj.put("user", "login");
           paramJObj.put("password", "password"); 
     
           mainJObj.put("params", paramJObj);
           mainJObj.put("id", "1");
           
           
           
         
     
           Webb webb = Webb.create();
     
           System.out.println("Data to send: " + mainJObj.toString());
     
           JSONObject result = webb.post("http://localhost/api_jsonrpc.php")
                                        .header("Content-Type", "application/json")
                                        .useCaches(false)
                                        .body(mainJObj)
                                        .ensureSuccess()
                                        .asJsonObject()
                                        .getBody();
     
           System.out.println("Authentication token: " + result.getString("result"));
           
           
           
     
         } catch (JSONException je) {
     
           System.out.println("Error creating JSON request to Zabbix API..." + je.getMessage());
           
            }
         
      }
     
    }
    Попытки вывести инвентарь :

    Code:
    import org.json.JSONObject;
    import org.json.JSONException;
    import com.goebl.david.Webb;
     
    public class Host_info_get {
     
       public static void main(String[] args) throws JSONException {
     
         try {
     
           JSONObject mainJObj = new JSONObject();
           JSONObject paramJObj = new JSONObject();
     
           mainJObj.put("jsonrpc", "2.0");
           mainJObj.put("method", "host.get");
          
           paramJObj.put("output", "location_lat");
          
           
           mainJObj.put("params", paramJObj);
           mainJObj.put("id", "2");
           mainJObj.put("auth", "Token");
           
           Webb webb = Webb.create();
     
           System.out.println("Data to send: " + mainJObj.toString());
     
           JSONObject result = webb.post("http://localhost/api_jsonrpc.php")
                                        .header("Content-Type", "application/json")
                                        .useCaches(false)
                                         .body(mainJObj)
                                        .ensureSuccess()
                                        .asJsonObject()
                                        .getBody();
     
           System.out.print("Host info: " + result.getString("result"));
           
           
           
     
         } catch (JSONException je) {
     
           System.out.println("Unable to get to host" + je.getMessage());
           
            }
         
     
      }
     
    }
    Не могу правильно сформулировать JSON запрос,который бы уже подогнал под данную реализацию.

    Буду рад любой помощи,спасибо.
    Last edited by EdwardK; 15-11-2016, 11:59.
  • sersad
    Senior Member
    • May 2009
    • 518

    #2
    Версию обозначьте.

    Comment

    • EdwardK
      Junior Member
      • Nov 2016
      • 18

      #3
      Originally posted by sersad
      Версию обозначьте.

      Добрый день.

      Версия 2.4

      Comment

      • EdwardK
        Junior Member
        • Nov 2016
        • 18

        #4
        Originally posted by sersad
        Версию обозначьте.


        Версия 2.4.1
        Last edited by EdwardK; 15-11-2016, 14:11.

        Comment

        • sersad
          Senior Member
          • May 2009
          • 518

          #5
          python чтение
          Code:
          inv = zapi.host.get(output='extend', selectInventory =['site_address_a'])
          selectInventory выбрать то что нужно

          например как в процедуре апдетйта
          Code:
          zapi.host.update(hostid=host_id,inventory_mode = '1',
                                      inventory={'location_lat':lat,
                                      'location_lon':lng,
                                      'site_address_b':fulladdress,
                                      ##'site_zip': zipcode,
                                      })

          Comment

          • EdwardK
            Junior Member
            • Nov 2016
            • 18

            #6
            Thanks for your response.

            Подправил код :

            Code:
            import org.json.JSONObject;
            import org.json.JSONException;
            import com.goebl.david.Webb;
             
            public class Host_info_get {
             
               public static void main(String[] args) throws JSONException {
             
                 try {
             
                   JSONObject mainJObj = new JSONObject();
                   JSONObject paramJObj = new JSONObject();
             
                   mainJObj.put("jsonrpc", "2.0");
                   mainJObj.put("method", "host.get");
                   mainJObj.put("inventory_mode", "1");
                   
                   
                   paramJObj.put("output", "searchInventory");
                   paramJObj.put("output", "selectInventory");
                   paramJObj.put("output", "location_lat");
                   paramJObj.put("selectInventory", "location_lat");
                   paramJObj.put("selectInventory", "location_lon");
                  
                   paramJObj.put("object", "searchInventory");
                   paramJObj.put("object", "selectInventory");
                   mainJObj.put("params", paramJObj);
                   mainJObj.put("id", "2");
                   mainJObj.put("auth", "34f3c3dtghfhgfhrt380537245de");
                   
                   Webb webb = Webb.create();
             
                   System.out.println("Data to send: " + mainJObj.toString());
             
                   JSONObject result = webb.post("http://localhost/api_jsonrpc.php")
                                                .header("Content-Type", "application/json")
                                                .useCaches(false)
                                                 .body(mainJObj)
                                                .ensureSuccess()
                                                .asJsonObject()
                                                .getBody();
             
                   System.out.print("Host info: " + result.getString("result"));
                   
                   
                   
             
                 } catch (JSONException je) {
             
                   System.out.println("Unable to get to host" + je.getMessage());
                   
                    }
                 
             
              }
            Вот что программа выдет в консоли :

            Code:
            Host info: [{"hostid":"10151","inventory":{"hostid":"10151"}},{"hostid":"10152","inventory":{"hostid":"10152"}},.......
            Вроде достал до инвентаря,но не до координат....

            Comment

            • sersad
              Senior Member
              • May 2009
              • 518

              #7
              в метод host.get
              добавьте output=extend
              и оставьте только один параметр selectInventory location_lat

              убрать inventory_mode=1 это не для этого метода

              Проверьте так.

              selectInventory = array если я прально помню. т.е. не надо писать его много раз а присвоить параметру список параметров. В python это делается так. У вас надо делать так же, но как это выглядит в коде не подскажу.

              ЗЫ в Java не сильно разбираюсь.

              Comment

              • EdwardK
                Junior Member
                • Nov 2016
                • 18

                #8
                Изменил код :

                Code:
                import org.json.JSONObject;
                import org.json.JSONException;
                import com.goebl.david.Webb;
                 
                public class Host_info_get {
                 
                   public static void main(String[] args) throws JSONException {
                 
                     try {
                 
                       JSONObject mainJObj = new JSONObject();
                       JSONObject paramJObj = new JSONObject();
                 
                 
                       mainJObj.put("jsonrpc", "2.0");
                       mainJObj.put("method", "host.get");
                       mainJObj.put("output", "extend");
                       
                       paramJObj.put("selectInventory", "location_lat");
                       paramJObj.put("output", "inventory");
                    
                       mainJObj.put("params", paramJObj);
                       mainJObj.put("id", "2");
                       mainJObj.put("auth", "token");
                       Webb webb = Webb.create();
                 
                       System.out.println("Data to send: " + mainJObj.toString());
                 
                       JSONObject result = webb.post("http://localhost/api_jsonrpc.php")
                                                    .header("Content-Type", "application/json")
                                                    .useCaches(false)
                                                     .body(mainJObj)
                                                    .ensureSuccess()
                                                    .asJsonObject()
                                                    .getBody();
                 
                       System.out.print("Host info: " + result.getString("result"));
                       
                       
                       
                 
                     } catch (JSONException je) {
                 
                       System.out.println("Unable to get to host" + je.getMessage());
                       
                        }
                     
                 
                  }
                 
                }
                В консоли ответ такого формата :

                Code:
                Host info: [{"hostid":"10151","inventory":{"hostid":"10151"}},{"hostid":"10152","inventory":{"hostid":"10152"}}
                Если убрать строку
                Code:
                 paramJObj.put("output", "inventory");
                Выводит в консоль :


                Code:
                Host info: [{"ipmi_privilege":"2","maintenance_status":"0","jmx_available":"0","errors_from":"1352108857","available":"2","snmp_errors_from":"0","flags":"0","hostid":"10151","description":"","error":"Get value from agent failed: cannot connect to [[atm001]:10050]: [4] Interrupted system call","inventory":{"hostid":"10151"},"jmx_errors_from":"0","proxy_hostid":"0","maintenanceid":"0","maintenance_from":"0","ipmi_authtype":"-1","ipmi_username":"","snmp_disable_until":"0","host":"ATM00001","jmx_error":"","jmx_disable_until":"0","disable_until":"1352109208","ipmi_errors_from":"0","snmp_error":"","maintenance_type":"0","snmp_available":"0","templateid":"0","ipmi_available":"0","lastaccess":"0","ipmi_password":"","ipmi_error":"","name":"ATM00001","ipmi_disable_until":"0","status":"0"},{"ipmi_privilege":"2","maintenance_status":"0","jmx_available":"0","errors_from":"0","available":"0","snmp_errors_from":"0","flags":"0","hostid":"10152","description":"","error":"","inventory":{"hostid":"10152"},"jmx_errors_from":"0","proxy_hostid":"0","maintenanceid":"0","maintenance_from":"0","ipmi_authtype":"-1","ipmi_username":"","snmp_disable_until":"0","host":"ATM00002","jmx_error":"","jmx_disable_until":"0","disable_until":"0","ipmi_errors_from":"0","snmp_error":"","maintenance_type":"0","snmp_available":"0","templateid":"0","ipmi_available":"0","lastaccess":"0","ipmi_password":"","ipmi_error":"","name":"ATM00002","ipmi_disable_until":"0","status":"0"},{"ipmi_privilege":"2","maintenance_status":"0","jmx_available":"0","errors_from":"0","available":"0","snmp_errors_from":"0","flags":"0","hostid":"10153","description":"","error":"","inventory":{"hostid":"10153"},"jmx_errors_from":"0","proxy_hostid":"0","maintenanceid":"0","maintenance_from":"0","ipmi_authtype":"-1","ipmi_username":"","snmp_disable_until":"0", .........

                Comment

                • sersad
                  Senior Member
                  • May 2009
                  • 518

                  #9
                  Code:
                  #!/usr/bin/python
                  # -*- coding: utf-8 -*-
                  from pyzabbix import ZabbixAPI ##sudo pip install pyzabbix
                  import pprint
                  import sys, os
                  
                  zapi = ZabbixAPI("http://xxxx.xxxx.xxxx")
                  zapi.login("xxxxx", "xxxxx")
                  print "Connected to Zabbix API Version %s" % zapi.api_version()
                  
                  class PP(pprint.PrettyPrinter):
                      def format(self, object, context, maxlevels, level):
                          if isinstance(object, unicode):
                              return (object.encode('utf8'), True, False)
                          return pprint.PrettyPrinter.format(self, object, context, maxlevels, level)
                  
                  inv = zapi.host.get(hostids='21708', output='extend', selectInventory =['site_address_a','location_lat','location_lon'])
                  
                  PP().pprint (inv)

                  Ответ
                  Code:
                  Connected to Zabbix API Version 3.2.2
                  [{available: 0,
                    description: ,
                    disable_until: 0,
                    error: ,
                    errors_from: 0,
                    flags: 0,
                    host: xx.xx.xx.xx,
                    hostid: 21708,
                    inventory: {hostid: 21708,
                                location_lat: xx.025777,
                                location_lon: xx.230687,
                                site_address_a: xxxxxxx xxxxxxxx xxxxxxxx Район xxxxxxxx Деревня},
                    ipmi_authtype: 0,
                    ipmi_available: 0,
                    ipmi_disable_until: 0,
                    ipmi_error: ,
                    ipmi_errors_from: 0,
                    ipmi_password: ,
                    ipmi_privilege: 2,
                    ipmi_username: ,
                    jmx_available: 0,
                    jmx_disable_until: 0,
                    jmx_error: ,
                    jmx_errors_from: 0,
                    lastaccess: 0,
                    maintenance_from: 0,
                    maintenance_status: 0,
                    maintenance_type: 0,
                    maintenanceid: 0,
                    name: CU-UCN-xxx-xxxx xxxxx р-н xxxxxx д.,
                    proxy_hostid: 15732,
                    snmp_available: 1,
                    snmp_disable_until: 0,
                    snmp_error: ,
                    snmp_errors_from: 0,
                    status: 0,
                    templateid: 0,
                    tls_accept: 1,
                    tls_connect: 1,
                    tls_issuer: ,
                    tls_psk: ,
                    tls_psk_identity: ,
                    tls_subject: }]
                  [Finished in 0.599s]

                  Попробуйте мой JSON запрос в своем коде использовать

                  Comment

                  • sersad
                    Senior Member
                    • May 2009
                    • 518

                    #10

                    Comment

                    • EdwardK
                      Junior Member
                      • Nov 2016
                      • 18

                      #11
                      Пытаюсь подобраться используя питон :

                      Code:
                      from pyzabbix import ZabbixAPI
                      
                      zapi = ZabbixAPI("http://****.****.***/api_jsonrpc.php")
                      zapi.login("******", "*****")
                      print("Connected to Zabbix API Version %s" % zapi.api_version())
                      
                      for h in zapi.host.get(output="extend"):
                          print(h['hostid'])
                      Получаю такой реакцию :

                      Code:
                      pyzabbix.api.ZabbixAPIException: ("Error -32602: Invalid params., Login name or password is incorrect. while sending {'jsonrpc': '2.0', 'id': '1', 'params': {'password': 'zabbix', 'user': 'admin'}, 'method': 'user.login'}", -32602)
                      Пароль и логин 100% правильные,не могу понять в чем проблема.

                      Спасибо

                      Comment

                      • sadman
                        Senior Member
                        • Dec 2010
                        • 1611

                        #12
                        Originally posted by EdwardK
                        Пытаюсь подобраться используя питон :
                        Питона не знаю, какую либу пользуете - тоже, но тыкну пальцем в небо.

                        https://github.com/blacked/py-zabbix:
                        Code:
                        from pyzabbix import ZabbixAPI
                        
                        # Create ZabbixAPI class instance
                        zapi = ZabbixAPI(url='https://localhost/zabbix/', user='admin', password='zabbix')
                        
                        # Get all disabled hosts
                        result = zapi.host.get(status=1)
                        hostnames = [host['host'] for host in result1]
                        Никакого login() в документации нет. Полагаю, что конструктор объекта сам делает логин и при повторном вызове метода что-то идет не так.

                        Comment

                        • EdwardK
                          Junior Member
                          • Nov 2016
                          • 18

                          #13
                          Спасибо!Есть контакт!

                          Code:
                          from zabbix.api import ZabbixAPI
                          
                          # Create ZabbixAPI class instance
                          zapi = ZabbixAPI(url='http://**********/api_jsonrpc.php', user='********', password='****')
                          
                          # Get all monitored hosts
                          result1 = zapi.host.get(monitored_hosts=1, output='extend')
                          
                          # Get all disabled hosts
                          result2 = zapi.do_request('host.get',
                                                    {
                                                        'filter': {'status': 1},
                                                        'output': 'extend'
                                                    })
                          
                          # Filter results
                          hostnames1 = [host['host'] for host in result1]
                          hostnames2 = [host['host'] for host in result2['result']]
                          
                          print(hostnames1)
                          print(hostnames2)
                          Выдало название всех хостов.Есть идеи как вывести данные инвентаря?(Широта,долгота).

                          Спасибо

                          Comment

                          • sadman
                            Senior Member
                            • Dec 2010
                            • 1611

                            #14
                            Originally posted by EdwardK
                            Выдало название всех хостов.Есть идеи как вывести данные инвентаря?(Широта,долгота).
                            Спасибо
                            На перловке, правда. $ids - список взведенных триггеров. Т.е. находим координаты проблемных узлов.
                            Code:
                            ...
                            $zbxData = "{\"jsonrpc\": \"2.0\", \"method\": \"host.get\", \"params\": { \"output\": [\"host\"],\"triggerids\" : [ $ids ], \"selectInventory\": [\"os\", \"
                            location_lon\", \"location_lat\"]}, \"auth\":\"$authToken\", \"id\": $reqId}";
                            $response = $ua->post($zbxAPI, 'Content_type' => 'application/json-rpc', 'Content' => $zbxData);
                            $zbxData = decode_json($response->{'_content'});
                            ...
                            print Dumper $zbxData;
                            Значения в полях - придуманные.
                            Code:
                            ...
                             {
                               'inventory' => {
                                                'hostid' => '10373',
                                                'location_lat' => '60.5',
                                                'location_lon' => '30.8',
                                              },
                               'hostid' => '10373',
                               'host' => 'one.virtual.host'
                             },
                            ....
                            А вообще - пример есть: https://www.zabbix.com/documentation...inventory_data

                            Comment

                            • sersad
                              Senior Member
                              • May 2009
                              • 518

                              #15
                              Originally posted by EdwardK
                              Спасибо!Есть контакт!

                              Выдало название всех хостов.Есть идеи как вывести данные инвентаря?(Широта,долгота).

                              Спасибо
                              Я уже давал код

                              Comment

                              Working...