Назад | Перейти на главную страницу

Check_nrpe не может прочитать вывод скрипта

Скрипт находится на сервере:

#!/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 для каждого пользователя