이 스크립트를 작성하려고 합니다.
#!/bin/bash
libexec="/usr/local/nagios/libexec"
#hostname=$1
hostname="hostname1 hostname2 hostname3 hostname4 hostname5 hostname6"
nagios_ok=0
nagios_warning=1
nagios_critical=2
nagios_unknown=3
#if [[ $hostname == "" ]]; then
# echo "please enter a host to check"
# exit $nagios_unknown
#fi
for host in $hostname;
do
output=$(curl -s -i -H 'accept: application/json' -H 'x-xxx-webservice-client-id: apimonitoring' "http://$host/v4/catalog/category/5545" -H 'Host:api-local.dal.xxx.com' | grep "HTTP/1.1" | awk '{print $2}')
if [[ $output == "200" ]]; then
echo "STATUS: OK HTTP Response $output for $host"
# exit $nagios_ok (with the appropriate exit $nagios_ok)
else
echo "STATUS: NOT OK HTTP Response $output for $host"
# exit $nagios_critical (with appropriate exit $nagios_critical)
fi
done
출력이 정말 마음에 들지 않습니다.
STATUS: OK HTTP Response 200 for 10.xx.xx.xx
STATUS: OK HTTP Response 200 for 10.xx.xx.xx
STATUS: OK HTTP Response 200 for 10.xx.xx.xx
STATUS: NOT OK HTTP Response for 10.xx.xx.xx
STATUS: OK HTTP Response 200 for 10.xx.xx.xx
STATUS: NOT OK HTTP Response for 10.xx.xx.xx
나는 이런 것을 원한다
STATUS: OK HTTP Response 200 for 10.xx.xx.xx, 10.xx.xx.xx, 10.xx.xx.xx, etc ..
STATUS: NOT OK HTTP Response 404 for 10.xx.xx.xx, 10.xx.xx.xx, 10.xx.xx.xx, etc..
당신의 도움을 주셔서 대단히 감사합니다
답변1
Bash에서 배열을 사용하면 코드를 더 쉽게 읽고 유지 관리할 수 있습니다.
#!/bin/bash
libexec="/usr/local/nagios/libexec"
# for command line arguments:
hostnames=("$@")
# or to hardcode them:
hostnames=(hostname1 hostname2 hostname3 hostname4 hostname5 hostname6)
nagios_ok=0
nagios_warning=1
nagios_critical=2
nagios_unknown=3
curl_opts=(
--silent
--head
--output /dev/null
--write-out '%{http_code}'
--header 'accept: application/json'
--header 'x-xxx-webservice-client-id: apimonitoring'
--header 'Host:api-local.dal.xxx.com'
)
# an associative array
declare -A host_codes
for host in "${hostnames[@]}"; do
code=$(curl "${curl_opts[@]}" "http://$host/v4/catalog/category/5545")
host_codes["$code"]+="$host, "
done
for code in "${!host_codes[@]}"; do
[[ $code == 2* ]] && ok="OK" || ok="NOT OK"
echo "STATUS: $ok HTTP Response $code for ${host_codes["$code"]%, }"
done
종료 상태를 설정하려면 다음을 수행할 수 있습니다.
status=$nagios_ok
for code in "${!host_codes[@]}"; do
case $code in
2*) ok="OK" ;;
*) ok="NOT OK"; status=$nagios_critical ;;
esac
echo "STATUS: $ok HTTP Response $code for ${host_codes["$code"]%, }"
done
exit $status