使用 Nagios 将 SNMP 信息转储到文件中
Dump SNMP information into file using Nagios
有没有Nagios的插件可以从多个SNMP代理抓取信息,并在一定的时间间隔内转储snmpwalk信息。
如果信息以JSON格式转储会更好。
由于文档完善 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 拿起并使用它!像下面这样的东西就足够了:
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
}
现在你说的是"Okay, thats all great, but what does it do?!"
很高兴你提出这个问题!这是它的作用:
- 从用户那里获取一些输入(我们在 snmp 走什么?)
- 为指定的每个主机执行 snmpwalk(并保存输出)
- 将 snmpwalk 输出转换为易于阅读的数组
- 将每个主机的snmpwalk易读数组聚合成一个巨型数组
- 正在将巨型数组转换为 JSON
- 正在将 JSON 写入指定的文件
- 正在为 Nagios 返回 OK 状态,并显示一条消息说明我们处理了多少主机!
一些注意事项:
- 无论您指定多少主机,此插件都需要一段时间 运行,因此您可能需要考虑 运行从 cron 作业而不是 Nagios 检查[=50] =]
- 这个插件不符合我之前链接的插件指南,但它仍然是一个有趣的小项目
希望对您有所帮助!
有没有Nagios的插件可以从多个SNMP代理抓取信息,并在一定的时间间隔内转储snmpwalk信息。 如果信息以JSON格式转储会更好。
由于文档完善 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 拿起并使用它!像下面这样的东西就足够了:
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
}
现在你说的是"Okay, thats all great, but what does it do?!"
很高兴你提出这个问题!这是它的作用:
- 从用户那里获取一些输入(我们在 snmp 走什么?)
- 为指定的每个主机执行 snmpwalk(并保存输出)
- 将 snmpwalk 输出转换为易于阅读的数组
- 将每个主机的snmpwalk易读数组聚合成一个巨型数组
- 正在将巨型数组转换为 JSON
- 正在将 JSON 写入指定的文件
- 正在为 Nagios 返回 OK 状态,并显示一条消息说明我们处理了多少主机!
一些注意事项:
- 无论您指定多少主机,此插件都需要一段时间 运行,因此您可能需要考虑 运行从 cron 作业而不是 Nagios 检查[=50] =]
- 这个插件不符合我之前链接的插件指南,但它仍然是一个有趣的小项目
希望对您有所帮助!