2016-12-06 14 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/local/nagiosに/ libexecに)という名前のcheck_multi_snmpwalk.php内のファイルでこれを入れて、それが実行可能chmod +x /usr/local/nagios/libexec/check_multi_snmpwalk.phpだことを確認することができます。

最後に、私がする必要があることは、Nagiosがそれを持ち上げて使用するためのコマンドを定義することだけです。今、あなたはJSONはARG1内に出力したいファイルを指定することができるはず

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

をして、お互いの引数は、ホストアドレス、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 
     } 

は今、あなたは "オーケー、すべての偉大なthatsのが、それは何をするのか?!" と言っています

嬉しいです。

  • のsnmpwalkを実行するいくつかのユーザからの入力(何が私たちが歩いSNMPされている?)
  • をつかむ(および出力を保存)にsnmpwalkの出力を変換
  • を指定した各ホストのために:これは、それが何をするかでありますファイルにJSON
  • JSONを書く
  • に巨大な配列を変換する巨大な配列
  • に各ホストのsnmpwalkの読みやすい配列を集約読みやすい配列
  • を指定しました
  • 処理したホストの数を示すメッセージとともにNagiosのOKステータスを返す!

いくつかの注意事項:

  • あなたが代わりにNagiosのチェック
  • のcronジョブからそれを実行することを検討することもできますので、このプラグインは、指定したどのように多くのホストに関係なく実行するためにしばらく時間がかかります
  • このプラグインは、私が以前にリンクされたプラグインのガイドラインに準拠していないが、それはまだ、これが助けた楽しい小さなプロジェクト

希望でした!

+0

ありがとうございます。本当にありがとうございます。ただし、スケーラビリティの問題が少ないため、同じ概念をC(マルチスレッド)に入れようとしています。マルチスレッドでCを使用すると、 0.1百万に近い)デバイス。 –

+0

APIのリストを作成するためのマルチスレッドを使用するCが、あまりにも多くのデバイスを監視するのに適しているかどうかをお勧めします(ここでは0.1百万に近いデバイスがCPU負荷、メモリ使用、温度e.t.cを取得します)。 –

+0

私はあなたの質問を具体的に理解しているとは思えませんが、「パフォーマンスとスケーラビリティに関しては、上記のコードのマルチスレッド化されたCバージョンは良いでしょうか?答えは "おそらくはい"です。 「APIのリストを作成する」とはどういう意味ですか? –

関連する問題