2016-12-06 9 views

답변

0

잘 설명 된 plugin development guidelines로 인해 쉽게 만들 수 있습니다.

지금 바로 만드십시오. 2 개의 IP 주소, 192.168.1.10 및 192.168.1.11이 있다고 가정 해 봅시다. PHP를 사용하여 간단한 플러그인을 만들지 만, 원하는 언어로 작성하는 것이 이상적입니다.

이 플러그인은 가이드와 완전히 일치하지는 않지만 좋은 출발점이되어야합니다.

#!/usr/bin/php 
<?php 

// check if we have at least the minimum required output 
// (we need at least 1 argument) 
if (count($argv) < 2) { 

    echo <<<USAGE 
Usage: 
{$argv[0]} <outputfile> <address1>,<snmpcommunity1>,<snmpversion1>,<mib1> <address2>,<snmpcommunity2>,<snmpversion2>,<mib2> ... 

USAGE; 
    exit(1); 
} 

// prep the data 
$hosts = array(); 
$output = array(); 
$output_file = ''; 
for ($i = 1; $i < count($argv); $i++) { 

    $host = explode(",", $argv[$i]); 

    // we need exactly 4 elements 
    if (count($host) != 4) { 

     // unless of course we are specifying the output file to write the data to! 
     if (count($host) == 1) { 
      $output_file = $argv[$i]; 
      continue; 
     } 

     echo "{$argv[$i]} IS INVALID. YOU MUST SPECIFY ALL OF: <address>,<snmpcommunity>,<snmpversion>,<mib>\n"; 
     exit(1); 
    } 

    $hosts[] = array(
     'address'  => $host[0], 
     'snmp_community' => $host[1], 
     'snmp_version' => $host[2], 
     'mib'   => $host[3], 
     ); 
} 

// cycle through each host and gather the data 
// this may take a while 
foreach($hosts as $host) { 

    $snmpwalk_array = get_snmpwalk_lines($host['address'], $host['snmp_community'], $host['snmp_version'], $host['mib']); 
    $snmp_array = walk_lines_to_snmp_array($snmpwalk_array); 

    $output[$host['address']] = $snmp_array; 
} 

// convert the output array to json and put it in the file! 
$json = json_encode($output); 
file_put_contents($output_file, $json); 

$num_hosts = count($hosts); 
echo "OK - {$num_hosts} PROCESSED\n"; 
exit(0); 

// format an array in a sane way from snmp walk output 
// this will return an array like: 
// [oid][type] = 'Counter32' 
// [oid][value] = 0011232 
// etc. 
function walk_lines_to_snmp_array($walk_arr) { 

    $snmp = array(); 

    foreach ($walk_arr as $line) { 
     $oid = convert_snmpwalk_line_to_array($line, $arr); 
     if ($oid !== false) 
      $snmp[$oid] = $arr; 
    } 

    return $snmp; 
} 

// return an array of an executed snmpwalk output 
function get_snmpwalk_lines($address, $snmp_community, $snmp_version, $mib) { 

    $cmd = "snmpwalk -c {$snmp_community} -v {$snmp_version} {$address} -m {$mib}"; 
    exec($cmd, $output); 

    return $output; 
} 

// return the oid and pass the array by ref 
// or return false on failure 
function convert_snmpwalk_line_to_array($line, &$arr) { 

    if (preg_match('/(.*) = (.*): (.*)/', $line, $matches) === 1) { 
     $arr = array(
      'type' => $matches[2], 
      'value' => $matches[3], 
      ); 

     return $matches[1]; 
    } 

    return false; 
} 

지금, 당신은을 $ USER1 $ 디렉터리 (/ usr/지방/Nagios는/libexec 디렉토리)라는 이름의 check_multi_snmpwalk.php의 파일에 넣고하고 chmod +x /usr/local/nagios/libexec/check_multi_snmpwalk.php 실행 확신 할 수 있습니다.

마지막으로, 우리가해야 할 일은 Nagios가 그것을 집어 들고 사용하는 명령을 정의하는 것입니다. 다음과 같은 뭔가가 충분해야합니다

define command { 
     command_name        check_multi_snmpwalk 
     command_line        $USER1$/check_multi_snmpwalk.php $ARG1$ $ARG2$ $ARG3$ $ARG4$ 
} 

지금 당신은 ARG1에서 당신은 JSON은 출력 할 파일을 지정 할 수 있어야하고 서로 인수는 호스트 주소를 포함해야합니다, SNMP 커뮤니티, snmp 버전 및 도보하려는 mib.

따라서, 예를 들어 :

define service { 
     host_name      localhost 
     service_description    Multi SNMP Walk 
     use        local-service 
     check_command     check_multi_snmpwalk!/tmp/jsonfile!192.168.1.10,community,1,all!192.168.1.11,community,2c,all!! 
     register      1 
     } 

지금 당신이 "좋아, 모두 훌륭한 먹으 렴하지만 무엇을합니까?!"말을하는지

내가 기쁘다.

  • snmpwalk를 실행 일부 사용자로부터 입력 (무엇을 우리가 걷고있는 SNMP입니까?)
  • 을 잡아 (출력을 저장)에 snmpwalk에서 출력을 변환
  • 을 지정된 각 호스트 : 이것은 무엇이다 읽기 쉬운 배열 파일에 JSON을 작성 JSON
  • 에 거대한 배열을 변환 거대한 배열
  • 에 읽기 쉬운 배열 각 호스트의 snmpwalk를 집계
  • 지정
  • 우리가 처리 한 호스트의 수를 나타내는 메시지가있는 Nagios의 OK 상태를 반환합니다!

몇 가지 참고 사항 :이 플러그인에 상관없이 사용자가 지정한 얼마나 많은 호스트가 실행되지 데 시간이 걸릴 것입니다

  • , 당신은
  • 을 확인 대신의 Nagios의 cron 작업에서 실행 고려할 수 있도록
  • 이 플러그인은 내가 이전에 링크 된 플러그인 지침을 준수하지 않는,하지만 여전히이 도움이 재미있는 작은 프로젝트

희망이었다!

+0

고마워요. @Nagios 지원. 정말 고맙습니다. 그러나 C에서 멀티 슬라이딩과 같은 개념을 적용 할 것입니다. 멀티 스레딩을 사용하는 C가 너무 많은 것을 모니터링하는 좋은 옵션이 될 수 있습니다. 0.1 백만에 가까운) 장치. –

+0

API 목록을 작성하는 멀티 스레딩 C가 너무 많은 (0.1 백만개에 달하는) 너무 많은 장치를 모니터링하는 좋은 옵션이 될 것입니다. 여기 API는 CPU로드, 메모리 사용량, 온도 e.t.c를 얻는 것입니다. 다시 감사드립니다. –

+0

당신의 질문을 이해할 수 없다고 생각합니다. 그러나 "성능과 확장성에 관한 한 다중 스레드 C 코드가 더 좋을까요?" 그러면 대답은 "아마도 예"입니다. "API 목록 만들기"란 무엇을 의미합니까? –