使用 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] =]
  • 这个插件不符合我之前链接的插件指南,但它仍然是一个有趣的小项目

希望对您有所帮助!