2021年12月20日月曜日

【Checkmk KB】Checkmkプラグイン開発:プライベートMIB監視《バッファロー TeraStation》

 Checkmkでは、標準機能に加えて独自で作成したプラグインにより監視対象・監視内容を自由に拡張することができます。この記事では、Buffalo(バッファロー)の法人向けNAS:TeraStationを監視対象として「Checkmk」での独自プラグイン作成方法をご紹介します。

文:ジュピターテクノロジー とぐち


はじめに

Checkmkには公式プラグインが多数用意されていますが、もちろん対応していない機器も存在します。そういった場合は、独自に専用プラグインを開発してみましょう。

今回はBuffalo(バッファロー)TeraStationシリーズの監視についてご紹介したいと思います。


開発する前に

  • TeraStationのSNMP有効化

TeraStationの監視にあたり、TeraStationのSNMP機能を有効化する必要があります。手順は以下の記事リンクより同項目を参照し、設定してください。

「バッファローTeraStationを『PRTG』でかんたん監視!」

こちらの記事では弊社監視製品PRTG Network Monitorでの監視方法をご紹介しております。今回の記事ではCheckmkのプラグイン開発を通して、同等の項目を監視していきます。

SNMP有効化が完了しましたら、次の手順へ進んでください。


  • TeraStationを監視対象に追加

Buffalo TeraStationをホスト登録してください。

ホスト登録の詳細は過去の記事「【Checkmk ビギナーズガイド】(2)ネットワーク機器のSNMP監視」をご参照ください。今回は抜粋して説明します。

図1


Hostname, IPアドレスに任意の値と、下記の設定を入力します。

・Checkmk agent/API integrations : No API integrations, no Checkmk agent

・SNMP : SNMP v2 or v3

・SNMP credentials 

        SNMP community (SNMP Versions 1 and 2c)

        コミュニティ名はTeraStation

Save & go to service configurationボタンをクリックし、サービス取得画面へ遷移します。ここでサービスが何も取得されなかった場合は入力内容に問題がありますので、ホスト追加画面に戻り、「Save & go to connection tests」で接続テストを行い情報を修正してください。

図2

接続が正常であれば、図2のようにSNMPエージェントが複数のサービスを候補として自動取得し表示します。ここから、必要なサービスを追加してください。例では全て追加しますので、「Fix all」ボタンをクリックします。


追加されたサービス

・CPU 使用率(CPU utilization)

・ファイルシステム使用率(fs /pass/):対象は自動で複数選出

・SNMPトラフィック(Interface 3):使用しているもののみ選出

・メモリ情報(Memory used)

・機器情報(SNMP Info)

・起動時間(Uptime)

これらは、一般的なSNMPエージェントが取得できる標準MIBの内容です。

ここにはないシステム情報やディスク情報を監視するにはプライベートMIB内容を監視しなければなりません。そのためには、Checkmkが公式サポートしているプラグインを使用するか、または独自にプラグインを作成する必要があります。


プライベートMIB監視

それでは、バッファローTeraStationのプライベートMIB内容を取得するべく、さっそくCheckmkのプラグインを作成してみましょう。


  • SNMPwalkを実施する

「sudo su - サイト名」でCheckmkサイトのコマンドラインに切替え、以下のコマンドでSNMPwalkを実施します。デバイス名は、ホスト登録時に入力したデバイス名です。

コマンド例では、サイト名を「mysite」,デバイス名を「TeraStationTS5410」とします。


checkmk@checkmk:$ sudo su - mysite

OMD[mysite]:$  cmk -v -- snmpwalk TeraStationTS5410


すると、図3のようなwalk結果が以下のパスにデバイス名で保存されます。各行にはOIDとその値が記載されています。

/opt/omd/sites/mysite/var/check_mk/snmpwalks/TeraStationTS5410

図3


ここまでは、SNMPwalkをかけてこのデバイスで監視できるOIDのリストを取り出す作業です。監視したいOIDがここに含まれているか確認してください。

必要なOIDが決定したら、実際にプラグインを開発していきます。

サービスに追加したいOIDは以下の通りです。


・TeraStation Array:1.3.6.1.4.1.5227.27.1.3.1

・TeraStationDisk:1.3.6.1.4.1.5227.27.1.2.1

・nas error index:1.3.6.1.4.1.5227.27.1.4.1.1

・nas information index:1.3.6.1.4.1.5227.27.1.5.1.1

 

こちらは、「バッファローTeraStationを『PRTG』でかんたん監視!」の記事で紹介している中からプライベートMIBに関するものを選出しています。

今回は、代表して1つ目の「TeraStation Array」をサービスとして一覧に追加する際の開発手順を説明していきます。


  • プラグインを開発する

まずはプラグインの格納場所へ移動し、任意のチェック名でファイルを作成してください。ここではチェック名を「buffalo_snmp_array.py」とします。

独自プラグイン格納場所

 /opt/omd/sites/mysite/local/lib/check_mk/base/plugins/agent_based


チェックファイルを作成したら、中にチェック内容を記載していきます。 以下の図4~図10までは同じファイル内に記載してください。


図4

図4の通り必要な定義をインポートします。今回はこの2行ですが、必要なものが他にある場合は追加でインポートしてください。


図5

図5の「register.snmp_section」ではOIDを指定していきます。

name: プラグイン名

detect: exists()に指定している内容は、SNMPwalkで取得したファイル1行目の機器情報のOIDです。

fetch: 値を取得したいOIDを指定します。OIDEnd()は可変値であることを示しています。TeraStation Array(1.3.6.1.4.1.5227.27.1.3.1)の下に保持する情報(id, status, capacity, used情報)を取得するためのOIDを指定しています。


図6

図6「parse_buffalo_snmp_array()」ではテーブルに値を入れ、print()で表示しています。print()の行は、値が取れているかデバッグ用にWebGUIのコンソール上で確認するためのもので、サービス取得画面に表示されます。(図7)不要であれば記載する必要はありません。
図7

図8


図8「discover_buffalo_snmp_array()」を記載すると、サービス取得時(サービスディスカバリー実行時)にサービスとして一覧に並びます。


図9


図9「check_buffalo_snmp_array()」では細かいチェック内容を記載します。

「yield Result()」に記載した内容が、WebGUI上でサービス取得した際に、状態(UP/DOWN)とSummary欄に表示されます。

図10

図10「register.check_plugin()」でCheckmkプラグインとして登録していきます。

name:プラグイン名

service_name:並べたいサービス名 

discovery_function:図8で作成したモジュール

check_function:図9で作成したモジュール


プラグインの説明は以上です。編集内容を保存し、対象のプラグインに実行権限を付与してください。


<buffalo_snmp_array.py>

from cmk.base.plugins.agent_based.agent_based_api.v1 import *

from pprint import pprint


def parse_buffalo_snmp_array(string_table):

  section = []

  for line in string_table:

      id = int(line[0])

      if id != 0:

          section.append(line)


  print ("--", string_table, "--")

  return section


register.snmp_section(

  name = "buffalo_snmp_array",

  detect = exists(".1.3.6.1.2.1.1.1.0"),

  parse_function=parse_buffalo_snmp_array,

  fetch = SNMPTree(

    base = '.1.3.6.1.4.1.5227.27.1.3.1',

    oids = [

      OIDEnd(), #id

      '2', #nas array status

      '3', #nas array capacity

      '4', #nas array used

      ],

     ),

  )


def discover_buffalo_snmp_array(section):

    for line in section:

        yield Service(item=line[0])


def check_buffalo_snmp_array(item, section):

    for id, status, capacity, used in section:

        if id == item:

            capacity = int(capacity)

            used = int(used)

            if status == "-1":

                s = State.CRIT

                text = "Not Support"

                capacity = "0"

                used = "0"

            else:

                s = State.OK

                if status == "1":

                    text = "off"

                    capacity = "0"

                    used = "0"

                elif status == "2":

                    text = "RAID 0"

                elif status == "3":

                    text = "RAID 1"

                elif status == "4":

                    text = "RAID 5"

                elif status == "5":

                    text = "RAID 6"

                elif status == "6":

                    text = "RAID 10"

                elif status == "7":

                    text = "RAID 50"

                elif status == "8":

                    text = "RAID 51"

                elif status == "9":

                    text = "RAID 60"

                elif status == "10":

                    text = "RAID 61"

            yield Result(state = s, summary = f"{text}, Capacity:{capacity} GB, {used}% used")

            return


register.check_plugin(

        name="buffalo_snmp_array",

        service_name="Custom_TeraStationArray %s",

        discovery_function=discover_buffalo_snmp_array,

        check_function= check_buffalo_snmp_array,

        )


  • サービスを再取得する
図11


WebGUIにログインし、サービスを再取得します。

図11のように「Undecided services」欄に作成したプラグイン「buffalo_snmp_array.py」からつくられたサービス、Custom_TeraStationArray1、Custom_TeraStationArray2のサービスが取得できていることがわかります。


同じ要領で、Array以外のOIDもプラグインを作成しています。

・TeraStation Array:1.3.6.1.4.1.5227.27.1.3.1

・TeraStationDisk:1.3.6.1.4.1.5227.27.1.2.1

・nas error index:1.3.6.1.4.1.5227.27.1.4.1.1

・nas information index:1.3.6.1.4.1.5227.27.1.5.1.1


「Fix all」ボタンをクリックし、モニター画面から見てみましょう。


追加後のモニター画面がこちらです。「Custom_xxxx」というものがプラグインで追加したサービスです。(図12、13)

図12
図13



  • プラグインのデバッグ方法

プラグイン作成時は、Checkmkサイトユーザーに変更し、以下のコマンドでデバッグを行うことができます。太字箇所は、プラグイン名、デバイス名で読み替えて使用してください。


checkmk@checkmk:$ sudo su - mysite

OMD[mysite]:$  cmk --detect-plugins=buffalo_snmp_array.py --debug -vvnII TeraStationTS5410


正常に作成できている場合、図14のような結果が表示され、「SUCCESS」の文字を確認することができます。

図14

エラーの場合は図15のような結果が表示されるため、最後の行を確認し、ソースファイルを再編集してください。

図15


デバッグ時は必ずサイトユーザーで実行してください。「cmk」コマンドはサイトユーザーで実行可能なコマンドで、「cmk」のみで実行するとヘルプが表示されますので、状況にあわせてぜひご活用ください。


お問合せ

Checkmkにご興味のある方は、以下のリンクから弊社までお問い合わせください。
オンラインデモでは、Checkmkの操作感を体感いただくことができます




30日間無償でご利用いただける評価版も以下のダウンロードページにご用意しております。
簡単に検証が開始できますので、評価ガイド(PDF)を参考にぜひお試しください。