Oracle起動状態監視(SQLPlus)
初めまして。
ZABBIXを用いてOracleの起動・接続監視を行おうと思うのですが、うまく行かず行き詰ってしまったので、こちらで質問させて頂きました。
クライアントの意向でAgentを監視対象のサーバーに入れることができなかったので、SQLPlusでの接続確認で監視を行おうと、ZABBIXの外部チェックを使用し、RubyでSQLPlusの接続を行うようにスクリプトを作成したのですが、ZABBIX側で値を取得できず「Script /etc/zabbix/externalscripts/oracle.system.connect.rb returned nothing.」といったエラーが出ております。
最初に外部チェックの設定確認のために簡単なスクリプトを作成し、値の取得には成功していたので、恐らくスクリプトの問題かと思います。
以下がそのスクリプトのソースになります。
<code>
#!/bin/env ruby
require 'pty'
require 'expect'
#定数宣言
SQLPLUS_PATH = 'sqlplus'
#変数宣言
cmd = "" #実行コマンド
cmd_input_cnt = 0 #コマンド入力回数
user_name = ""
user_pass = ""
host_name = ""
host_sid = ""
connected_flg = 0
#引数格納
user_name = ARGV[0]
user_pass = ARGV[1]
host_name = ARGV[2]
host_sid = ARGV[3]
$expect_verbose=true
#実行コマンド組立
cmd = SQLPLUS_PATH + ' /nolog'
PTY.spawn(cmd) do |r,w|
w.sync=true
r.expect(/^SQL\>.*/s){ #コマンド入力待ち状態
#コマンド入力回数カウントアップ
cmd_input_cnt += 1
case cmd_input_cnt
when 1 then
#コマンド組立
cmd = 'connect ' + user_name + '/' + user_pass + '@' + host_name
w.puts cmd
else
#w.puts 'exit'
puts 0
# PTY.protect_signal do
PTY.reset_signal
exit(0)
# end
end
}
r.expect(/^接続されました/s){ #接続成功
#コマンド入力回数カウントアップ
cmd_input_cnt += 1
#接続フラグ更新
connected_flg = 1
#w.puts "exit"
puts 1
# PTY.protect_signal do
exit(1)
# end
}
r.expect(/^ERROR:/s){ #接続失敗
#コマンド入力回数カウントアップ
cmd_input_cnt += 1
#w.puts "exit"
puts 0
# PTY.protect_signal do
exit(0)
# end
}
end
puts connected_flg
exit(connected_flg)
</code>
私が思いついたのがSQLPlusというだけだったので、他にAgentを使用せずにOracleへの接続確認が行える手段があるようでしたら、そちらも教えて頂ければ助かります。
お力添えを宜しくお願い致します。
TNK - 投稿数: 4753
まず、ORACLE関連の環境変数の設定が必要だと思われます。
恐らく、動作確認をされたときには、ORACLE関連の環境変数やPATHが設定された環境でご提示頂いたスクリプトを起動されたのだと思います。
zabbix_serverから起動される場合は、ユーザ'zabbix'で起動されていると思うので、sqlplusを稼動させるために必要なORACLE関連の環境変数が設定されていない状態なのではないでしょうか。
明示的にスクリプト内で、ORACLE関連の環境変数やPATHを設定するようにしてみてはいかがでしょうか?
jyoi2727 - 投稿数: 9
返信有難うございます。
なるほど、環境変数ですか。
完全に失念しておりました。
しかし、さっそく追加してみたものの同様の結果になってしまいました。
'ZABBIX'ユーザーにてスクリプトを単体で実行してみたのですが、この場合はきちんと「'接続しました'」の文字が表示されるようでしたので、SQLPlusの実行自体はできてるように思えます。
TNK - 投稿数: 4753
あと考えられるとしたら、expectを使わない方が良いかもしれません。
外部チェックスクリプトは、zabbix_serverからpopen()を利用してスクリプトの起動を行い、その標準出力を受け取って処理しているようです。
もしかしたら、sqlplusの標準出力がzabbix_serverに奪われてしまっているのかもしれません。
簡単なクエリを投げて、sqlplusの終了コードが0かどうかで判定するようにしてみてはいかがでしょうか?
Rubyではありませんが、Zaboraなども参考になると思います。
http://www.zabbix.com/wiki/howto/monitor/db/orcale/oracle
jyoi2727 - 投稿数: 9
返信が遅くなり申し訳ございません。
その程度のチェック内容でも構いません。
ご提案頂いたZaboraなのですが、自分の理解力が足りないのかもしれませんが、こちらはエージェントを使用した場合ではないのでしょうか?
日本語での解説サイトが見つからなかったので、使い方を間違えているのかもしれませんが、「UserParameter」にセットするような箇所があったので。
Rubyに拘るわけではございませんが、外部スクリプトでのチェックができる方法はございませんでしょうか?
宜しくお願い致します。
fripper - 投稿数: 495
zabbix の対抗馬、Nagios のユーザ有志が作成された
Perlスクリプトですが‥シェルスクリプトから、Oracle 関連
・DBインスタンスの起動状態
・TNSリスナの起動状態
・テーブルスペースの状態
などなどがチェックできます。
このスクリプトを少し書き換えて、正常時には0、
異常時に1、とだけ表示するように書き換えれば、
「数値型(整数)」のユーザスクリプトとして
アイテム登録できるのではないでしょうか?
http://sourceforge.net/projects/sereds/files/Nagios/check_oracle/1.0/
jyoi2727 - 投稿数: 9
返信ができず申し訳ございません。
他の案件で忙しくなってしまったため、
とりあえずOracle監視はせずに本体の動作監視のみを行っておりました。
年度替わりで少し余裕が出てきたので、
改めてOracle監視の設定方法を探っていたところ、
Orabbix( http://www.zabbix.com/wiki/howto/monitor/db/orabbix_monitor_oracle_with_zabbix?s[]=oracle )を使用することで、
予定していた監視項目を十二分に満たすことができました。
日本語で設定方法の書かれたサイトがなかっため,
若干苦労しましたが、
思いの外すんなりと監視対象のデータが取得できました。
ご返信頂けた方々には、返信を放置するかたちになってしまい申し訳ございませんでした。