**以前のリビジョンの文書です**

HDDの温度監視

HDDの温度をCentreonに監視させて、グラフを書く。前半はNagiosとやること一緒。

  • 対象OS : FreeBSD 8.1-R
  • コンポーネント : net-snmp-5.5_4 , smartmontools-5.40
  • 注記 : 各コンポーネントは単体では動作が確認できていることとする)

概要手順

  • SNMPのextend機能を使用して、HDDの温度がMIB値として取得できるようにする。
  • MIB値を調べる。
  • 対象のMIB値を取得してきて、Centreon用の出力をするようにプラグインを作成。
    • これはnagiosのパフォーマンス出力とほぼ同義だ。
  • CentreonのWebUIでcommandを登録。
  • 同様に監視対象となるホストを選択して、Servicesを登録。
  • 終わり。

詳細

  • まずextend機能を使用してMIB値を登録する。
    • 以下のスクリプトを実行可能な形で作成
      • <code>#!/bin/sh

for dev in ls -t /dev/* | awk '/(ad|da)[0-9]+$/ {print $1}'; do

case $1 in
  name)       echo $dev;;
  temprature) smartctl -A $dev | awk '$1=="194" {print $10}';;
esac

done</code>

* snmpd.confにextend行を記載(今回は最終行に2行追加)。
  * <code># cat snmpd.conf | tail -2

extend ataDevice /usr/local/share/snmp/atadevicetemperature.sh name extend ataDeviceTemperature /usr/local/share/snmp/atadevicetemperature.sh temprature</code>

  • snmpdの再起動
    • # /usr/local/etc/rc.d/snmpd restart
  • MIB値の確認
    • nsExtensionsは1.3.6.1.4.1.8072.1.3なので、snmpwalkで一通り見てみる。
    • snmpwalk -v 1 -c private 127.0.0.1 .1.3.6.1.4.1.8072.1.3
      • 一部抜粋
      • NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."ataDevice" = INTEGER: 4
        NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."ataDeviceTemperature" = INTEGER: 4
        NET-SNMP-EXTEND-MIB::nsExtendResult."ataDevice" = INTEGER: 0
        NET-SNMP-EXTEND-MIB::nsExtendResult."ataDeviceTemperature" = INTEGER: 0
        NET-SNMP-EXTEND-MIB::nsExtendOutLine."ataDevice".1 = STRING: /dev/ad8
        NET-SNMP-EXTEND-MIB::nsExtendOutLine."ataDevice".2 = STRING: /dev/da0
        NET-SNMP-EXTEND-MIB::nsExtendOutLine."ataDevice".3 = STRING: /dev/da1
        NET-SNMP-EXTEND-MIB::nsExtendOutLine."ataDevice".4 = STRING: /dev/da2
        NET-SNMP-EXTEND-MIB::nsExtendOutLine."ataDeviceTemperature".1 = STRING: 36
        NET-SNMP-EXTEND-MIB::nsExtendOutLine."ataDeviceTemperature".2 = STRING: 36
        NET-SNMP-EXTEND-MIB::nsExtendOutLine."ataDeviceTemperature".3 = STRING: 33
        NET-SNMP-EXTEND-MIB::nsExtendOutLine."ataDeviceTemperature".4 = STRING: 34
    • 値にシェルスクリプトのエラー値が入っている場合は、スクリプトを見直します。
    • その後、-Onオプションを付与してOIDを数値形式で出力し、Centreon用のスクリプトに記載します。
      • snmpwalk -v 1 -On -c private 127.0.0.1 .1.3.6.1.4.1.8072.1.3
  • Centreon用のシェルスクリプト作成
    • 参考文献
    • 端的に、以下の2点が守られていればとりあえず機能する。
      • スクリプトの戻り値が、下記のいずれかであること
        • 0(=OK), 1(=WARNING), 2(=CRITICAL), 3(=UNKNOWN), 4(=DEPENDENT)
                * スクリプトのstdout(ようするにprintの出力)が、以下の形式であること
                  * <code>ぶんしょー | こんぽーねんと=値
        • 「ぶんしょー」部分は、画面出力に使用するだけ。自由に設定。
        • パイプの後ろ側はグラフを描画するときに使用。グラフの要素名=値となるように記述。複数ある場合は半角スペースで区切る。
    • 今回作成したスクリプト
      • #!/usr/bin/perl -w
        #################################################################
        #
        # Help : ./check_snmp_hddtemp_temp.pl -h
        #
        use strict;
        use Net::SNMP;
        use Getopt::Long;
        
        # Nagios specific
        use lib "/usr/local/nagios/libexec";
        use utils qw(%ERRORS $TIMEOUT);
        
        # Net-snmp hddtemp
        # ここは人によりけりだと思うので、自分で調べる。
        # 今思ったけど、tempratureの略をtempにしたのはアレだなぁ。
        my $hddtemp_lines       = ".1.3.6.1.4.1.8072.1.3.2.3.1.3.9.97.116.97.68.101.118.105.99.101";
        my $hddtemp_name        = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.9.97.116.97.68.101.118.105.99.101";
        my $hddtemp_temp        = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.20.97.116.97.68.101.118.105.99.101.84.101.109.112.101.114.97.116.117.114.101";
        
        # Globals
        my $Version=     '0.1';          # version
        my $o_host=      undef;          # hostname
        my $o_community= undef;          # community
        my $o_port=      161;            # port
        my $o_help=      undef;          # wan't some help ?
        my $o_version=   undef;          # print version
        my $o_netsnmp=   1;              # Check with netsnmp (default)
        my $o_warn=      undef;          # warning level option
        my $o_crit=      undef;          # Critical level option
        my $o_perf=      undef;          # Performance data option
        my $o_timeout=   undef;          # Timeout (Default 5)
        my $o_version2=  undef;          # use snmp v2c
        
        sub print_usage {
            print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>])  [-p <port>] -w <warn level> -c <crit level> [-f] [-t <timeout>] [-V]\n";
        }
        
        sub help {
           print "\nSNMP S.M.A.R.T. Temprature Monrotr for Nagios version ",$Version,"\n";
           print "(c)2011 ainoniwa.net\n\n";
           print_usage;
           print <<EOT;
        -h, --help
           print this help message
        -H, --hostname=HOST
           name or IP address of host to check
        -C, --community=COMMUNITY NAME
           community name for the host's SNMP agent (implies SNMP v1 or v2c with option)
        -2, --v2c
           Use snmp v2c
        -P, --port=PORT
           SNMP port (Default 161)
        -w, --warn=INTEGER | INT,INT
           warning level for memory in percent (0 for no checks)
             Default (-N switch) : comma separated level for Real Memory and Swap
             -I switch : warning level
        -c, --crit=INTEGER | INT,INT
           critical level for memory in percent (0 for no checks)
             Default (-N switch) : comma separated level for Real Memory and Swap
             -I switch : critical level
        -f, --perfdata
           Performance data output
        -t, --timeout=INTEGER
           timeout for SNMP in seconds (Default: 5)
        -V, --version
           prints version number
        EOT
        }
        
        sub isnnum {
          my $num = shift;
          if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
          return 1;
        }
        
        sub check_options {
          Getopt::Long::Configure ("bundling");
            GetOptions(
            'h'     => \$o_help,            'help'          => \$o_help,
            'H:s'   => \$o_host,            'hostname:s'    => \$o_host,
            'p:i'   => \$o_port,            'port:i'        => \$o_port,
            'C:s'   => \$o_community,       'community:s'   => \$o_community,
            't:i'   => \$o_timeout,         'timeout:i'     => \$o_timeout,
            'V'     => \$o_version,         'version'       => \$o_version,
            'f'     => \$o_perf,            'perfdata'      => \$o_perf,
            '2'     => \$o_version2,        'v2c'           => \$o_version2,
            'c:s'   => \$o_crit,            'critical:s'    => \$o_crit,
            'w:s'   => \$o_warn,            'warn:s'        => \$o_warn,
          );
          if ( defined($o_help) )
            { help(); exit $ERRORS{"UNKNOWN"}};
          if ( defined($o_version))
            { p_version(); exit $ERRORS{"UNKNOWN"}};
          if (!defined($o_host) )
            { print "No host defined!\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
          if (!defined($o_community))
            { print "Put snmp login info!\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
          if ( ! defined($o_warn) || ! defined($o_crit))
            { print "Put warning and critical values!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
          if ( isnnum($o_warn) || isnnum($o_crit))
            { print "Numeric value for warning or critical !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
          if (($o_crit!= 0) && ($o_warn > $o_crit))
            { print "warning <= critical ! \n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
          if (!defined($o_timeout)) {$o_timeout=5;}
        }
        
        check_options();
        
        # Connect to host
        my ($session,$error);
        if (defined ($o_version2)) {
          # SNMPv2 Login
          ($session, $error) = Net::SNMP->session(
            -hostname  => $o_host,
            -version   => 2,
            -community => $o_community,
            -port      => $o_port,
            -timeout   => $o_timeout
          );
        } else {
          # SNMPV1 login
          ($session, $error) = Net::SNMP->session(
            -hostname  => $o_host,
            -community => $o_community,
            -port      => $o_port,
            -timeout   => $o_timeout
          );
        }
        if (!defined($session)) {
           printf("ERROR opening session: %s.\n", $error);
           exit $ERRORS{"UNKNOWN"};
        }
        
        # Global variable
        my $resultat=undef;
        my $result=undef;
        my @data=undef;
        my $lines=undef;
        my $name=undef;
        my $output="Temprature :";
        my $n_status = "OK";
        my $NAME=0;
        my $DATA=1;
        
        ########### Net snmp memory check ############
        
        # Get NetSNMP hddtemp lines
        $resultat = $session->get_request($hddtemp_lines);
        if (!defined($resultat)) {
          printf("ERROR: get_request hddtemp_lines : %s.\n", $session->error);
          $session->close;
          exit $ERRORS{"UNKNOWN"};
        }
        
        # Get NetSNMP hddtemp data and ouput text create.
        $lines = $$resultat{$hddtemp_lines};
        while ( $lines > 0) {
          $name   = $session->get_request($hddtemp_name.".".$lines);
          $result = $session->get_request($hddtemp_temp.".".$lines);
          if ( !defined($name) && !defined($result) ) {
            printf("ERROR: get_request hddtemp_name : %s.\n", $session->error);
            $session->close;
            exit $ERRORS{"UNKNOWN"};
          }
        
          # '5' is length of '/dev/'.
          $data[$lines][$NAME] = substr($$name{$hddtemp_name.".".$lines},5);
          $data[$lines][$DATA] = $$result{$hddtemp_temp.".".$lines};
          $output             .= " ".$data[$lines][$NAME].":".$data[$lines][$DATA];
          if ($data[$lines][$DATA] > $o_crit) {
            $output .= ">$o_crit!CRITICAL";
            $n_status = "CRITICAL";
          } else {
          if ($data[$lines][$DATA] > $o_warn) {
            $output .= ">$o_warn!WARNING";
            $n_status = "WARNING";
            }
          }
          $lines--;
        }
        
          ### Perfdata Create
        if (defined ($o_perf)) {
          $output .= " | ";
          $lines = $$resultat{$hddtemp_lines};
          while ( $lines > 0) {
            $output .= $data[$lines][$NAME] ."=".$data[$lines][$DATA]." ";
            $lines--;
          }
        }
        
        ### Last Output.
        $session->close;
        print "$output \n";
        exit $ERRORS{$n_status};
management/centreon/hddtemp/start.1300173278.txt.gz · 最終更新: 2011/03/15 16:14 by yuki
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0