Zabbixの作業を自動化したいという事で、ZabbixAPIを使ってみました。対象のZabbixは3.2とちょっと古めのようですが、API自体はあまりバージョンは気にしなくてよさそうでした。ドキュメントが充実しているので助かります。
認証後、2件のホストを指定してホスト情報を取ってくるテストを書いてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
@Test public void testZabbixAPI() throws Exception { String zabbixUser = "zabbixuser"; String zabbixPass = "****"; String zabbixEndpoint = "http://zabbixserver/zabbix/api_jsonrpc.php"; //認証 JSONObject json = new JSONObject(); json.put("user", zabbixUser); json.put("password", zabbixPass); json.put("userData", "false"); String token = null; ResponseEntity<String> response = Request("user.login", json, zabbixEndpoint, token); JsonNode root = new ObjectMapper().readTree(response.getBody()); token = root.get("result").get("sessionid").asText(); //ホスト情報取得 JSONObject target = new JSONObject(); String[] chkTarget = {"server01","server02"}; JSONArray targetArray = new JSONArray(chkTarget); JSONObject param = new JSONObject(); param.put("output", new JSONArray(Arrays.asList("hostid","host","name"))); target.put("host", targetArray); param.put("filter", target); response = Request("host.get", param, zabbixEndpoint, token); ObjectMapper mapper = new ObjectMapper(); ArrayNode arrayHost = (ArrayNode) mapper.readTree(response.getBody()).path("result"); System.out.println("hosts: " + arrayHost); } private ResponseEntity<String> Request(String method, JSONObject param, String endPoint, String token) throws Exception { JSONObject json = new JSONObject(); json.put("jsonrpc", "2.0"); json.put("method", method); json.put("params", param); json.put("id", 1); if(token != null){ json.put("auth", token); } HttpMethod httpMethod = HttpMethod.POST; HttpEntity <String> entity ; HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json-rpc"); headers.add("Accept-Language", "ja"); if(param == null){ entity = new HttpEntity <String>(headers); } else{ entity = new HttpEntity <String>(json.toString(), headers); } RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters() .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8"))); ResponseEntity<String> response = restTemplate.exchange(endPoint, httpMethod, entity, String.class); return response; } |
で、こんな感じで戻ってきます。
hosts: [{“hostid”:”10387″,”host”:”server01″,”name”:”server01_DB”},{“hostid”:”10388″,”host”:”server02″,”name”:”server02_DB”}]
問題無く使えそうなので、要件を整理してから実装してみます。