スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MRTG用のディスクエントリを自動生成する

MRTGの設定ファイルを生成してくれるユーティリティとして、cfgmakerがある。デフォルトではネットワークインターフェースを監視するエントリしか生成してくれないが、一緒にホスト用のテンプレートファイルを使用することで、ロードアベレージその他の項目用のエントリも生成することが可能になる。各種ルータに対応したホストテンプレートを集積したサイトもあるので、私の場合もとりあえずそういったものを利用して、若干の手修正を加えたりして設定ファイルを作成した。

ただ、ディスクパーティションの使用率に関しては、手に入れたテンプレートでは対応していなかった。これは、ディスクパーティションに関しては、SNMPで取得したリストのうちどれが監視に値するものか判断するロジックが若干面倒で、テンプレートだけでは対処しきれないということもあるようである。

極端な話、dfコマンドやmountコマンドの出力から、各ホスト毎に手編集でエントリを作成してもいいのであるが、毎回同じ作業をするのも精神的に疲れる。若干調べてみると、世の中にはcfgmakerにインスパイアされたcfgstoragemakerというパッケージもあるらしい。これをインストールすれば解決か?と思ったのであるが、そう簡単ではなかった。

確かにDebianのサイトにはソースがあるのだが、apt-cacheではcfgstoragemakerは引っかからない。とりあえずこのサイトからall.debパッケージを持ってきてインストールしてみたが、HOST-RESOURCES-MIB.txtファイルが必要で、しかもこのファイルをまた適当に探してきてインストールしてみても、結局うまくSNMPで情報が取れないようである。つまりは、SNMPで完全に環境に依存せずディスクエントリを取得するのは意外と困難であるということのようだ。

それでまあ、このcfgstoragemakerの中を見てみると、比較的簡単なperlスクリプトである。簡単とは言っても、私のperlレベルはさらに心許ないので、自分の環境で動作するようにするついでに、perlよりはまだしも馴染みのあるPythonで書き直すことにした。

とりあえず、自分の環境でしかテストしていないので、多くの人の環境では手直しがいるであろうが、作成したスクリプトをここに置いておく。

このアーカイブを展開すると、
cfgstoragemaker.py
header.tpl
body.tpl

の3つのファイルができる。インストーラなどはないので、ここで説明させていただく。

インストール
header.tpl、body.tpl の二つのテンプレートファイルを、どこかのディレクトリに置く。デフォルトでは、cfgstoragemaker.pyを実行するユーザのホームディレクトリの下のtemplatesサブディレクトリを想定している。また、cfgstoragemaker.py自体はどこかpathの通ったところに置けばよい。

もし、テンプレートを標準の場所以外のところに置いたり、名前を変える場合は、cfgstoragamaker.py中の変数tpl_dir、tpl_header、tpl_bodyの定義を書き換えてもらえばよい。(97行目近辺にある)

先に言及したDebianサイトにあるオリジナルのcfgstoragemakerのテンプレートとは互換性がないので注意してほしい。両者を混在させるならテンプレートの置き場所かファイル名を変える必要がある。

あと、cfgstoragemaker.pyが動作するためには、libsnmp-pythonパッケージが必要である。

使用方法
前提として、ディスク情報取得のためにSNMPを使用するので、対象となる各ホストではSNMPが設定され、cfgstoragemaker.py を実行するマシンからアクセスできるものとする。

cfgstoragemaker.py コミュニティ名@ホスト名 [コミュニティ名@ホスト名 ...]

として実行する。つまりcfgmakerの書式でオプション指定を省いたものである。こうすると、標準出力にそれぞれのホストから得られたディスクパーティションのうち、「有効」と判断されたもの(どういう基準で判断しているかは後述する)に対応するものが、MRTGの設定ファイルの形式で出力されるので、いったん任意のファイルにリダイレクトしていただくのがいいだろう。

例:

$ cfgstoragemaker public@host1 public@host2 > disk.cfg

そして、このファイルを、既存のmrtg.cfgファイルにアペンドして使えば良い。(念のため、mrtg.cfg のバックアップを取ることをおすすめする) 必要に応じて、mrtg.cfgを編集してエントリの順番を入れ替えるなどしてほしい。
エントリが増えるので、indexmakerを再実行する必要があるだろう。

$ sudo cp /etc/mrtg.cfg /etc/mrtg.cfg.back
$ sudo cat /etc/mrtg.cfg disk.cfg > mrtg.cfg.new
$ sudo cp /etc/mrtg.cfg.new /etc/mrtg.cfg
$ sudo indexmaker /etc/mrtg.cfg > /var/www/mrtg/index.html

以下、細かいコメント。
オリジナルのcfgstoragemakerからの主な相違点

1. Pythonで書かれている(明らかに)。内部では、SNMPで得られたディスクパーティションを表すSnmpPartitonというクラスを定義している。PythonのSNMPモジュールを利用して、得られたパーティションをこのクラスのオブジェクトとしてリストにし、そのうち有効(isValid()メソッドが真となるもの)だけを選んで、その情報を用いてテンプレートの変数を置換して標準出力に書き出している。最終的に使用していないプロパティなども若干定義されているが気にしないように。

2. SNMPで情報を取得するMIBツリーを、オリジナルの.1.3.6.1.2.1.25.2.3.1から、.1.3.6.1.4.1.2021.9.1に変更した。これは前者は手持ちのDebian系Linuxではうまく情報が取れない部分があったからである。後者は後者で、パーティションの「タイプ」情報が取れないという問題はあったが、この情報は実際には「デバイス」と事実上同じものが帰ってくる実装のようなので、気にしないことにした。また、特定のMIBファイルがインストールされていることを前提とせず、数値表現でOIDを参照している。SNMPによる問い合わせ結果も数値でOIDが表示されるように、セッション作成時にオプション指定をしている。

3. 監視対象のデータを、使用バイト数ではなく、使用パーセンテージとした。また同時に、iノードの使用パーセンテージも監視している。ディスクの場合、システム監視の観点からはパーセンテージの方が重要と考えたためであるが、(900G使用中、より93%使用中、の方が直感的という観点である)バイト数を監視したければ、body.tplを編集して、OIDを

.1.3.6.1.4.1.2021.9.1.9.$index -> .1.3.6.1.4.1.2021.9.1.8.$index

とし、Optionsからnopercentを外せばいいだろう。

あと、SNMPで取得したディスクパーティションのうちどのようなものを有効と判断しているかであるが、

0. SNMPツリーでのインデックスが正であり、
1. 容量が正の値であり、
2. デバイス名が'/'で始まり('rootfs'だけはこの限りでない)、
3. さらにデバイス名がSnmpPartitionクラスのexcludesリストにあるものに一致しないこと

である。excludesリストは単に手元のマシンでの観察から、

('sysfs', 'proc', 'none', 'udev', 'devpts', 'tmpfs', 'cgroup', 'rpc_pipefs', 'gvfsd-fuse')

となっている。必要に応じて書き換えていただきたい。

最後に配布については、オリジナルのスクリプトがGPLバージョン2に従っているので、このスクリプトも一応同じとしておく。

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

GM3D

Author:GM3D
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。