で実行されるPerl
ようにいくつかのスクリプトを調整しようとしています。Bash
Nagios XI
問題は、Nagiosが変数値が一重引用符の間に到着すると予想していますが、変数を正しくエスケープできないことです。
たとえば、変数および/または定数を宣言する上部領域には、次のものがあります。
status='OK'
これをNagiosに返された値に置き換えると、次のように配置すると正しく機能します。
output="[$status]"
output_msg="Voting disks status check succeeded"
印刷時に返されます[OK] Voting disks status check succeeded
。
ただし、次のように実行されたコマンドに基づいて作成された他の変数があります。
command=`/oracle/app/grid/19300/bin/crsctl query css votedisk | grep asm`
output1=`echo $command | cut -d " " -f4`
output2=`echo $command | cut -d " " -f5`
このスクリプトをローカルで実行すると、結果は期待どおりです。
[OK] Voting disks status check succeeded - (/dev/mapper/asm_ocr1) [OCR].
ただし、Nagiosサーバーから起動すると、$ output1および$ output2変数は常に空です。
[OK] Voting disks status check succeeded -
リテラルテキストで3番目の変数を宣言しようとすると正しく表示されるため、これが一重引用符のためであることがわかります。
output3='Test'
output="[$status] $output_msg - $output3
これはNagiosサーバーに描かれます:
[OK] Voting disks status check succeeded - Test
$output1
$output2
Nagiosが解釈できるようにテキストを一重引用符で囲む方法を知っていますか?
編集する
変数の内容を一重引用符で囲む必要があることを確認するために、次のテストを実行しました。
#Add the path that $output1 should return
test='/dev/mapper/asm_ocr1'
#Paint in the output the variable $test
output="[$status] $output_msg - $test $output1 $output2"
########
#On the Nagios server, the $test variable send correctly:
[OK] Voting disks status check succeeded - /dev/mapper/asm_ocr1 ''
編集2
エラーは引用符で発生したのではなく、NagiosとDBを実行しているノードの通信で発生することがわかりました。
これまでの完全なスクリプトは次のとおりです。
. /home/oracle/.profile_RAC
ORACLE_HOME=/oracle/app/grid/19300
ORACLE_BASE=/oracle/app/base
nagios_exit_codes=('UNKNOWN', 3, 'OK', 0, 'WARNING', 1, 'CRITICAL', 2)
status='OK'
ok=1
action=$1
case $action in
"votedisk")
#command=`/oracle/app/grid/19300/bin/crsctl query css votedisk | grep asm`
#command=$(/oracle/app/grid/19300/bin/crsctl query css votedisk)
command=`/oracle/app/grid/19300/bin/crsctl query css votedisk`
case $comando in
*"failed"*|*"OFFLINE"*|*"PROC"*)
status='CRITICAL'
output_msg="Voting disk status check failed!"
;;
* )
output_msg="Voting disks status check succeeded"
;;
esac
output="[$status] $output_msg - $command"
;;
"clusterstatus")
comando=`/oracle/app/grid/19300/bin/crsctl query crs releaseversion`
output_msg="All clusterware services are up (clusterware version: $comando)"
output="$output_msg"
;;
esac
echo -e $output
exit 0
このスクリプトをローカルで実行すると、結果は次のようになります。
[root@bbddmachine plugins]# sh ./script_prueba.sh votedisk
[OK] Voting disks status check succeeded - ## STATE File Universal Id File Name Disk group -- ----- ----------------- --------- --------- 1. ONLINE 8dfc2a9528244f95bf87bb394e793995 (/dev/mapper/asm_ocr1) [OCR] Located 1 voting disk(s).
しかし、Nagiosマシンでは結果が間違っていました。
[nagios@ng1esp libexec]$ ./check_nrpe -2 -H 172.47.62.12 -t 60 -c check_crs_votedisk
[OK] Voting disks status check succeeded - Unable to communicate with the Cluster Synchronization Services daemon.
しかし、「clusterstatus」というスクリプトで他のオプションを有効にすると、すべてがうまく機能します。
[nagios@ng1esp libexec]$ ./check_nrpe -2 -H 172.47.62.12 -t 60 -c check_crs_clusterstatus
All clusterware services are up (clusterware version: Oracle High Availability Services release version on the local node is [19.0.0.0.0])