Pandora: Documentation ja: Anexo Integracion con HP Network Node Manager

From Pandora FMS Wiki
Jump to: navigation, search

Pandora FMS ドキュメント一覧に戻る

1 Pandora FMS と HP Network Node Manager (SNMP) の連携

Pandora FMS は、HP Network Node Manager (NNM) と同時に利用することができ、Pandora FMS で収集した重要なイベントを全体のシステムを管理している HP OpenView Network Node Manager へ伝えることができます。Pandora FMS でいくつかの環境の監視を行っており、重要なイベントのみ NNM などの他の監視システムに送るのに便利です。

Pandora FMS のアラート処理は、特定のデータを SNMP トラップを通して外部に送る場合、とても柔軟に対応できます。これは、データを統合するための仕組みとなります。引数に応じて特手のトラップを生成するスクリプトを作成すれば、トラップを Network Node Manager で管理することができます。

1.1 NNM の設定

最初に、Pandora FMS が生成するイベントの重要性に基づいた分類リストを用意します。5つの重要度レベル (正常、警告、マイナー、メジャー、障害) を元に用意します。これらの 5つの種類のイベントを特定の OID に関連づけます。この場合、1.3.6.1.4.1.24800.251 から 1.3.6.1.4.1.24800.255 です。これらは、5つのカテゴリのイベントに関連づけた OID です。

Nnm event config.jpg

1.2 Pandora FMS の特別なエージェントの作成

異なるパラメータのアラート設定にて、アラートを NNM へエクスポートすることができます。そのためには、次のようにアラートを作成します。

Nnm snmp.jpg

1.3 SNMP トラップ 生成スクリプト

このアラートが呼び出す スクリプト の詳細を以下に示します。これは、モジュールを実行したサーバによって呼び出されます。

  #!/bin/bash
  
  HOST=`hostname`
  ESPECIFIC_OID=$1              #  _field1_ pandora
  ERROR=$2                      #  _field2_ pandora
  DESCRIPCION=$3                #  _field3_ pandora
  HOST_DESTINO=nnm
  COMMUNITY=public
  ENTERPRISE_OID=.1.3.6.1.4.1.24800
  WARNING=0
  MINOR=1
  MAJOR=2
  CRITICAL=3
  NORMAL=4
  MAXL=2000
  DIR=`dirname $0`
  LOGFILE="$DIR/`basename $0 | awk -F'.' '{print $1}'`.log"
  CONF="$DIR/`basename $0 | awk -F'.' '{print $1}'`.conf"
 
  truncate_log()
  {
    typeset    LOG=$1
    typeset    LINES=$2
    typeset    TMP1=/tmp/$PRG.tmp1
  
    if [[ -z "$LINES" || -z "$LOG" ]] ; then
      echo  "$PRG: truncate_log(): Parametros incorrectos -> [$LOG] [$LINES]"
      return
    fi
  
    if [ ${LINES%[kK]} != $LINES ] ; then # Log binario, truncamos con dd
  
     LOGSIZ=$(du -k $LOG | awk '{print $1}')
     MAXSIZ=${LINES%[kK]}                # Eliminamos caracter 'k' final
     typeset -i SKIP                     # Nm. de bloques de 1K a obviar
                                         # Ver comando 'dd' abajo
  
     if [[ $LOGSIZ -gt $MAXSIZ ]] ; then
        echo  -n "$LOG : Truncando a $MAXSIZ Kbytes ..."
        (( SKIP = LOGSIZ - MAXSIZ ))
        dd if=$LOG of=$TMP1 bs=1040 skip=$SKIP
        if [[ $? -eq 0 ]] ; then
         #
         # Vaciado de $LOG
         #
         >$LOG
         if [[ $? != 0 ]] ; then
           echo  "$PRG : Error vaciando fichero $LOG"
           return
         else
           cat $TMP1 >>$LOG
           if [[ $? != 0 ]] ; then
             echo  "Error rellenando $LOG"
             return
           fi
           echo  'OK!'
           >$TMP1
         fi
       else
         echo  "Error en comando 'dd if=$LOG of=$TMP1 bs=1024 skip=$SKIP'"
       fi
     fi
   else                                  # Log ASCII, truncamos con tail
     NUMLIN=$(wc -l <$LOG)
     if [[ $NUMLIN -gt $LINES ]] ; then
       echo -n "$LOG : Truncando a $LINES lineas ..."
       (( NUMLIN -= LINES - 1 ))
       tail +$NUMLIN $LOG >$TMP1
       if [[ $? -eq 0 ]] ; then
         #
         # Vaciado de $LOG
         #
         >$LOG
         if [[ $? != 0 ]] ; then
           echo  "$PRG : Error vaciando fichero $LOG"
           return
         else
           cat $TMP1 >>$LOG
           if [[ $? != 0 ]] ; then
             echo  "Error rellenando $LOG"
             return
           fi
           echo  'OK!'
           >$TMP1
         fi
       else
         echo  "Error en comando 'tail +$NUMLIN $LOG >$TMP1'"
       fi
     fi
   fi
   rm -f $TMP1
  }       # truncate_log()
  #
  # MAIN
  #
   #
   # Crea log si no existe
   #
  [ ! -f $LOGFILE ] && touch $LOGFILE
  
  for linea in `cat $CONF | grep -v "^#"`
  do
    if [ ! -z `echo $linea | grep "HOST"` ]
    then
      HOST_DESTINO=`echo $linea | grep "HOST" | awk -F'=' '{print $2}'`
    elif [ ! -z `echo $linea | grep "COMMUNITY"` ]
    then
      COMMUNITY=`echo $linea | grep "COMMUNITY" | awk -F'=' '{print $2}'`
    elif [ ! -z `echo $linea | grep "ENTERPRISE_OID"` ]
    then
      ENTERPRISE_OID=`echo $linea | grep "ENTERPRISE_OID" | awk -F'=' '{print $2}'`
    elif [ ! -z `echo $linea | grep "WARNING"` ]
    then
      WARNING=`echo $linea | grep "WARNING" | awk -F'=' '{print $2}'`
    elif [ ! -z `echo $linea | grep "MINOR"` ]
    then
      MINOR=`echo $linea | grep "MINOR" | awk -F'=' '{print $2}'`
    elif [ ! -z `echo $linea | grep "MAJOR"` ]
    then
      MAJOR=`echo $linea | grep "MAJOR" | awk -F'=' '{print $2}'`
    elif [ ! -z `echo $linea | grep "CRITICAL"` ]
    then
      CRITICAL=`echo $linea | grep "CRITICAL" | awk -F'=' '{print $2}'`
    elif [ ! -z `echo $linea | grep "NORMAL"` ]
    then
      NORMAL=`echo $linea | grep "NORMAL" | awk -F'=' '{print $2}'`
    elif [ ! -z `echo $linea | grep "LOG"` ]
    then
      LOG=`echo $linea | grep "LOG" | awk -F'=' '{print $2}'`
    else
      LINEA=`echo $linea`
    fi
  done
 
  if [ "$ERROR" = "WARNING" ]
  then
     ESPECIFIC_OID=`expr $ESPECIFIC_OID + $WARNING`
  elif [ "$ERROR" = "MINOR" ]
  then
     ESPECIFIC_OID=`expr $ESPECIFIC_OID + $MINOR`
  elif [ "$ERROR" = "MAJOR" ]
  then
     ESPECIFIC_OID=`expr $ESPECIFIC_OID + $MAJOR`
  elif [ "$ERROR" = "CRITICAL" ]
  then
     ESPECIFIC_OID=`expr $ESPECIFIC_OID + $CRITICAL`
  elif [ "$ERROR" = "NORMAL" ]
  then
     ESPECIFIC_OID=`expr $ESPECIFIC_OID + $NORMAL`
  else
    if [ $LOG ]
    then
      echo ""
      echo " ----  Error. Nivel de error $ERROR no especificado ---- "
      exit 1
    fi 
  fi
 
  #echo "$WARNING $MINOR $MAJOR $CRITICAL $NORMAL"
  #echo "$COMMUNITY $HOST_DESTINO $ENTERPRISE_OID $HOST $ESPECIFIC_OID $DESCRIPCION"
 
  if [ $LOG ]
  then
    echo ""
    echo ""
    echo "COMMUNITY=$COMMUNITY ENTERPRISE_OID=$ENTERPRISE_OID ESPECFIC_OID=$ESPECIFIC_OID DESCRIPCION=$DESCRIPCION" >> $LOGFILE
    echo "/usr/bin/snmptrap -v1 -c $COMMUNITY $HOST_DESTINO $ENTERPRISE_OID $HOST 6 $ESPECIFIC_OID ''  $ENTERPRISE_OID.0 s '$DESCRIPCION'" >> $LOGFILE
  fi
 
  /usr/bin/snmptrap -v1 -c $COMMUNITY $HOST_DESTINO $ENTERPRISE_OID $HOST 6 $ESPECIFIC_OID ''  $ENTERPRISE_OID.0 s "$DESCRIPCION"
 
  if [ $? -eq 0 ]
  then
    echo "Ejecucion correcta" >> $LOGFILE
    echo ""
  else
    echo "No se ha ejecutado correctamente" >> $LOGFILE
    echo ""
  fi
 
  # 
  # Trunca el fichero de log si supera MAXL lineas
  #
  truncate_log $LOGFILE $MAXL
 

1.4 モジュール上でのアラートの利用

モジュールでのアラートの利用および設定画面例を示します。

field1 フィールドは、OID に利用され、アラームがどの種類に属するかを示します。(この場合、Pandora のために NNM で常に 251 を指定しています。) field2 フィールドは、定義された重要度レベルを示します。(MAJOR は、trap を送信するときに、OID を生成するために 251 へ追加される名前です。) field3 フィールドは、アラームの説明です。

Nnm alert config1.jpg

1.5 NNM でのデータ参照

以下に、Pandora FMS からのイベントを表示している最終的な Network Node Manager コンソール画面を示します。

Nnm console.jpg