シェル実行結果取得方法について
お世話になっております。
現在AWSのRDSに対する死活監視を、下記内容のシェルをzabbixのアイテム(外部チェック)にて実行し、その結果をトリガーで判定しようとしております。
【シェル内容】(ファイル名:test01.sh)
test_sh01=`timeout -sKILL 10 mysqladmin --defaults-extra-file=パスワードファイル status -h RDSのエンドポイント &>/dev/null ;echo $?`
if test "${test_sh01}" = 0;then
echo "0"
else
echo "1"
fi
【アイテム設定】
タイプ:外部チェック
キー:test01.sh
データ型:数値(整数)
データの形式:10進数
【トリガー】
条件式:{testsv01:test01.sh.max(#3)}=1
シェルの結果としては「0」の場合は正常・「1」の場合は異常となる為、上記トリガー設定で「1」の場合はエラーを検知できるはずですが、
シェルの実行結果が「1」であってもトリガーにかからず、エラーを検知できない状態となっております。
「監視データ」-「最新データ」から現状受け取っている値を確認した結果、「Up(0)」となっており、シェルの実行結果を
正常に値を受け取れていないようです。echoではなくexitでも試しましたが、今度は値を取得することができなくなってしまう状況です。
シェルの実行コマンドを変更しても同様の事象が出る為、実行結果をうまく取得できれば改善できるのではと考えております。
そこで、echo結果を正常に受け取る方法はありますでしょうか。ご助力宜しくお願い致します。
【環境】
監視用サーバOS:AmazonLinux
zabbix:3.0
監視対象:RDS(MySQL 5.7)
TNK - 投稿数: 4742
最新データで値を取得した時刻を確認してください。
監視間隔で設定しているよりも前の古い時刻になっていませんか?
古い時刻なっているのであれば、タイムアウトなどのエラーが発生
して値を取得できていないのではないでしょうか。
ホストのアイテム一覧の該当するアイテムの右側に赤×印がついて
いないかや、Zabbixサーバーのログを確認してください。
デフォルトでは、値の取得に3秒以上の時間のかかる監視はできま
せん。
設定で30秒までは伸ばすことはできるので、タイムアウトまでの時
間を伸ばしたい場合は、ZabbixサーバーやZabbixエージェントの設
定ファイル内にあるTimeoutの値を調整してみてください。
msy - 投稿数: 24
回答頂きありがとうございます。
時刻については古い時刻にはなっていない為リアルタイムで値の取得には成功しているようです。
zabbixサーバの設定ファイルにあるTimeoutについては、mysqladminコマンドによる確認の場合、
RDSへ通信が通らない場合結果が返ってくるのが遅い為、シェル上で「timeout -sKILL 10」と変更しましたが、
その際にアイテムにて取得不能となったためzabbixサーバの設定ファイルにてTimeoutを30秒に変更している状態です。
現在アイテム・トリガー共に有効となっております。
しかしながら、上記結果でも判定ができない為、echo結果取得に問題が或るのでは・・・と考えている状況です。
TNK - 投稿数: 4742
継続して値が取得できているのにも関わらず、正しい値が取得でき
ないのであれば、そのアイテムの設定かスクリプトの配置方法に何
らかの問題があると思われます。
Zabbixで外部スクリプトを実行した結果は、標準入力から文字列と
して取得するので、echoで正しい数値を出力できていれば、それを
アイテムの値として取り扱うことができます。
exitコードの値をアイテムの値とはしません。
再度、アイテムの設定とログに何か出力されていないかを確認して
ください。
msy - 投稿数: 24
回答頂きありがとうございます。
設定や動作を確認し、いくつか確認できた点があります。
一つはアイテム設定で、「値のマッピングの使用」が「Service state」になっておりました。
これが原因でecho結果を正常に取得できない場合がありました。
もう一つ確認できた内容は、どうやらmysqladminコマンドを利用した場合の結果が正常に取れないようです。
[test001.sh]
#!/bin/sh
test01=`echo 1`
if test "${test01}" = 1;then
echo 1
else
echo 0
fi
[test002.sh]
#!/bin/sh
test01=`timeout -sKILL 10 mysqladmin --defaults-extra-file=パスワードファイル status -h RDSエンドポイント &>/dev/null ;echo $?`
if test "${test01}" = 0;then
echo 1
else
echo 0
fi
上記「test001.sh」の処理はzabbix側では正常に「1」を取得できましたが、「test002.sh」ではサーバが正常に動作する場合は「0」が返ってくる為
比較を行った場合結果は「echo 1」となり、Linux上のシェル実行結果はecho結果の1が表示されます。
しかし、zabbixの取得結果は0となっておりました。
mysqladminの結果をそのまま利用しようとしても結果は変わらず、RDSへの通信を切っても結果は「0」のままとなっております。
その他、下記mysqladminに変えて、判定を「if test "${test01}" = 1;then」にして確認しましたが、「0」のまま結果は変わりませんでした。
(RDSのセキュリティグループからポートを削除しアクセスできないようにしても結果は変わらず)
mysqladmin --defaults-extra-file=パスワードファイル ping -h RDSエンドポイント 2> /dev/null | grep -c alive
zabbix側ではmysqladminが絡む処理は取得に影響があるのでしょうか。
関連する設定周りなどありましたらご教授いただければ幸いです。
msy - 投稿数: 24
設定内容を確認した結果原因が判明し、RDSの死活監視を行うことができました。
原因は、mysqladminのパスワードファイルの権限をセキュリティ上の観点からrootユーザで「-rw-------」としており、
これにより、他のユーザはコマンドを実行してもRDSへアクセスできない状態となっていた為、
「1」が返ってきておりました。
コマンドに利用していた「&>/dev/null 」を削除しコマンドを実施した結果、下記のエラーも出ておりました。
mysqladmin: [ERROR] Could not open required defaults file: パスワードファイル
mysqladmin: [ERROR] Fatal error in defaults handling. Program aborted!
パスワードファイルの権限を「-rw-r--r--」にし、確認を行った結果、
正常に処理内容をzabbixで取得でき、監視ができるようになりました。
お手間をおかけしてしまい申し訳ありませんでした。