에서 실행 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 -
리터럴 텍스트로 세 번째 변수를 선언하려고 하면 올바르게 표시되기 때문에 이것이 작은따옴표 때문이라는 것을 알고 있습니다.
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])