SNMP トラップを管理する

紅葉の時期になってまいりました。

この時期、NPB ではCS ~ 日本シリーズなんですが、私の愛するチームは今年は、、、逃しました。。。(泣)
ドラフトで新戦力確保で来年に向けて一から出直しです。
(・・・私が打ったり投げたりするわけじゃないんですが、、)

さて、お仕事の話をしましょう。

インフラの仕事って開発系の業務に比べると地味で、なかなか人に伝えるのにも何て伝えたらいいのか迷ってしまう時があります。
分かりやすい面でお話ししますと、ネットワーク機器やサーバ類の設定を考えたり、検証したり、実際に設定したりすること、、、になるんでしょうか。
しかし、多くはそれらを管理するためのドキュメントを起こすことにも費やされるのかなと思います。

そんな中、インフラ技術の中の一つに機器を監視するための仕組みとして SNMP というのがあるんですが、皆さん SNMP トラップってどうやって管理してます??
ポーリング(REQUEST)に関しては、監視機器上での設定をそのままドキュメントに起こせばよいと思いますが、トラップって取るには取るんだけど、機器から勝手に飛んでくるし何飛んでくるか把握してなくて、 human-readable ではない OID だけ表示される状態で垂れ流し、、、

・・・まあテキトーでいいか・・・なんて 状況はよくありがちです。

トラップもちゃんと管理しましょうね!

SNMPトラップ

取り扱った経験の無い方に SNMP のアーキテクチャについて簡単に説明しますと

  • REQUEST

  • マネージャ(監視システム等)からエージェント(各機器)方向に状態を取りに行く

  • TRAP

  • エージェント(各機器)からマネージャ(監視システム等)方向に状態遷移や障害をイベント発生時に知らせる

    と大きく2つに分類されます。

    よく、CPU 使用率やディスク、ネットワーク帯域の使用状況をグラフ化した監視システムなんかは、前者の仕組みで定期的(一般的に 5 分毎等の間隔)に各機器上保持している値を取りにいくことで、それを可視化しているわけです。

    ここで言う「値」の種別は MIB (管理情報の集合体:一般的に「ミブ」と言っています) 上で定義された階層化された OID (”.1.3.6.1.2.1.2.2.1.10″ みたいな数字の羅列)によって識別されます。

    今回の観点は後者。
    ネットワークインターフェースのリンクアップ・ダウン等、標準MIBで定義された一般的なトラップというのは存在しますが、プライベート MIB(いわゆるベンダ MIB)については機器ベンダが様々で、機器固有のトラップとして何が定義されているかはその機器の仕様によります。

    導入した機器のマニュアルに一覧が掲載されていたり親切なベンダもあるのですが、定義ファイル(MIB ファイル)だけ提供しているところもあったりで様々です。
    詳細設計で運用管理に使用するためにドキュメント化する場合、これらを調査して一覧化、、、なかなか大変ですね。
    (やってます?? 少なくとも オモイヤリ設計 がモットーのワタクシならやりますよ)

    そんなドキュメンテーションの補助用途として、簡単なスクリプトを作成してみました。

    SNMPTT で MIB ファイルから snmptt.conf へコンバート

    SMMP トラップを扱うのに必ず使用するのが SNMPTT ですね。

    http://snmptt.sourceforge.net/

    ZABBIX 等、監視マネージャ用途のサーバ上に導入して、snmptt.conf は監視マネージャのアプリケーション上で取り扱えるように出力フォーマット等を定義したファイル・・・
    ・・・まあトラップメッセージの実態ファイルです。

    各所から掻き集めた MIB ファイルがこんな感じでサーバ上にあります。
    ※ 依存性は全てコンパイルできているものとします。

    snmptt.conf ファイル出力用のディレクトリ(ない場合作って)配下で作業します。

    各 MIB ファイルを “snmpttconvertmib” コマンドを使って以下のようなファイル命名ルールの snmptt.conf にコンバートしてみます。

            snmptt.conf.<オリジナルの MIB ファイル名>.org

    ※ フォーマットを後で変更しようと思うので、末尾に “.org” をつけたファイルにします。

    ワンライナーで一括でやっちゃいますか!

    MIB ファイルからこんな感じの snmptt.conf ファイルができました。
    ※ 例:IF-MIB

    今回は ZABBIX で使うことを想定して、”FORMAT” 部分をゴニョゴニョ変更します。
    ※ FORMAT については SNMPTT のマニュアル参照
    http://snmptt.sourceforge.net/docs/snmptt.shtml#SNMPTT.CONF-FORMAT

    またワンライナーでやりますね。

    すると FORMAT 部分が書き換わった内容が、先ほどのファイルから “.org” が外れたファイルとして出来上がります。

    トラップ自体が定義されていない MIB もありますので、そういったファイルは捨てることとします。

    コンバートされた全ファイル数

    “ZBXTRAP” の文字列が存在しない(トラップ定義のない)ファイルのみを削除

    削除後の snmptt.conf ファイル数(だいぶ整理できました)

    snmptt.ini ファイルにこれらファイルのパスを追記すれば、各 snmptt.conf ファイルに定義されたフォーマットでトラップが出力されます。

    だいたいここぐらいまでは(手順はそれぞれと思いますが)構築の流れでやりますよね。

    snmptt.conf の内容を CSV ファイルに変換する

    これらファイルと内容を一覧にするためのシェルスクリプトを紹介します。

    スクリプト名は “list_snmp_trap.sh” とでもしておきましょうか。
    ウーン地味。。。ですが、実用性って大事です!
    スクリプトのメイン機能自体はすぐ作れる簡単なものですが、ヘルプとかもちゃんと入れてみました。(オモイヤリポイント)

    snmpttのマニュアルによると “SDESC” ~ “EDESC” 部分は必ずあるわけではなくオプション扱いとなっているようですので、若干変則のループ処理になっています。
    http://snmptt.sourceforge.net/docs/snmptt.shtml#SNMPTT.CONF-SDESC

    list_snmp_trap.sh

    使い方

        ./list_snmp_trap.sh <snmptt.conf ファイルが配置されたデイレクリパス>

  • 引数に指定されたデイレクトリ配下のファイル全てに対して一括処理します。
  • Stdout に出力されますので、適当なファイルにリダイレクトします。
  • EVENT, FORMAT, DESCRIPTION(SDESC ~ EDESC)部分が出力されます。※
  •  ※ DESCRIPTION 内の “Variables:” 部分は除く(文が長すぎる場合があるため)

    結果

    実行しますと下記のような内容のファイルができます。

    では、表計算ソフトで表示してみましょう。

    一覧ができましたねえ。
    そのまま詳細設計書や、運用管理ドキュメントの元ネタに使用できます。

    終わりに

    大変地味なトピックとなりましたが、(インフラの仕事って地味な作業多いんです)実は、表計算ソフト上で severity やフォーマットを編集して CSV から snmptt.conf ファイルを逆コンバートするスクリプトも作成してます。
    こちらは、またの機会に!

    一連の動作を簡単な Web CGI なんかで動作させれば、簡易的な SNMP トラップ管理ユーティリティとして使うようなアイデアもありますよね!
    ※ この障害のトラップは影響度が高く、管理者へメールする対象にしたいから WEB UI から severity を “Critical” に変える、、とかそういったイメージ。
    システムソリューション部の優秀な方々、(新人教育の一環でもいいから)誰か作ってちょ!!

    インフラエンジニアってラック建てたり LAN ケーブル張ったり、機器設置する物理作業から、こういったちょっとした工夫のためのスクリプト書いたり、物理から論理まで幅が広くて楽しいですよ!

    この記事を書いた人

    渡邉 浩康

    長野県 長野市出身

    好きなもの:

    古いもの、古い場所、地図、音楽(60's~70's プログレとか)、ストラトキャスター、つげ義春とかの漫画、野球(星の球団)、赤5筒、納豆、冷奴(木綿豆腐)、秋刀魚、蕎麦、茹で卵、心太、お酒

    あせらず、楽しく、のんびりいきましょう。