Скрипт находится на сервере:
#!/bin/bash if [ ! $# == 1 ]; then echo "Usage check_cluster " fi; clu_srv=$1 error="stopped" error1="disabled" error2="recoverable" host1=`sudo /usr/sbin/clustat|grep $1| awk {'print $2'}` host2=`sudo /usr/sbin/clustat|grep $1| awk {'print $3'}` service1=`sudo /usr/sbin/clustat|grep $clu_srv| awk {'print $1'}` if [[ "$host2" == "$error" ]] || [[ "$host2" == "$error1" ]]; then echo "CRITICAL - Cluster $clu_srv service failover on $host1 and state is '$host2'" else echo "OK - Cluster $clu_srv service is on $host1 and state is '$host2'" fi; ##--EndScript
Он правильно получает аргумент из сценария. Когда я запускаю этот сценарий вручную на сервере из командной строки, он возвращает правильную информацию, например:
# /usr/local/nagios/libexec/check_rhcs-ERS NFSService OK - Cluster NFSService service is on NODE1 and state is 'started'
Но когда я попытался удаленно использовать скрипт (check_nrpe) с помощью следующей команды, он показал неверную информацию:
# ./check_nrpe -H localhost -c check_rhcs-ERS OK - Cluster NFSService service is on and state is ''
nrpe.cfg:
# command[check_rhcs-ERS]=/usr/local/nagios/libexec/check_rhcs-ERS NFSService
Что не так со скриптом, как исправить?
Ваш пользователь NRPE, скорее всего, не имеет разрешений на запуск команд с sudo
доступ.
Чтобы разрешить это, вы можете добавить строку ниже в свой /etc/sudoers
файл с использованием visudo
. Вы также можете опустить NFSService
часть, если вы не хотите ограничивать эту часть.
nrpe ALL=(ALL) NOPASSWD: /usr/sbin/clustat NFSService
Тем не менее, ваш сценарий действительно нуждается в улучшении. Также требуется только один параметр, а не три - $2
и $3
переменные awk
аргументы, а не bash
параметры.
Моя частично отредактированная версия ниже:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage check_cluster " >&2
exit 1
fi
clu_srv=$1
error="stopped"
error1="disabled"
error2="recoverable"
host1=$(sudo /usr/sbin/clustat | grep "${clu_srv}" | awk '{ print $2 }')
host2=$(sudo /usr/sbin/clustat | grep "${clu_srv}" | awk '{ print $3 }')
service1=$(sudo /usr/sbin/clustat | grep "${clu_srv}" | awk '{ print $1}')
Часть вашего скрипта, связанная с обработкой ошибок, нуждается в разъяснении - какие условия вы хотите отловить? Ваш OK
вывод дает статус для host2
, но говорит, что услуга включена host1
.
Если вы правильно настроили sudo, вероятно, проблема с Requiretty
, вы должны указать sudo не требовать для nrpe.
Видеть sudoers: как отключить requiretty для каждого пользователя