ZABBIX SENDER を利用したAutoDiscoveryの方法
初めまして。yutukiと申します。
早速ですが掲題の件に関して相談させて下さい。
■環境
64bit Ubuntu 14.04 インストールしたZABBIX Server 3.02 とZABBIX Sender 3.02
■やりたい事
ZABBIX上のホストサーバ名「VPNMonitoring」に、多数のVPNの接続状況を監視項目として自動登録したい。
VPNの数は変動する為、個々をTemplateのアイテムとして登録したくない。
その為AutoDiscoveryとアイテムのプロトタイプを利用して自動で監視項目が増える様にしたい。
■やった事
http://www.slideshare.net/takeshiyamane9/lld-zabbix
こちらの資料を元にZABBIX Senderを使ってAutoDiscoveryの設定をやってみましたがうまくいかない状態です。
なおSender側のプログラムはpython3 で書いています。
[コード]
JSONDATA= '{"data\":[{"{#VPNID}":"' + vpnid + '"}]}'
cmd1 ='/usr/bin/zabbix_sender -z '+ ZBX_SERVER + ' -s VPNMonitoring -k vpn.connection.discovery -o ' + JSONDATA + ' -vv'
result = subprocess.call( cmd1, shell=True )
KEY = 'vpn.conn[' + vpnid + ']'
cmd2 ='/usr/bin/zabbix_sender -z '+ ZBX_SERVER + ' -s VPNMonitoring -k ' + KEY + ' -o ' + str(VPNSTATUS) + ' -vv'
result = subprocess.call( cmd2, shell=True )
[ZABBIX Server側設定]
Template内のdiscoveryルール
名前 : vpn.connection.discovery
タイプ : Zabbixトラッパー
キー : vpn.connection.discovery
上記discoveryルール内のアイテムのプロトタイプ
名前 vpn.conn[{#VPNID}]
タイプ : Zabbixトラッパー
キー vpn.conn[{#VPNID}]
以上の様な状態で、cmd1の結果は次のように返ってきます。
DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000927"}]
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000927"
sent: 1; skipped: 0; total: 1
ただcmd2の方は次のように返ってきており、データの登録に失敗しています。
DEBUG: answer [{"response":"success","info":"processed: 0; failed: 1; total: 1; seconds spent: 0.000180"}]
info from server: "processed: 0; failed: 1; total: 1; seconds spent: 0.000180"
うまく登録されるようにしたいのですが、アドバイスを頂けないでしょうか。
以上よろしくお願いします
fripper - 投稿数: 495
yutuki さん
参考にしていただいてありがとうございます
■まず、cmd1として提示いただいている部分について
スライドでの p.7 の部分です
VPN 接続の「アイテムにしたいリスト」を vpn.connection.discovery というキーのデータとして sender で投げ込む部分ですが
地方に分散した拠点を接続するVPNに、それぞれ支店名がつけられているイメージで
・sapporo
・tokyo
・nagoya
・osaka
・hakata
みたいに5アイテム作りたいとします
シェル上で直接記述する場合のコマンドラインの指定としては、以下のような感じになるかと思います
https://www.zabbix.com/documentation/3.0/manpages/zabbix_sender
サーバのIPが 123.45.67.89
ディスカバリルールの登録されているホスト設定名がVPNMonitoring
ディスカバリルールのキーが vpn.connection.discovery
キーの値として、上記5つをリスト化したJSON文字列
詳細表示オプションは、yutuki さん提示にならって付与していますが、あってもなくても動作根幹には差異はありません
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k vpn.connection.discovery -o '{"data":[{"#VPNID":"sapporo"},{"#VPNID":"tokyo"},{"#VPNID":"nagoya"},{"#VPNID":"osaka"},{"#VPNID":"hakata"}]}' -vv
中括弧やダブルクォーテーションがシェルで展開・誤認されてしまわないよう、-o オプションに渡す文字列部分をシングルクォーテーションで囲っています
これでディスカバリに対して5項目作るように指示を出す感じですね
提示いただいているコマンド事例だと、python の subprocess へ shell=True で一括文字列を渡されているようですが、
文字列連結で生成されている cmd1 変数の -o 部分が、うまく「1つの引数」に認識されていない気がします
http://docs.python.jp/2.7/library/subprocess.html#module-subprocess
cmdargs1 = ["/usr/bin/zabbix_sender", "-z", ZBX_SERVER, "-s", "VPNMonitoring", "-k", "vpn.connection.discovery", "-o", JSONDATA, "-vv"]
などとして、コマンドラインの要素ごとに記載した配列のようなものを定義して、shell=False で渡すのが確実かもしれません
result = subprocess.call( cmdargs1, shell=False )
この時点で、サーバのホスト設定を見てみると、ディスカバリルール・アイテムのプロトタイプから展開されたアイテムが5つ、設定されているのが確認できると思います
例示いただいた各接続毎のアイテムは、discovery ルールの結果を初めて sender で放り込んでから、実際にそのキーが有効になるまでしばらく掛かるようです
1.server 側で、trapper 役割のプロセスがjsonを受信して
2.DB上のアイテム定義が生成されて
3.serverプロセスがCacheUpdateFrequency毎にホスト設定をDBと同期とって、はじめてtrapper が増えたアイテムキーについて受信できるようになる‥といった次第
増えたアイテムキーを server のプロセスが認識できていれば、受信できるはずなので、投げ込む側のコマンドラインは以下のような具合で
アイテムの個数だけ実行・投げ込み‥といった感じでしょう
半角の角カッコを含むアイテムキー部分も、シェルでの展開・誤認等が怖いので、私はいつもクォートでくくるようにしています
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k 'vpn.conn[sapporo]' -o '0' -vv
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k 'vpn.conn[tokyo]' -o '1' -vv
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k 'vpn.conn[nagoya]' -o '0' -vv
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k 'vpn.conn[osaka]' -o '1' -vv
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k 'vpn.conn[hakata]' -o '1' -vv
アイテム数が増えると sender の実行回数も増えてしまうので、スライド p.8 の中央付近のように、
以下のような複数行のテキストデータを作っておいて、ファイル・もしくは標準入力から sender へ -i オプションを使って渡すほうが
動作が高速になります
cmd2 でエラーになったのは、ここまでに述べたいくつかのポイントから、以下の理由ではないかと思います
・cmd1 でキー定義を受け取ったばかりで、まだserverプロセスがキーを認識できておらず、cmd2 がエラーになった
・cmd1 の結果、想定しているアイテムキーがうまく生成されておらず、cmd2で送信しているつもりのアイテムキーと合致していなかった
yutuki - 投稿数: 21
fripper さん
回答ありがとうございます。スライドの主から回答がもらえるとは・・・。
まず最初に結果を連絡すると、意図通りに動かす事が出来ました。
アドバイス頂きありがとうございました。
> これでディスカバリに対して5項目作るように指示を出す感じですね
はい。その通りです。
なお頂きました次のコマンドですが、ZABBIX Server側の設定が間違っていないか確認する為に実行した所、監視項目が追加されませんでした。
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k vpn.connection.discovery -o '{"data":[{"#VPNID":"sapporo"},{"#VPNID":"tokyo"},{"#VPNID":"nagoya"},{"#VPNID":"osaka"},{"#VPNID":"hakata"}]}' -vv
次の用に直すと、追加されましたので、{}が漏れていた、という事で大丈夫ですよね?
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k vpn.connection.discovery -o '{"data":[{"{#VPNID}":"sapporo"},{"{#VPNID}":"tokyo"},{"{#VPNID}":"nagoya"},{"{#VPNID}":"osaka"},{"{#VPNID}":"hakata"}]}' -vv
> コマンドラインの要素ごとに記載した配列のようなものを定義して、shell=False で渡すのが確実かもしれません
> result = subprocess.call( cmdargs1, shell=False )
どうやらこの部分が原因だったようです。
教えて頂いた方法に変更した所、登録が出来ました。
> 例示いただいた各接続毎のアイテムは、discovery ルールの結果を初めて sender で放り込んでから、実際にそのキーが有効になるまでしばらく掛かるようです
スライドを読んだ際、この事に言及がりましたので、実際のプログラムの中では少し時間をおいてから実行する様にしています。
Forumに書き込む際、省いていました。
> 以下のような複数行のテキストデータを作っておいて、ファイル・もしくは標準入力から sender へ -i オプションを使って渡すほうが動作が高速になります
はい。最終的にはこちらの方法にする予定です。
ただこれをやろうにもまず監視項目の自動追加が出来なかった為、出来るだけシンプルな方で実験していました。
以上よろしくお願いします。
fripper - 投稿数: 495
あー、確かにご指摘のとおり、提示したコマンド列に誤りがありました
#VPNID というマクロ記述の前後に、中括弧が抜けていますね。申し訳ありませんでした
誤:
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k vpn.connection.discovery -o '{"data":[{"#VPNID":"sapporo"},{"#VPNID":"tokyo"},{"#VPNID":"nagoya"},{"#VPNID":"osaka"},{"#VPNID":"hakata"}]}' -vv
正:
zabbix$ /usr/bin/zabbix_sender -z 123.45.67.89 -s VPNMonitoring -k vpn.connection.discovery -o '{"data":[{"{#VPNID}":"sapporo"},{"{#VPNID}":"tokyo"},{"{#VPNID}":"nagoya"},{"{#VPNID}":"osaka"},{"{#VPNID}":"hakata"}]}' -vv
最終的にはうまく動作するようになったとのこと、良かったです
このスライドの事例では、VPNID みたいなマクロ1つだけでやっていますが、vfs.fs.discoveryの結果みたいに、
1アイテム要素に2つ3つとマクロを織り交ぜられるので、
{"{#VPNID}":"sapporo"}
を{"{#VPNID}":"sapporo", "{#VPNNAME}":"札幌支店"}
などとしてアイテムのプロトタイプ側で、アイテムキーには VPNID を使い、アイテムの表示用名称には VPNNAME を使うなども可能です
私自身も、あのスライドのキッカケになった件以降、かなりの数の監視要件をコレで設定していたりするので
いろいろやってみてください
yutuki - 投稿数: 21
自分の復習も兼ねてQiitaに纏めてみました。
http://qiita.com/yutuki/items/a39accdfc4e951998854