Posts tagged ‘nrpe’

NRPE: Could not complete SSL handshake.

Сегодня столкнулся с такой ошибкой при настройке NRPE:

CHECK_NRPE: Error - Could not complete SSL handshake.

Долгие мучения настроек и гугления заняли несколько часов, но по итогу оказалось что указываемые в опции allowed_hosts хосты должны быть разделены только запятыми, а я по привычке после запятой поставил пробел. В итоге следующая стока давала не очевидную ошибку

allowed_hosts=127.0.0.1, 192.168.0.2

Nagios plugins: поиск больших логов на серверах

У серверов работающих 24х7 есть один неприятный момент, программное обеспечение работающее так долго, умудряется наделать лог-файлов на несколько «гигтаробайт» и не ротировать их. Как оказалось не всем приложениям это нравится, к примеру Oracle может «убиться» без объяснения причин при размере лога более 2 Гб, похожими проблемами страдает и Apache и бог знает что еще. Поэтому в какой-то момент возникла идея создания модуля для поиска слишком «жирных» логов, и прикручивания его к Nagios.

Ниже описан принцип работы, конфигурирование самого модуля, NRPE и Nagios и исходники скриптов.

P.S.
Взято из рабочей FAQ, поэтому при возникновении вопросов просьба задавать их в коментариях.

1. Принцип работы

На рисунке ниже показан показан принцип работы проверки, check_log_size.


Рисунок 1 Диаграмма работы модуля find_log

Каждый день по cron`у в 02.00 на сервере запускается скрипт find_logs_misc.pl, этот скрипт основываясь на файле конфигурации /usr/local/nagios/etc/find_log_misc.conf (см. ниже) ищет большие логи.

Результаты своей работы он записывает в /tmp/nrpe_check_log.tmp.

Первой строкой в файле прописывается день в который происходил поиск, 2й и далее прописываются пути к найденным файлам, если они есть. Т.е. файлnrpe_check_log.tmp с содержимым:

20-04-09
/usr/local/apache/logs/ssl_engine_log

означает что проверка была проведена 20 апреля 2009 года, найден файл ssl_engine_log.

2. Конфигурирование

2.1 Конфигурирование самого модуля

Cron

В файле /etc/crontab добавляем новую строку:

00 2 * * * root /usr/local/nagios/libexec/find_log_misc.pl 2 > /dev/null

Опции конфиг-файла

Информацию необходимую для настройки проверки можно найти в самом файле конфигурации (/usr/local/nagios/etc/find_log_misc.conf).

maxfilesize -размер файлов которые нужно искать, в килобайтах
include -директория (файл) в которой нужно искать файлы
exclude -директория (файл) которую нужно исключить из поиска
exclude_ext -расширение файла (не зависит от регистра)

Внутри конфиг файла можно использовать коментарии, все что находится после знака «#» считается коментарием.

Пример:

maxfilesize=1500000k  # искать файлы больше ~1.5Gb
include=/usr/         # искать в /usr/
exclude=/usr/share/   # не искать в /usr/share
exclude_ext=gz        # не учитывать файлы *.gz

По умолчанию поиск файлов не происходит, т.е. для того чтобы скрипт вообще искал хоть что-то нужно указать как минимум один include.

В опциях include и exclude можно использовать выражения подобные regex в Perl.
Т.е. к примеру такая запись:

exclude=/usr/share/tmp?/   # не искать в /usr/share/tmp?/

означает, что исключить из поиска нужно все папки tmp1, tmp2 и т.д., но не tmp11 или tmp.20092004

Внимание, если вы не собираетесь использовать regex, значит во всех параметрах специальные символы («.»,»*»,»?») должны быть экранированы, т.е. вместо «.» должно быть «\.» и т.д.

2.2 Конфигурирование NRPE

В файл конфигурации NRPE (по умолчанию /usr/local/nagios/etc/nrpe.cfg) добавляем строку для новой проверки:

command[check_log_size]=/usr/local/nagios/libexec/check_log_size.pl

Перезагружаем NRPE (если вы еще не пользуетесь xinetd).

Копипастим конфиг (см. ниже или выше) в файл /usr/local/nagios/etc/find_log_misc.conf.

Ручками запускаем скрипт поиска логов /usr/local/nagios/libexec/find_log_misc.pl и ждем завершения его работы. Смотрим содержимое файла /tmp/nrpe_check_log.tmp, если там одна строчка с сегодняшней датой все ОК, если нет, то были найдены логи (или просто большие файлы), делаем нужные операции (например создаем правило в logrotate) или меняем конфиг модуля с исключением нужного файла (см. выше) и пробуем еще раз.

Теперь проверяем как это работает, с сервера с Nagios выполняем команду:

[root@nagiosfan ~]# /usr/local/nagios/libexec/check_nrpe -H server_ip -c check_log_size
OK: No big logs found

Если ответ у вас другой, возможно у вас проблемы с NRPE (например вы выключили SSL в NRPE, тогда стоит добавить ключ «-n» в chech_nrpe).
Теперь нужно настроить сам Nagios.

2.3 Конфигурирование Nagios

В конфигах Nagios добавляем новую команду (про опцию «-n» смотрим выше):

define command{
	command_name			check_nrpe_log_size
	command_line			$USER1$/check_nrpe -n -H $HOSTADDRESS$ -c check_log_size
}

Теперь можно добавить новый сервис к нашему серверу (я использую временной отрезок равный 1 с ):

define service{
	host_name			server_name
	service_description		LOGS
	use				generic-service
	max_check_attempts		2
	normal_check_interval		43200
	retry_check_interval		10800
	notification_interval		43200
	notification_options		u,c,r
	contact_groups			admins
	check_command			check_nrpe_log_size
}

Новый сервис будет проверять логи каждые 12 часов с повтором в 3 часа в случае проблем, 3 часа нужны для перехода через 12 часов, т.е. когда проверка выполняется в час ночи в файле /tmp/nrpe_check_log.tmp будет выведена еще вчерашняя дата, т.к. cron еще не отрабатывал.

По хорошему нужно сделать service template для проверок логов, но т.к. это только пример, здесь это не показано.

Все перезагружаем Nagios, смотрим что все хорошо и ждем новых логов :) .

3. Конфиг по умолчанию:

maxfilesize=1000000k
include=/
exclude=/proc/

4. Код скрипта /home/nrpe/libexec/check_log_size.pl

Это скрипт для NRPE

#!/usr/bin/perl -w
#NRPE module for checking log`s size
#
my $search_result='/tmp/nrpe_check_log.tmp';
my $line;
my $cur_date = `date +%d-%m-%y`;
my $res_date;
#Open result file
unless(open(RESULT,'<',$search_result))  {
          print "CRITICAL: Error when opening file $search_result: $!\n";
          exit 2;
}
#Get date of last checking
$res_date =   <RESULT>;
$res_date =~ s/[\n\t\s]+//g;
$cur_date =~ s/[\n\t\s]+//g;
 
if($res_date eq '')
{
       print "CRITICAL: Date string is empty!!!\n";
       exit 2;
}
#Check if date of last check quival `now`
unless($cur_date eq $res_date)
{
       print "CRITICAL: dates not equival - $cur_date != $res_date\n";
       exit 2;
}
#
if(defined($line = <RESULT>))
{
       print "CRITICAL: Some big logs were found...\n";
       print $line;
       while(defined($line = <RESULT>))
       {
               print $line;
       }
       exit 2;
}
 
print "OK: No big logs found\n";
 
close(RESULT);

5. Код скрипта /home/nrpe/libexec/find_log_misc.pl

Этот скрипт нужно добавить в Cron

#!/usr/bin/perl
#
#       Script for searching big logs (misc)
# nrpe script: /home/nrpe/libexec/check_log_size.pl
#
my $filename = '/usr/local/nagios/etc/find_log_misc.conf';
my $line;
my $include_path;
my $exclude_path;
my $find;
my $file_size;
my $search_result='/tmp/nrpe_check_log.tmp';
 
open(CONF_FILE,'<',$filename) or die "Cant open $filename: $!"; 
open(SEARCH_RESULT,'>',$search_result)or die "Cant open file $filename: $!";
 
while(defined($line=<CONF_FILE>))
{
$line =~ s/[\n\t\s]+//;
$line =~ s/#.*//;
if($line =~ /^include=(.+)$/)
{
        $include_path.= "$1 ";
}
if($line =~ /^exclude=(.+)$/)
{
        if(defined($exclude_path))
        {
                $exclude_path.= "-and \\! -regex '^$1.*' ";
        }else { $exclude_path.= "\\! -regex '^$1.*' "; }
}
if($line =~ /^exclude_ext=(.+)$/)
{
         if(defined($exclude_path))
         {
                $exclude_path.= "-and \\! -iregex '.*\\.$1\$' ";
         }else { $exclude_path.= "\\! -iregex '.*\\.$1\$' "; }
 
}
if($line =~ /^maxfilesize=(.+)$/)
{
        $filesize="-size +$1";
}
}
$find = "find $include_path $exclude_path $filesize";
 
#TODO: delete next line [DEBUG]
# print $find;
 
print SEARCH_RESULT `date +%d-%m-%y`;
print SEARCH_RESULT `$find`;
 
close(CONF_FILE);
close(SEARCH_RESULT);

Сага о Nagios: Написание плагинов для Nagios/NRPE/NSClient++

Вданной статье дается описание механизму написания собственных, нестандартных скриптов(сервисов/проверок) для Nagios.

Оригинал: Nagios Plugin API

Другие ресурсы

Если вы собираетесь писать собственные плагины для Nagios, ознакомтесь со следующими ресурсами:

Обзор плагинов

Скрипты и бинарные файлы должны выполнять две следующие функции (как минимум), чтобы считать их плагинами для Nagios:

  • При выходе вернуть один из возможных кодов возврата (см. ниже)
  • Вернуть как минимум одну строку текста в STDOUT

Внутренне устройство вашего плагина абсолютно безразлично для Nagios. Ваш плагин может проверять статус TCP порта, выполнять запрос к базе данных, проверять место на диске, или делать еще что-то, что вам необходимо проверять. Детали о будут зависеть только от того что вы хотите проверять.

Коды возврата

Nagios различает статус сервиса или хоста по возвращаемым плагином кодом возврата. Таблица ниже показывает список возможных кодов возврата, вместе с расшифровкой их значений.

Код возврата плагина Состояние сервиса Состояние хоста
0 OK UP
1 WARNING UP or DOWN/UNREACHABLE*
2 CRITICAL DOWN/UNREACHABLE
3 UNKNOWN DOWN/UNREACHABLE

Note Замечание: Если опция use_aggressive_host_checking включена, код 1 в возврате плагина проверки хоста будет означать DOWN или UNREACHABLE. Иначе 1 будет означает что хост в состоянии UP. The process by which О том как Nagios определяет находиться в состоянии DOWN или UNREACHABLE можно прочесть здесь here.

Описание вывода плагинов

Плагин должен вывести как минимум одну строку текста на консоль (STDOUT). Начиная с Nagios версии 3, плагины могут, пожеланию, выводить несколько строк текста. Плагин также может выдавать данные о динамике (perfomance) которые будут обработаны сторонними приложениями (к примеру программами ) Стандартные примеры вывода плагиноа привидены ниже:

TEXT OUTPUT | OPTIONAL PERFDATA
LONG TEXT LINE 1
LONG TEXT LINE 2

LONG TEXT LINE N
| PERFDATA LINE 2
PERFDATA LINE 3

PERFDATA LINE N

Performance данные (показаны оранжевым) не обязательны. Если скрипт возвращает perfomance данные в своем выводе, значит они должны отделятся от остального вывода вертикальной чертой (|). Дополнительные линии длинного вывода плагина (более 1й чтроки)(выделены синим) также не обязательны.

Примеры выводов плагинов

Давайте рассмотрим примеры возможных выводов плагинов…

Пример 1: Одна строка вывода(только текст)
Предполжим что у нас есть плагин который выводитодну строку как показано в примере:

DISK OK – free space: / 3326 MB (56%);

Если этот плагин будет использован для выполнения проверки, данная строка бкдет передана в переменную $SERVICEOUTPUT$.

Пример 2: Одна строка вывода(текст и perfdata)
Плагин может возвращать perfomance-данные которые могут использованы сторонними приложениями (к примеру построителем графиков в Centreon или NagiosGrapher). Не забывает отделять perfomance данные вертикальной чертой (|):

DISK OK – free space: / 3326 MB (56%);
|
/=2643MB;5948;5958;0;5968
Если плагин используется для предоставления данных о проверке,
красная
часть (левее вертикальной черты) будет сохранена в макрос $SERVICEOUTPUT$,
оранжевая
часть (правее разделителя) будет сохранена в макрос $SERVICEPERFDATA$.

Пример 3: Несколько строк вывода (текст и perfdata)
Плагин возвращает несколько строк основных и perfdata:

DISK OK – free space: / 3326 MB (56%); | /=2643MB;5948;5958;0;5968
/ 15272 MB (77%);
/boot 68 MB (69%);
/home 69357 MB (27%);
/var/log 819 MB (84%); | /boot=68MB;88;93;0;98
/home=69357MB;253404;253409;0;253414
/var/log=818MB;970;975;0;980

Красным помечен вывод проверки, помещается в макрос $SERVICEOUTPUT$. Оранжевым помеченыстроки (текст) который будет помещен в макрос $SERVICEPERFDATA$. Синим помечены 2 – 5 строки вывода будут соединены (с экранированием переводов строк) и помещены в макрос $LONGSERVICEOUTPUT$.

В итоге значения макросов будут следующими:

Макрос Значение
$SERVICEOUTPUT$ DISK OK – free space: / 3326 MB (56%);
$SERVICEPERFDATA$ /=2643MB;5948;5958;0;5968 /boot=68MB;88;93;0;98 /home=69357MB;253404;253409;0;253414 /var/log=818MB;970;975;0;980
$LONGSERVICEOUTPUT$ / 15272 MB (77%);\n/boot 68 MB (69%);\n/var/log 819 MB (84%);

[...]

Требования к длинне вывода плагинов

Nagios читает первые 4 KB данных возвращаемых плагином. Это сделано для предотвращения ситуаций, когда плагин будет отдавать мегабайты и гигабайты данных обратно Nagios`у. Лимит в 4 KB можно легко изменить если необходимо. Просто измените значение MAX_PLUGIN_OUTPUT_LENGTH в файле include/nagios.h.in исходных кодов и пересоберите Nagios. Ничего больше изменять ненужно!

Примеры

Если вам нужны примеры плагинов вы можете скачать официальные плагины для Nagios, там вы сможете найти примеры на C, Perl и shell. Информацию о получении официальных плагинов вы можете найти здесь.

Perl плагины

Одна и возможностей Nagios это встроенный интерпритатор Perl который позволяет выполнять плагины быстрее. Больше информации о том как писать плагины с использование встроенного Perl можно найти здесь.


Сага о Nagios: чекаем в труднодоступных местах (NSClient++)

NSClient++

В прошлой статье (http://stproject.blogspot.com/2009/02/nagios-nrpe.html) я рассказывал о том как можно проверять удаленные *nix хосты с помощью NRPE. С помощью NRPE можно проверять Unix системы, но как показывает практика мир не идеален и приходиться работать еще и с Windows.
Сегодня речь пойдет о мониторинге Windows серверов с помощью Nagios, NSClient++ и команды check_nrpe.

Немного истории

Изначально для проверки Windows серверов предлагалось использовать SNMP или утилиту NSclient. Запас возможностей NS был очень мал, его приходилось «подстраивать» под каждую конкретную версию/локализацию Windows, к тому же в мире *nix программа написанная на Delphi будет использоваться с подозрениям, из религиозных соображений :) . В общем проект со временем заглох и перестал развиваться (последняя версия считает Windows 2000 новинкой).

Со временем появилась альтернатива: NSClient++, он был написан на C++, обладал внушительным арсеналом встроенных проверок и возможностью создания новых, работающим с несколькими протоколами и т.д.

Общая информация

На данный момент NSClient++ поддерживаются следующие ОС:

  • NT4 (SP5?)
  • Windows 2000 W2K
  • Windows XP
  • Windows 2003
  • Windows Vista

[мной протестирован на Windows Server 2008 x86/64 в основном работает]

Поддерживаемые архитектуры:

  • Win32
  • x64 (AMT64/EMT64)
  • IA64 (Itanium)

Поддерживаемые протоколы:

  • nsclient (устаревший)
  • NRPE

Установка NSClient++

Начинаем как всегда со скачки NSClient++ с официального сайта: http://trac.nakednuns.org/nscp/downloads
Будьте внимательны, выберите последнюю версию для своей архитектуры, лучше всего выкачивать MSI архивы, т.к. в будущем можно автоматизировать процесс установки.

Устанавливаем клиент со стандартными настройками, возможно вам стоит включить NSClient++-tray, этот модуль будет показывать в трее иконку по клику на которую можно посмотреть лог работы клиента.
В процессе установки по идее не должно быть ошибок или подводных камней, поэтому перейдем к самому интересному.

Настройка NSClient++

Если вы ставили NSClient++ со стандартными параметрами, то файл конфигурации должен находиться по адресу: C:\Program Files\NSClient++\SNC.ini

Для редакторования конфига лучше всего использовать какой-нибудь текстовый редактор с подсветкой синтаксиса, т.к. от количества коментариев может конфиг становиться почти нечитабельным.
Формат файла как у типичного ini файла Windows, конфиг разбит на категории [category name], параметры описываются по правилу «varible=value».

[modules]
В этом разделе описывается какие модули будут включены в NSC++ (по умолчанию все выключены). Включить/выключить модуль можно убрав или поставив комментарий перед названием модуля.

Я не буду описывать все возможные модули, только те которые в первую очередь необходимы.

FileLogger.dll – модуль «пишущий» лог проверок
CheckSystem.dll – модуль для проверки основных параметров системы
CheckDisk.dll – модуль для проверки дисков
NRPEListener.dll – модуль «прослушивания» порта «NRPE» (позволяет проверять с помощью команды check_nrpe)
SysTray.dll – модуль который показывает иконку в трее для управления NSClient++
CheckEventLog.dll – модуль позволяющий проверять EventLog

эти модули можно включить убрав напротив них комментарии.

[Settings]

allowed_hosts – список хостов с которых будет производиться проверка (хосты прописываются через запятую).

use_file – если равен «1″, то конфигурацию для NSClient++ нужно брать из этого ini файла, если «0″ то параметры будут перенесены в реестр (поверьте удобнее 1 :) ).

[NRPE]

секция отвечает за настройки модуля прослушивания NRPE
port – порт который будет слушать NSClient++ (по умолчанию 5666)
allow_arguments – если >0 значит команды проверки млгут использовать аргументы, в виде $ARAG1, $ARG2…
use_ssl – если «1″ то использовать SSL если «0″, то нет (если SSL выключен, то команда check_nrpe должна выполняться с опцией «-n»)

[NRPE Handlers]

здесь можно описать команды в стиле NRPE:

check_hello=scripts\hello.bat

Папка «scripts» должна должна быть создана в папке с установкой NSCleint++ (C:\program Files\NSClient++\).

После окончания настройки перезагрузите сервис NSClient++

net stop nsclientpp
net start nsclientpp

Настройка Nagios

Конфигурирование проверок хостов с NSClient++ ничем не отличается от NRPE.

Объявление команды для Nagios («-n при выключенном SSL»):

define command{
command_name                    check_nsc_load
command_line                    $USER1$/check_nrpe -n -H $HOSTADDRESS$ -c checkCPU -a MaxWarn=89% MaxCrit=90% time=5m ShowAll
}

Описываем сервис:

define service{
host_name                               win-2008-server
service_description             LOAD
use                             LOAD-service
check_command                   check_nsc_load
}

Все можем пользоваться.

Вот список некоторых команд с параметрами (полный список)

Max – максимум
Min – минимум
Warn – предупреждение
Crit – критический
Free – свободно
Used – импользовано
ShowAll – если есть то выводиться более подробная информация о проверке

CheckDriveSize
Проверка диска/дисков.

Аргументы:

MaxWarnFree
MaxCritFree
MinWarnFree
MinCritFree
MaxWarnUsed
MaxCritUsed
MinWarnUsed
MinCritUsed
Drive – буква диска, если опустить то проверяются все диски
FilterType – занчения, FIXED, CDROM, REMOVABLE, REMOTE (по умолчанию FIXED)
CheckAll – проверить все диски
CheckAllOthers – проверить все диски в соответствии с Filter исключая те что были прописаны в Drive.

CheckCPU
Проверка загруженности CPU.

warn – процент загруженности
crit – процент загруженности
Time – время за которое считаеться загрузка (10m, 20s, 1h)
nsclient – режим совместимости с nsclient

CheckMem
Проверка памяти.

Показатели в %:
MaxWarn
MaxCrit
MinWarn
MinCrit

ShowAll – подробный вывод
type – (page, paged, virtual, physical), page – подкачка, physical – физической.

CheckServiceState
Проверка состояния системного сервиса.

ShowFail – если есть, то выводяться только те сервисы которые «не запустились»
service=state – поле «service» имя сервиса (лучше всего брать в ординарные кавычки » ‘ «) можно взять и Start->Run->srevices.msc

CheckAll – проверить что все сервисы у которых тип запуска «Auto start» запущены
exclude – имя сервиса исключаемого из checkAll
ShowAll – подробный режим


Проверка состояния процесса в памяти.

ShowAll – подробный режим
process=state – process – имя процесса, state – состояние (notepad.exe=started)
ignore-perf-data – не выдавать performance-date
(Max|Min)(Warn|Crit)Count – количество процессов

Полный список команд и параметров http://trac.nakednuns.org/nscp/wiki/CheckCommands