2014年12月10日水曜日

Zabbixのアクションでシェルスクリプトを実行する方法 その2

概要

過去にZabbix 1.8で検証していましたが
Zabbixの2系でも試してみました

環境

  • CentOS 6.3 final 64bit
  • Zabbix 2.0.3

設定

事前準備

今回前提として

  • ホストの登録(ホストグループも必要であれば)
  • アイテムの登録(テンプレートも必要であれば)
  • トリガーの登録
  • ホストとアイテムおよびトリガーの紐付け

上記が完了しているとしてアクションを作成してリモートホストにシェルスクリプトを実行させてみます
あとZabbixのインストールはChefで実施しています(Chefはソースコンパイルしてmake installしていた)

アクション作成

設定 -> アクション -> アクションの作成

といきアクションの作成画面を表示します

アクションの概要を設定

まずは「アクション」の設定です
名前は適当に入力します
リカバリメッセージは送信したいと思うのでチェックボックスをONにします
config_action_base.png

アクションの実行条件を設定

次にアクションの実行条件を設定します
ポイントは「トリガーの値 = “障害” 」を削除します
これを削除しないとリカバリメッセージが送信されません
デフォルトのアクションだと「メンテナンスの状態 期間外 “メンテナンス”」が入っていますがこれはこのままでOKです
あとは自分で追加したいトリガーを追加すればOKです
config_action_condition.png

アクションの実行内容を設定

最後に「アクションの実行内容」を設定します
ここに具体的に実行するリモートホストの情報やシェルスクリプトの情報を記載します

デフォルトは何もないので新規で登録します
実行内容の詳細を設定していきます
実行内容のタイプは「リモートコマンド」を選択します

そのすぐ下にターゲットリストがあります

新規 -> ターゲットでホストを選択 -> 選択からリモートホストを実行させるホストを指定 -> 追加

としてシェルスクリプトを実行させたいリモートホストを選択します
選択後に「追加」をクリックすることを忘れずに

次にタイプを設定します
今回はリモートホストにSSH経由でシェルスクリプトを実行したいと思います
なのでZabbixサーバからシェルスクリプトを実行するリモートホストへのSSHは通信できるように事前に設定しておいてください
認証方式は「パスワード」と「公開鍵」のどちらかが選択できますのでお好みに合わせて選択してください
※と、いいたいところなのでが自分がZabbix2.0.3で試した限りだと公開鍵を選択した場合うまくできませんでした(自分のZabbix力が足りなかっただけかもしれませんが)

ログインするためのユーザ名やパスワード、ポート番号の入力してください
そして、ここで実行するシェルスクリプトを記載します
リモートホストで実行できるシェルスクリプトであれば何でもOKです

最後にアクションの実行条件を設定します
新規から「障害対応済 = “コメントなし”」を設定します

ここまで入力できたら一番下の追加をクリックします
config_action_execute.png

アクションのすべての設定が完了したら「保存」をクリックします
これでアクションの作成が完了しました

zabbix側の設定

zabbi_serverのlibssh2を有効にする

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_agetnd.confの設定

シェルスクリプトを実行するリモートホスト側のzabbix_agentd.confに
EnableRemoteCommands=1
が設定されているか確認してください
なければ追加してzabbix_agentを再起動してください
これがないとリモートホストでシェルスクリプトを実行する権限がなく実行に失敗します

sshd_configの設定

今回はパスワード認証を使ってSSHログインするのでログインするリモートサーバ側のユーザのpasswdは設定しておいてください
また、/etc/ssh/sshd_config

  • PasswordAuthentication yes

にしておいてください
実際にZabbixに設定するユーザ情報でログインできるか確認したい場合はZabbixサーバ上のzabbixユーザからリモートサーバにパスワードログインできるか確認してみてください
ACLや権限周りの確認もあるのでログインの確認はやっておいて損はないと思います

試してみる

トリガーの閾値などを極端に低くしたりしてトリガーに引っかかるようにしましょう
その状態にしたときにアクションが実行されるか確認してください

トラブルシューティング

  • うまくシェルスクリプトが実行されない
  • 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」を検索してその辺りのログにシェルスクリプトが失敗しているログがあるのでそれで調べていました(超絶ださいですね)

この辺のトラブルシューティングがログを見る方法しかないのがちょっと辛いです

遭遇したエラー

  • Support for SSH script was not compiled
    --with-ssh2で再コンパイル
  • Unsupported authentication method. Supported methods: publickey
    これが一番はまった、、、秘密鍵と公開鍵の権限を変えたり、名前変えたり、パスを変えたり、、、
    結局最終的にはZabbixサーバからzabbixユーザでリモートサーバに対してパスワード認証でログインできるユーザを作成して解決しました
    バージョンとかをあげたら公開鍵認証もできるようになるのだろうか

今回は以上です
パスワード認証ではありますがSSH経由でシェルスクリプトを実行できる方法を紹介しました
SSH経由が嫌だという場合にはカスタムスクリプトという仕組みもあるのでこれを使うといいと思います

P.S 2014/12/10

カスタムスクリプトをちょっと使ってみましたがzabbix_proxyを経由していないのであれば断然これを使ったほうが楽でした。。。
zabbix_agent側でコマンドを発行してくれるのでSSHとかの設定もいらないし、権限回りもAgentをAllowRoot=1で起動しておけば問題なさそうだし。。。
カスタムスクリプトおすすめです

0 件のコメント:

コメントを投稿