是否有任何Nagios插件可以捕获来自多个SNMP代理的信息,并会在特定时间间隔内转储snmpwalk信息。 如果信息将以JSON格式转储,那将会更好。
答案 0 :(得分: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;
}
现在,您可以将其放在名为check_multi_snmpwalk.php的$ USER1 $目录(/ usr / local / nagios / libexec)中的文件中,并确保它的可执行文件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
}
现在你要说&#34;好的,这一切都很棒,但它做了什么?!&#34;
我很高兴你问过!这就是它的作用:
一些注意事项:
希望这有帮助!