差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
management:centreon:hddtemp:start [2011/03/15 15:05]
yuki
management:centreon:hddtemp:start [2021/09/04 20:44]
yuki 削除
ライン 1: ライン 1:
 ====== HDDの温度監視 ====== ====== HDDの温度監視 ======
-HDDの温度をCentreonに監視させて、グラフを書く。+HDDの温度をCentreonに監視させて、グラフを書く。前半はNagiosとやること一緒
  
 <note important>​ <note important>​
ライン 16: ライン 16:
   - CentreonのWebUIでcommandを登録。   - CentreonのWebUIでcommandを登録。
   - 同様に監視対象となるホストを選択して、Servicesを登録。   - 同様に監視対象となるホストを選択して、Servicesを登録。
-  - 終わり。+  - Nagios再起動して終わり。
  
 ===== 詳細 ===== ===== 詳細 =====
  
-  * まずextend機能を使用してMIB値を登録する。+==== 1.SNMPの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) /​usr/​local/​sbin/​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/​ata_device_temprature.sh name 
 +extend ataDeviceTemperature /​usr/​local/​share/​snmp/​ata_device_temprature.sh temprature</​code>​ 
 +  * snmpdの再起動 
 +    * <​code>#​ /​usr/​local/​etc/​rc.d/​snmpd restart</​code>​ 
 + 
 +==== 2.MIB値の確認 ==== 
 + 
 +  * nsExtensionsは1.3.6.1.4.1.8072.1.3なので、snmpwalkで一通り見てみる。 
 +    * http://​www.oidview.com/​mibs/​8072/​NET-SNMP-AGENT-MIB.html 
 +  * コマンド結果を一部抜粋 
 +    * <​code>#​ 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</​code>​ 
 +  * 値にシェルスクリプトのエラー値が入っている場合は、スクリプトを見直します。 
 +  * その後、-Onオプションを付与してOIDを数値形式で出力し、Centreon用のスクリプトに記載します。 
 +    * <​code>#​ snmpwalk -v 1 -On -c private 127.0.0.1 .1.3.6.1.4.1.8072.1.3</​code>​ 
 + 
 +==== 3.Centreon用のシェルスクリプト作成 ==== 
 + 
 +  * 参考文献 
 +    * http://​nagiosplug.sourceforge.net/​developer-guidelines.html 
 +    * http://​junrei.dip.jp/​wordpress/​nagios/​nagios%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3/​ 
 +  * 端的に、以下の2点が守られていればとりあえず機能する。 
 +    * スクリプトの戻り値が、下記のいずれかであること 
 +      * <​code>​0(=OK),​ 1(=WARNING),​ 2(=CRITICAL),​ 3(=UNKNOWN),​ 4(=DEPENDENT)</​code>​ 
 +    * スクリプトのstdout(ようするにprintの出力)が、以下の形式であること 
 +      * <​code>​ぶんしょー | こんぽーねんと=値</​code>​ 
 +      * 「ぶんしょー」部分は、画面出力に使用するだけ。自由に設定。 
 +      * パイプの後ろ側はグラフを描画するときに使用。グラフの要素名=値となるように記述。複数ある場合は半角スペースで区切る。 
 +  * 今回作成したスクリプト 
 +    * <​code>#​ cat check_snmp_hddtemp.pl 
 +#​!/​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 
 +   ​warning level for temprature 
 +-c, --crit=INTEGER 
 +   ​critical level for temprature 
 +-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_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};</​code>​ 
 + 
 +  * CentreonにCommand登録する前に、手元で動作確認しておいたほうがいいよ 
 +    * <​code>​./​check_snmp_hddtemp.pl -H 127.0.0.1 -C private -w 46 -c 50 -f</​code>​ 
 + 
 +==== 4.CentreonにCommandの登録 ==== 
 + 
 +  * 言葉だけ。 
 +  * Configuration -> Commands -> Add 
 +    * Command Name(自由に) 
 +      * <​code>​hddtemp</​code>​ 
 +    * Command Line(動作確認用のコマンドと同じになるように) 
 +      * <​code>​$USER1$/​check_snmp_hddtemp.pl -H $HOSTADDRESS$ -C $USER2$ -w $ARG1$ -c $ARG2$ -f</​code>​ 
 +      * $USER1$,​$USER2$は、Configure -> Nagios -> resourcesに設定されてる。 
 +      * $HOSTADDRESS$は、Centreonの設定項目から自動的に引っ張ってくる。 
 +        * 異なるホストを監視するのに、Command2つ作るのは面倒でゲソ。 
 +      * $ARG1$,​$ARG2$は、下記のArgument Exampleに示す値を、Services設定時に入れる。 
 +        * 監視ホストによって値を変えたくなるでゲソ? 
 +    * Argument Example 
 +      * 空でもいいけど、$ARGn$に入る値の書き方を示すので書いていたほうがいい。 
 +      * "​!"​で区切って、順次$ARGn$($ARG1$,​$ARG2$...)に代入されるよ。 
 +      * <​code>​!46!50</​code>​ 
 +    * $HOSTADDRESS$ 
 +      * 空でいい 
 +    * Command Type 
 +      * とりあえず"​Check"​ 
 +    * Graph template 
 +      * 空でいい 
 + 
 +==== 5.Centreonに監視Servicesの登録 ==== 
 + 
 +  * Configuration -> Services -> Add 
 +    * Description : 適当な名前 
 +    * Service Template : generic-service 
 +      * 別にこれでなくてもいいけど。 
 +    * Check Command : hddtemp 
 +      * さっき作った名前 
 +    * Args : 青い矢印クリック 
 +      * さっき作った"​!46!50"​が入力されるよ。 
 +    * Relations(上のタブにあるでゲソ) 
 +      * Linked with Hosts : 対象ホストを選択してAdd 
 +  * Saveして終わり。 
 + 
 +==== 6.Nagiosの再起動 ==== 
 + 
 +  * Configuration -> Nagios 
 +  * 下記2つにチェックを追加して、"​Export"​ 
 +    * Move Export Files 
 +    * Restart Nagios 
 + 
 +==== 7.動いてる図 ==== 
 + 
 +{{:​image:​centreon:​centreon_hddtemp_02.png|}} 
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0