概要
Zabbix で発泡するアクションメール内に時刻情報を記載する方法を紹介します
環境
- CentOS 6.6 64bit
- Zabbix 2.4.5
設定方法
設定 -> アクションを開き設定したいアクションに以下のマクロを追記します
- Event time: {EVENT.TIME}
- Event date: {EVENT.DATE}
設定画面のサンプルは以下のような感じです
これで時刻情報がアクションメールの本文内に記載されます
Zabbix で発泡するアクションメール内に時刻情報を記載する方法を紹介します
設定 -> アクションを開き設定したいアクションに以下のマクロを追記します
設定画面のサンプルは以下のような感じです
これで時刻情報がアクションメールの本文内に記載されます
Redis を監視してダウンしたら自動で起動するようにしてみました
カスタムスクリプトの使い方のおさらいもしたのでメモしておきます
Redisを監視するアイテムとトリガーを作成します
テンプレートはお好きなテンプレートを作成してください
アイテム
トリガー
上記作成したトリガーを元に実行されるアクションを設定します
条件
実行内容
ポイントは実行内容を「リモートコマンド」にして「現在のホスト」でコマンドを実行される部分でしょうか
このままだと権限の関係でコマンドを実行できない可能性があるので設定ファイルを修正します
以下のパラメータが有効になっているか確認してください
今回 service コマンドで redis を再起動しますが、zabbix ユーザだと権限がなく service コマンドを実行できません
また、EnableRemoteCommands を有効にしないとカスタムスクリプト自体使えません
AllowRoot の設定はセキュリティ的に嫌だという場合は sudo 等で権限を与えるようにしてください
修正後は zabbix-agent を再起動してください
ここまで設定できれば完了です
実際に redis を停止すれば設定したリモートコマンドが実行されると思います
カスタムスクリプトに指定したコマンドがうまく実行されない場合は Zabbix サーバのログを見てみましょう
デフォルトだとログレベルが warnings (3) になっているため debugging (4) にしてください
これでリモートコマンドが実行されたときに/var/log/zabbix/zabbix_server.log
にログが出るようになります
ただ、ログの量が非常に多いのでtail -f /var/log/zabbix/zabbix_server.log | grep start
等で必要なログだけ見るようにしてください
Zabbix サーバのログにエラーが出ていなくてもリモートコマンドが実行されていない場合はコマンドを実行しているホスト側で何かしらが原因で実行されていないのでホスト側を確認しましょう
いろいろと原因は考えられますが、コマンドが間違っていたり、一番多そうなのはやはり権限回りかと思います
Zabbix はトラブルシュート系が結構面倒だといつも感じます
もう少しログを見やすくしてほしい気もします
一番はUI上で「失敗」や「エラー」となっている状態で、その原因を詳細に確認できるとログもデバッグモードにして見る必要がないので楽かなと思います
Munin のメモリのグラフを Zabbix でも監視できないかなと思って調べていたら記事を見つけたのでやってみました
Zabbix 2.4 で実施しているのでスクリプトを Zabbix 2.4 に対応するように修正しています
とりあえずこれでhttp://hostname/munin
に ID/PW でアクセスできることを確認しましょう
今回 munin は使いませんがメモリの使用量が munin で問題なく取得できていることを確認してください
今回利用するメモリ使用量を取得するプラグインは以下にシンボリックリンクとしてあります
/etc/munin/plugins/memory
ここを参考にインストールしています
今回は Munin も Zabbix (MySQL も) すべて同一ホストにインストールしています
インストールが完了したらとりあえずZabbix Server
自体が監視できていればOKです
公開されている python スクリプトは指定したテンプレートに対してアイテムおよびグラフを登録してくれます
今回は Zabbix 2.4 でも動作するようにスクリプトを修正しています
Zabbix の UI にアクセスしてテンプレートを一つ登録してください
今回は「Template_Munin_Memory」というテンプレートを作成した体で話を進めます
echo 'UserParameter=munin[*],/etc/munin/plugins/$1 |grep "^$2.value" |cut -d " " -f2' > /etc/zabbix/zabbix_agentd.d/userparameter_munin_plugin.conf
echo 文で conf ファイルを1つ作成します
作成したらservice zabbix-agent restart
で再起動しましょう
適当なディレクトリに移動してスクリプトを取得しましょう
39,40c39,40
< username = "Admin"
< password = "zabbix"
---
> username = "Your ID"
> password = "Your PW"
65c65
< for x in range(1,6):
---
> for x in range(1,7):
71c71
< createdgraphids = zapi.graph.create([{'gitems': (gitems) ,'name': (graph_title),'width':'900','height':'200','yaxismin':'
0.0000','yaxismax':'3.0000','templateid':'0','show_work_period':'1','show_triggers':'1','graphtype':'0','show_legend':'1','
show_3d':'0','percent_left':'0.0000','percent_right':'0.0000','ymin_type':'0','ymax_type':'0','ymin_itemid':'0','ymax_itemi
d':'0'}])["graphids"][0]
---
> createdgraphids = zapi.graph.create([{'gitems': (gitems) ,'name': (graph_title),'width':'900','height':'200','yaxismin':'
0.0000','yaxismax':'3.0000','show_work_period':'1','show_triggers':'1','graphtype':'0','show_legend':'1','show_3d':'0','per
cent_left':'0.0000','percent_right':'0.0000','ymin_type':'0','ymax_type':'0','ymin_itemid':'0','ymax_itemid':'0'}])["graphi
ds"][0]
201,206c201,213
< obj = {'jsonrpc': '2.0',
< 'method': method,
< 'params': params,
< 'auth': self.auth,
< 'id': self.id
< }
---
> if method == "user.login":
> obj = {'jsonrpc': '2.0',
> 'method': method,
> 'params': params,
> 'id': self.id
> }
> else:
> obj = {'jsonrpc': '2.0',
> 'method': method,
> 'params': params,
> 'auth': self.auth,
> 'id': self.id
> }
230c237
< obj = self.json_obj('user.authenticate', {'user': l_user,
---
> obj = self.json_obj('user.login', {'user': l_user,
修正箇所は以上です
とりあえず自分は上記のみで動作しましたが、他にも Zabbix Server のホスト名を記載する部分もあったので環境によってはまだ修正が必要な箇所があるかもしれません
でエラーがでなければOKです
エラーの場合は Exception の内容を確認して上記スクリプトを更に修正する必要があります
スクリプトの動作が完了するとテンプレートにアイテムが13個とグラフ1個が追加されます
以下手動での操作ですがやったほうが良さそうな点を紹介します
グラフタイプの変更
グラフのタイプが「ノーマル」になっているので「積算グラフ」に変更しましょう
不要なアイテムの削除
グラフから以下のアイテムを削除しましょう
committed
active
inactive
vmalloc_used
mapped
上記はあってもいいのですが積算グラフにすることで縦軸が合わなくなります
Munin のグラフは積算+折れ線グラフでメモリ使用量を表示しており上記のアイテムは折れ線グラフで表示している項目になるため Zabbix では削除しないと縦軸の値が合いません
なので、やるとしたら別途、ノーマルタイプの折れ線グラフを作成して、そちらに移行するといいと思います
完成するとこんな感じになります
色はzabbix_munin_plugin.py
内でランダムで生成しているので必要に合わせて変更してください
munin-node を使って Zabbix で Munin ってぽいメモリ監視をすることができました
Python スクリプトも使っているので、スクリプトの実行で失敗しまくる場合は、素直に Munin を使いましょう
デフォルトだと UserParameter の引数に特殊文字「*」「{}」等のが使えないらしいです
使えるようにする方法を紹介します
zabbix_agentd.conf
を修正します
以下の1行を追加すればOKです
UnsafeUserParameters=1
修正したらzabbix-agent
を再起動してください
これで特殊文字が使えるようになります
デフォルトだと使用できない特殊文字の一覧は以下の通りです(真ん中くらい)
https://www.zabbix.com/documentation/2.0/manual/config/items/userparameters
変数を渡したい場合はそのまま使えるようです
例えばホスト名を表す環境変数{HOSTNAME}
を渡したい場合は
original.key[{HOSTNAME}]
でOKです
Zabbix で Redis の監視を簡単にできないかなと探していたら便利そうなテンプレートがあったので使ってみました
ということで zbx_redis_template を使ってみました
Zabbix Agent および Server のインストールと設定
Redis のインストールと設定
は完了させておいてください
ここでは紹介しません
Zabbix Agent は公式から rpm を取得してインストールしました、Redis は Remi を追加して yum インストールしています
Redis サーバを Zabbix ですでに監視可能な状態であることを前提にしています
監視対象の Redis サーバ上に監視に必要な設定をしていきます
Zabbix Server の GUI を操作していきます
GUI が操作できるマシン上で作業してください
git clone https://github.com/blacked/zbx_redis_template.git
でテンプレートをダウンロードしてください
テンプレートをダウンロードしたら GUI を開いて
設定 -> テンプレート -> インポート
で参照からダンロードテンプレートの中からzbx_redis_templates.xml を選択してください
これで作業自体は完了です
問題なく動作すれば Redis の情報が Zabbix Server に登録されはじめます
自分が遭遇したトラブルシュートを紹介します
多くはこれにハマると思います
監視対象に配置した python スクリプトを直接実行してエラーにならないようにしましょう
python スクリプトは以下のように実行できます
/etc/zabbix/script/redis/zbx_redis_stats.py -p 16379 $1 $2 $3
まずこれでエラーが出なくならないようにしましょう
エラーになる場合大抵の理由は
かなと思います
ライブラリのインストールは必要なものを pip intall してください
ポートの指定は zbx_redis.conf 内を以下のように変更することで可能です
/etc/zabbix/script/redis/zbx_redis_stats.py -p 16379 $1 $2 $3
エラーが出なくなったら再度テンプレートの監視設定を有効にする必要があるので、テンプレートから全アイテムにチェックして一括更新でステータスを無効 -> 有効にしてください
こうすることで再度アイテムのチェックが走ります
おそらくバージョンの違いによるものだと思いますが自分の場合は「redis[{HOSTNAME}, dbsize, none]」の値が取得できませんでした
取得できない値は Zabbix Server 側に値があっても仕方ないのでテンプレートから削除しちゃってOKです
Zabbix Proxy で監視設定をしている際にタイトルのエラーがずっと発生していつまで経ってもホストの監視が有効にならなかった
エージェント側とプロキシ側で以下のログがずっと出続けいる状態が発生しました
監視対象のZabbix Agentの設定、分散監視するZabbix Proxyの設定はすでに完了しているものとします
設定とは具体的にはzabbix_agentd.confやzabbix_proxy.confの記載が完了していてプロセスも起動している状態です
またACL等も問題なく設定されている状態です
この状態で当該エラーが発生してホストの監視がずっと行われていませんでした
Zabbix Agent側の設定やZabbix Proxy側の設定を散々変更してみたのですが、一向に解消されませんでした
原点に立ち返って再度ログを眺めてみると/var/log/zabbix/zabbix_proxy.log
に以下のようなログが出ていました
failed to update local proxy configuration copy: invalid field name "items.filter"
このログを頼りに調査を続けるとどうやらZabbix Proxyに必要なMySQLのスキーマがおかしいことがわかりました
Zabbix ProxyはZabbix Serverとデータの同期を行っています
具体的にはホストの監視設定(アイテム等)になります
このときにZabbix Proxy側のスキーマがZabbix Server側のスキーマとあわずにうまくのデータが同期できていなかったようです
ここまで来てピンと来たのですが、Zabbix Serverは古くから使われているサーバでバージョンが古く「2.0.5」でした
対してZabbix ProxyとZabbix Agentは最近構築したサーバでここには最新のZabbix ProxyとZabbix Agentをインストールしていました
最新バージョンは2.4.5になります
結論は
2.4.5のZabbix ProxyとZabbix Agentを一旦アンインストールして2.0.14のProxyとAgentを再インストールしました
になります
すべてyumで管理していたので
yum erase zabbix_proxy
yum erase zabbix_agent
yum erase zabbix
で最新バージョンのパッケージを削除し
rpm -ivh http://repo.zabbix.com/zabbix/2.0/rhel/6/x86_64/zabbix-release-2.0-1.el6.noarch.rpm
yum clean all
yum install zabbix-proxy
yum install zabbix-agent
で再度インストールしたあとに
mysql -u user -p zabbix < /usr/share/doc/zabbix-proxy-mysql-2.0.14/create/schema.sql
という感じで2.0系のDBスキーマをZabbix Proxy用に当ててあげれば問題なく動作しました
今回学んだ教訓は
Zabbix Serverのバージョンに合わせてZabbix ProxyとZabbix Agentのバージョンも合わせよう
そうしないとDBのスキーマが異なりうまく監視データをZabbix Proxy上に登録することができない
ということです
本当はセキュリティの関係とかもあって最新版を使いたいところなのですが、どうやらDBのスキーマの関係で無理なようです
マイナーバージョンは異なっていても問題ないようです
新規でZabbix Serverも構築する場合は今回のような問題に遭遇することは少ないと思いますが
Zabbix Proxyを使って監視対象の新規サービスを増やす場合などに陥りそうです
特定のホストに紐づくアイテムの履歴は「ヒストリ」と呼ばれる機能で提供されます
WebUIでヒストリ情報を確認したい場合、過去1,000個分のヒストリしか確認することができません
アイテムを30秒間隔で取得している場合には
30 * 1000 = 30,000 sec = 500 min = 8.3 hour
しか履歴を確認することができません
ZabbixAPIを使えばヒストリをすべて取得できそうだったので試してみました
言語はPHPを使用しています
PHPを使ってZabbixAPIをコールする方法の準備は済ませておいてください
さっそくスクリプトを紹介します
使うためにはソース上の設定部分を直接修正します
次で使い方を紹介します
<?php
require 'ZabbixApi.class.php';
try {
$hostid='10116';
$itemid='28908';
$history=3; // 0 - float; 1 - string; 2 - log; 3 - integer; 4 - text.
$api = new ZabbixApi('http://hostname/api_jsonrpc.php', 'your user name', 'your uesrs password');
$res = $api->historyGet(
array(
'history' => $history,
'output' => 'extend',
'hostids' => array (
$hostid
),
'itemids' => array (
$itemid
)
#,'limit' => 10
)
);
foreach ($res as $result) {
$value = $result->value;
$clock = $result->clock;
echo $value . "," . date("Y/m/d H:i:s", intval($clock)) . "\n";
}
} catch (Exception $e) {
echo $e->getMessage() . "\n";
}
?>
今回は取得したいヒストリ情報は「指定したホストに紐づくアイテムのヒストリ」とします
サンプルで修正する箇所は以下の通り
最低限上記を修正してください
必要に応じて以下も修正してください
で実行は
php get_history.php
でOKです
結果は時系列順に「値,タイムスタンプ」のcsv形式で標準出力されます
表示形式等は必要に応じて変更していただければと思います
一応自分の場合はこれで2万弱のヒストリをlimitなしで取得することができました
APIのタイムアウトを調整できれば1回のリクエストで大量のヒストリを取得できると思います
あれなぜか「zabbix-get」コマンドがないという場合に使えます
公式で配布されているrpmを使います
ポイントはすでにインストールされているZabbixAgentと同じバージョンのrpmをインストールすることです
wget http://repo.zabbix.com/zabbix/2.0/rhel/6/x86_64/zabbix-get-2.0.5-1.el6.x86_64.rpm
rpm -ivh zabbix-get-2.0.5-1.el6.x86_64.rpm
今回はCentOS6系なので「el6」をダウンロードしています
CentOS5系の場合は別途「el5」も配布されているのでそちらをダウンロードしてください
インストールされるパスは/usr/bin/zabbix_get
です
zabbix_get --version
でバージョンが表示されればOKです
過去にZabbix 1.8で検証していましたが
Zabbixの2系でも試してみました
今回前提として
上記が完了しているとしてアクションを作成してリモートホストにシェルスクリプトを実行させてみます
あとZabbixのインストールはChefで実施しています(Chefはソースコンパイルしてmake installしていた)
設定 -> アクション -> アクションの作成
といきアクションの作成画面を表示します
まずは「アクション」の設定です
名前は適当に入力します
リカバリメッセージは送信したいと思うのでチェックボックスをONにします
次にアクションの実行条件を設定します
ポイントは「トリガーの値 = “障害” 」を削除します
これを削除しないとリカバリメッセージが送信されません
デフォルトのアクションだと「メンテナンスの状態 期間外 “メンテナンス”」が入っていますがこれはこのままでOKです
あとは自分で追加したいトリガーを追加すればOKです
最後に「アクションの実行内容」を設定します
ここに具体的に実行するリモートホストの情報やシェルスクリプトの情報を記載します
デフォルトは何もないので新規で登録します
実行内容の詳細を設定していきます
実行内容のタイプは「リモートコマンド」を選択します
そのすぐ下にターゲットリストがあります
新規 -> ターゲットでホストを選択 -> 選択からリモートホストを実行させるホストを指定 -> 追加
としてシェルスクリプトを実行させたいリモートホストを選択します
選択後に「追加」をクリックすることを忘れずに
次にタイプを設定します
今回はリモートホストにSSH経由でシェルスクリプトを実行したいと思います
なのでZabbixサーバからシェルスクリプトを実行するリモートホストへのSSHは通信できるように事前に設定しておいてください
認証方式は「パスワード」と「公開鍵」のどちらかが選択できますのでお好みに合わせて選択してください
※と、いいたいところなのでが自分がZabbix2.0.3で試した限りだと公開鍵を選択した場合うまくできませんでした(自分のZabbix力が足りなかっただけかもしれませんが)
ログインするためのユーザ名やパスワード、ポート番号の入力してください
そして、ここで実行するシェルスクリプトを記載します
リモートホストで実行できるシェルスクリプトであれば何でもOKです
最後にアクションの実行条件を設定します
新規から「障害対応済 = “コメントなし”」を設定します
ここまで入力できたら一番下の追加をクリックします
アクションのすべての設定が完了したら「保存」をクリックします
これでアクションの作成が完了しました
zabbix_server.logの中に以下のように「SSH2 support NO」が出ている場合はSSH2を有効にする必要があります
21535:20141209:130822.629 ****** Enabled features ******
21535:20141209:130822.629 SNMP monitoring: YES
21535:20141209:130822.629 IPMI monitoring: NO
21535:20141209:130822.629 WEB monitoring: YES
21535:20141209:130822.629 Jabber notifications: NO
21535:20141209:130822.629 Ez Texting notifications: YES
21535:20141209:130822.629 ODBC: NO
21535:20141209:130822.629 SSH2 support: NO
21535:20141209:130822.629 IPv6 support: NO
21535:20141209:130822.629 ******************************
面倒ですが、再度コンパイルしてインストールし直す必要があります
※自分の場合はchefからインストールしたのでその場合の手順ですが、rpmとかyumでイントールした人も同じような手順でいいのだろうか。。。
/etc/init.d/zabbix_server stop
cp /opt/zabbix/sbin/zabbix_server{,.back}
cd /opt/zabbix-2.0.3-server/
make clean
./configure --enable-server --with-mysql --with-libcurl --with-net-snmp --with-ssh2
make install
cp /usr/local/sbin/zabbix_server /opt/zabbix/sbin/
/etc/init.d/zabbix_server start
でzabbix_server.logに「SSH2 support NO」が出ていないことを確認します
それでもダメな場合はrpm -qa | grep libssh2
がインストールされているか確認してください
インストールされていない場合はyumでインストールしてください
※普通にやっていたらこれに気がつくほうが大変、そしてlibssh2はEPELが必要。。。
シェルスクリプトを実行するリモートホスト側のzabbix_agentd.confに
EnableRemoteCommands=1
が設定されているか確認してください
なければ追加してzabbix_agentを再起動してください
これがないとリモートホストでシェルスクリプトを実行する権限がなく実行に失敗します
今回はパスワード認証を使ってSSHログインするのでログインするリモートサーバ側のユーザのpasswd
は設定しておいてください
また、/etc/ssh/sshd_config
で
にしておいてください
実際にZabbixに設定するユーザ情報でログインできるか確認したい場合はZabbixサーバ上のzabbixユーザからリモートサーバにパスワードログインできるか確認してみてください
ACLや権限周りの確認もあるのでログインの確認はやっておいて損はないと思います
トリガーの閾値などを極端に低くしたりしてトリガーに引っかかるようにしましょう
その状態にしたときにアクションが実行されるか確認してください
うまく一発で想定どおりの動作をすることがあるかもしれませんが、自分の経験的には、まずありえません
うまく実行されない場合にはzabbix_server.logを確認してみましょう
その前にzabbix_server.confのDebugLevelが「4」になっているか確認しましょう
なっていないようなら4に変更してzabbix_serverを再起動してください
変更できたらログを確認します
おそらく/var/log/zabbix/zabbix_server.log
があるかと思いますがこいつが厄介でものすごい速さでログが流れて
ものすごい速さでローテートされてどんどん過去のログがなくなっていきます(5分前のログとかもすぐになくなります)
なのでログが追えないという場合にはzabbix_server.confのLogFileSize=0
をzabbix_server.confに記載して再起動するとローテーションされなくなります
ただ、この場合はローテーションがされずどんどんログサイズが肥大化していきます
すぐにログの確認が終わる場合はいいですが終わらない場合に、いつの間にかファイルサイズがとんでもないことになっていてディスク逼迫している。。。なんてこともありますので気をつけてください
自分はローテーションを無効にする設定をするのも面倒だったので
while :; do tailf /var/log/zabbix/zabbix_server.log | grep 'alerts'; done;
でログを見ていて
トリガーが発砲されたときのログ(以下のようなやつ)をメモって
19675:20141209:114118.008 query [txnlev:1] [insert into alerts (alertid,actionid,eventid,clock,message,status,error,alerttype,esc_step) values (10,6,10399,1418092878,'remote_host:hostname
急いでtailfを解除して、そのときのzabbix_server.logを適当な場所にコピーします
そして、コピーしたそのファイルで「19675:20141209:114118.008」を検索してその辺りのログにシェルスクリプトが失敗しているログがあるのでそれで調べていました(超絶ださいですね)
この辺のトラブルシューティングがログを見る方法しかないのがちょっと辛いです
--with-ssh2
で再コンパイル今回は以上です
パスワード認証ではありますがSSH経由でシェルスクリプトを実行できる方法を紹介しました
SSH経由が嫌だという場合にはカスタムスクリプトという仕組みもあるのでこれを使うといいと思います
P.S 2014/12/10
カスタムスクリプトをちょっと使ってみましたがzabbix_proxyを経由していないのであれば断然これを使ったほうが楽でした。。。
zabbix_agent側でコマンドを発行してくれるのでSSHとかの設定もいらないし、権限回りもAgentをAllowRoot=1
で起動しておけば問題なさそうだし。。。
カスタムスクリプトおすすめです
RESULT=`zabbix_get -s yoshi3 -k get.du.size2` if [ $RESULT = "ZBX_NOTSUPPORTED" ] then echo NG exit 1 fi
change_action_status.php test 11つ目の引数はアクション名
extension=mongo.so
<?php
new MongoClient("mongodb://dbserver:27017");
?>
8967:20131204:171621.274 item [db_server:mikoomi-mongodb-plugin.sh[-h {$SERVER} -p {$PORT} -z {$HOSTNAME}]] became supported的なログが出力されれば完了です
1 0 * * * ln -nfs /var/log/app/sample_app.`date "+%Y-%m-%d"`.log /var/log/app/sample_app.log