Hlavní navigace

NSCA, NRPE a vlastné Nagios pluginy

22. 12. 2010
Doba čtení: 9 minut

Sdílet

V ďalšom pokračovaní seriálu o Nagiose si vysvetlíme, akým spôsobom testovať nielen lokálny server, kde beží Nagios, ale aj iné vzdialené servery. Niečo si povieme aj o nastavení práv v Nagiose, o písaní vlastných pluginov a ako odosielať pasívne výsledky na hlavný Nagios server.

NSCA, NRPE a vlastné Nagios pluginy

V ďalšom pokračovaní seriálu o Nagiose si vysvetlíme, akým spôsobom testovať nielen lokálny server, kde beží Nagios, ale aj vzdialené servery. Niečo si povieme aj o nastavení práv v Nagiose, o písaní vlastných pluginov a ako odosielať pasívne výsledky na hlavný Nagios server.

Na pasívne testovanie používa Nagios dva druhy programov a to NSCA (Nagios Service Check Acceptor) a NRPE (Nagios Remote Plugin Executor). Poďme si vysvetliť ich princíp:

NRPE démon (Nagios Remote Plugin Executor)

NRPE je démon (nrpe) a klient (check_nrpe) pre vykonávanie testovacích služieb na vzdialených serveroch. Tento program pracuje na princípe „vycucania“ výsledkov zo vzdialeného servera. Klientský program check_nrpe sa pripojí na serverovú časť nrpe vzdialeného servera, vykoná sa test a následne si „zoberie“ výsledky naspäť kde sa spracujú. Na Windows hosťoch môžete použiť program NSClient++.

NSCA démon (Nagios Service Check Acceptor)

NSCA je démon (nsca) a zároveň klient (send_nsca) pre prijímanie a odosielanie výsledkov o pasívnom testovaní. Tento program, ktorý chcem popísať v článku, pracuje na princípe „sprav test, odošli mi výsledky a ja ich spracujem.“ t.j. na vzdialenom serveri sa vykonajú potrebné testovanie služieb pomocou Nagios pluginov, klientským programom send_nsca sa odošlú výsledky (napr. skriptom), serverová časť NSCA hlavného Nagiosu to prijme a spracuje výsledky. Princíp je teda opačný ako pri NRPE. Ak je test pasívny, treba použiť v definícii define service parameter  check_dummy.

Ako zabezpečiť a nastaviť práva na webový frontend?

predchádzajúcom diele som písal, ako vytvoriť password backend pre Lighttpd. V súbore cgi.cfg môžete definovať práva na čítanie alebo kompletnú správnu webovej časti Nagiosu pre daného užívateľa. Pokiaľ chcete definovať viac užívateľov v jednom parametri, oddeľte ich čiarkou.

Konfiguračný súbor cgi.cfg:

....

# Užívatelia, ktorí majú povolený prístup na prezeranie systémových informácií.
authorized_for_system_information= nagiosadmin

# Užívatelia, ktorí majú povolený prístup na prezeranie všetkých konfiguračných informácií (hosts, commands, atď...). V predvolenom stave, môže užívateľ vidieť tieto informácie (o hosťoch a službách) iba vtedy, ak je zadefinovaný v kontaktoch pre daného hosťa.
authorized_for_configuration_information= nagiosadmin

# Užívatelia, ktorí majú povolené vypínať a reštartovať jednotlivé testy.
authorized_for_system_commands= nagiosadmin

# Užívatelia, ktorí majú povolené vykonávať všetko pre všetkých hosťov a služby, ktoré sú monitorované.
authorized_for_all_services= nagiosadmin
authorized_for_all_hosts= nagiosadmin

# Užívatelia, ktorí majú povolené vykonávať všetky príkazy pre všetkých hosťov a služby, ktoré sú monitorované.
authorized_for_all_service_commands= nagiosadmin
authorized_for_all_host_commands= nagiosadmin

....

Teraz si povieme niečo o konfiguračnom súbore send_nsca.conf, ktorý patrí serverovej časti programu NSCA.

Konfiguračný súbor send_nsca.conf:

# PID (process identification)
pid_file=/var/run/nsca.pid

# Port na ktorom počúva NSCA deamon. Musí byť vyšší ako 1024!
server_port=5667

# Lokálna IP adresa na ktorom bude počúvať NSCA deamon.
# Pokiaľ máte iba jednu sieťovú kartu, je táto hodnota pre vás irelevantná.
server_address=172.29.51.254

# Užívateľ pod ktorým beží NSCA démon.
# Pozor: táto hodnota je ignorovaná pokiaľ NSCA beží pod inetd alebo xinetd.
nsca_user=nagios

# Skupina pod ktorým beží NSCA démon.
# Pozor: táto hodnota je ignorovaná pokiaľ NSCA beží pod inetd alebo xinetd.
nsca_group=nagios

# Ladenie démona.
# Hodnoty: 0 = ladenie je vypnuté, 1 = ľadanie je zapnuté
debug=1

# HESLO, ktoré sa použije na dekryptovanie prichádzajúcich packetov z iného servera.
# Každý server musí mať také isté heslo pokiaľ chcete, aby sa dáta úspešne prijali!
password=heslo_v_plain_texte

# DECRYPTION METHOD
# Všetky informácie ktoré pošle NSCA deamon po sieti sú posielané zašifrované pomocou nejakej šifry, ktorú si tu zadefinujete. Teda pokiaľ nezadáte voľbu # "none" samozrejme :).

# Možnosti:
#
#       0 = None        (neodporúča sa)
#       1 = Simple XOR
#       2 = DES
#       3 = 3DES (Triple DES)
#       4 = CAST-128
#       5 = CAST-256
#       6 = xTEA
#       7 = 3WAY
#       8 = BLOWFISH
#       9 = TWOFISH
#       10 = LOKI97
#       11 = RC2
#       12 = ARCFOUR
#       14 = RIJNDAEL-128
#       15 = RIJNDAEL-192
#       16 = RIJNDAEL-256
#       19 = WAKE
#       20 = SERPENT
#       22 = ENIGMA (Unix crypt)
#       23 = GOST
#       24 = SAFER64
#       25 = SAFER128
#       26 = SAFER+
decryption_method=3

Server, ktorého pasívne testovania chceme prijímať musí tieto testovania robiť sám pomocou Nagios plugins a skriptu ktorý to vykoná a pošle pomocou send_nsca hlavnému Nagios serveru, t.j. „hlavnému zberaču dát“. Skript môže vyzerať následovne:

#!/bin/sh
#
# NSCA monitoring script
#
# Copyright (C) 2010 Martin Matuska, VX Solutions s. r. o.
# Bratislava, Slovakia
#
HOST=example.org
NSCA=/usr/sbin/send_nsca
PLUGINS=/usr/lib/nagios/plugins
ARGS="-H [IP adresa hlavného servera] -c /usr/local/etc/send_nsca.cfg"

check () {
SERVICE=$1
RETURN=`${2}`
EXIT=$?
echo -e $HOST"\t"$SERVICE"\t"$EXIT"\t"$RETURN
}

{
check "Current Users" "$PLUGINS/check_users -w 10 -c 30"
check "System Load" "$PLUGINS/check_load -w 15,10,5 -c 30,25,20"
check "Total Processes" "$PLUGINS/check_procs -w 250 -c 350"
check "HTTP Status" "$PLUGINS/check_http_status -H www.google.com -s 200"
check "DNS" "$PLUGINS/check_dns -H www.google.sk"
check "Disk /disk" "$PLUGINS/check_disk -w 20% -c 10% -p /disk"
check "Disk /home" "$PLUGINS/check_disk -w 20% -c 10% -p /home"
check "Disk /" "$PLUGINS/check_disk -w 10% -c 5% -p /"
check "Disk /boot" "$PLUGINS/check_disk -w 10% -c 5% -p /boot"
} | ${NSCA} ${ARGS}

Tento skript vykoná pomocou Nagios plugins jednotlivé testovania podobne ako keby sa spúšťali skripty ručne v konzole. Ak sa vykoná tento skript, musí vypísať „9 data packet(s) sent to host successfully.“. Potom je všetko v poriadku. V opačnom prípade skontrolujte premenné NSCA, PLUGINS, HOSTARG.

Súbor pre klientskú časť NSCA send_nsca.cfg môže vyzerať takto:

password=[heslo_v_plain_texte] ; heslo na dešifrovanie paketov. Musí byt zhodné s heslom na hlavnom Nagios serveri!
encryption_method=3            ; šifrovacia metóda, taktiež musí byť zhodná s metódou na hlavnom Nagios serveri!

Potom pokiaľ je všetko v poriadku, mali by sme vidieť na hlavnom Nagios serveri v logu /var/spool/nagios/nagios.log následovné:

[root@example.org:/]# tail /var/spool/nagios/nagios.log
[1289082902] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;moj_server;Disk /;0;DISK OK - free space: / 54045 MB (63% inode=89%);|=30975MB;80613;85092;0;89571
[1289082902] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;moj_server;Disk /boot;0;DISK OK - free space: /boot 130 MB (70% inode=99%);| /boot=53MB;173;183;0;193
[1289082902] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;moj_server;Disk /tmp;0;DISK OK - free space: / 54045 MB (63% inode=89%);| /=30975MB;71656;80613;0;89571

Prosím všimnite si, že hostname servera moj_server musí byť totožný s hostname, ktorý definujeme na hlavnom Nagios serveri! V opačnom prípade nám bude síce NSCA prijímať externe testovania, ale nebude ich vedieť priradiť k serveru.

Custom Nagios pluginy

V Nagiose je možné si ľahko vytvoriť vlastné testy, ktoré sa vyhodnotia podľa vašich predstáv. Podmienkou je, aby jednotlivé výstupy zo skriptu vrátili nejaký exit (návratový) kód (0 až 3). Ukážem vám môj vlastnoručný skript napísaný v Bashi. Tento skript testuje či je HDD „zdravý“, nevykazuje žiadne vady a teplotu disku zo S.M.A.R.T. pomocou programu SmartMonTools.

Všetky hodnoty by mali mať hodnotu 0, inak sa je pravdepodobné, že sa začína s diskom niečo diať! Ako ukazovatele zdravia disku berem do úvahy:

Spinup Retry Count = Počet prípadov, kedy sa platničky neroztočili po inicializácii disku. Môže byť problém s motorom alebo s ovládacou elektronikou.
Reallocated Sector Count = Označuje množstvo vadných sektorov premapovaných do záložnej oblasti disku.
Reallocation Event Count = Celkový počet úspešných i neúspešných pokusov o presun dát z poškodených sektorov.
Current Pending Sector Count = Počet podozrivých sektorov na disku.
Offline Uncorrectable Sector Count = Informuje o stave povrchu disku. Diagnostika je jednoduchá - u zdravého disku musí mať všetky tieto štyri atribúty nulovú hodnotu. Pokiaľ začne niektorá z týchto hodnôt rásť, znamená to vadné sektory.

Pre správnu funkčnosť skriptu je potrebné mať v systéme nainštalovaný program SmartMonTools, ktorý zisťuje stav harddisku zo S.M.A.R.T (Self-Monitoring, Analysis and Reporting Technology). Pokiaľ používate Linux prepíšte si cestu v skripte za: „/bin/bash“. Skript by mal fungovať na FreeBSD aj Linuxe.

#!/usr/local/bin/bash
#
ST_OK=0 # stav OK
ST_WR=1 # varovný stav (warning)
ST_CR=2 # kritický stav (critical)
ST_UN=3 # neznámy stav (unknown)
#
smartctl=$(which smartctl)
tmp=/tmp/smart.nagios

if [ `whoami` != root ]; then
    echo "Skript musíte spustiť ako root!"
    exit $ST_UK
fi

if [ -z $smartctl ]; then
        echo
        echo "Nemáte nainštalovaný program SmartMonTools. Prosím nainštalujte ho zo stránky http://smartmontools.sourceforge.net."
        exit $ST_UK
fi

if [ -z $1 ]; then
        echo "Prosím zvoľte HDD, ktorý chcete testovať. Syntax: check_hdd_health.sh /dev/ad0"
        exit $ST_UK
fi

$smartctl -a $1 > $tmp

smart_support=`cat $tmp | grep -i "SMART support is" | awk '{print $4}' | tail -1  | tr '[A-Z]' '[a-z]'`
test "$smart_support" != enabled && echo "Zrejme nemáte povolenú funkciu S.M.A.R.T.! Kontrola nebude preto možná alebo ste zvolili nesprávný HDD." && exit 1

srt=`cat $tmp | grep -i "Spin_Retry_Count" | awk '{print $10}'`
rsc=`cat $tmp | grep -i "Reallocated_Sector_Ct" | awk '{print $10}'`
rec=`cat $tmp | grep -i "Reallocated_Event_Count" | awk '{print $10}'`
cps=`cat $tmp | grep -i "Current_Pending_Sector" | awk '{print $10}'`
ou=`cat $tmp | grep -i "Offline_Uncorrectable" | awk '{print $10}'`
pass=`cat $tmp | grep -i "PASSED" | awk '{print $6}'`

if [ $srt = 0 ] && [ $rsc = 0 ] && [ $rec = 0 ] && [ $cps = 0 ] && [ $ou = 0 ] && [ $pass = PASSED ]; then
        echo "OK - HDD S.M.A.R.T health: srt=$srt, rsc=$rsc, rec=$rec, cps=$cps, ou=$ou, pass=$pass for $1. | smart=srt=$srt,rsc=$rsc,rec=$rec,cps=$cps,,ou=$ou,pass=$pass"
        exit $ST_OK
elif [[ $srt =~ [1-9] ]] && [[ $rsc =~ [1-9] ]] && [[ $rec =~ [1-9] ]] && [ $cps = 0 ] && [ $ou = 0 ] && [ $pass = PASSED ]; then
        echo "WARNING - HDD S.M.A.R.T health: srt=$srt, rsc=$rsc, rec=$rec, cps=$cps, ou=$ou, pass=$pass for $1. | smart=srt=$srt,rsc=$rsc,rec=$rec,cps=$cps,ou=$ou,pass=$pass"
        exit $ST_WR
else
        echo "CRITICAL - HDD S.M.A.R.T health: srt=$srt, rsc=$rsc, rec=$rec, cps=$cps, ou=$ou, pass=$pass for $1. | smart=srt=$srt,rsc=$rsc,rec=$rec,cps=$cps,ou=$ou,pass=$pass"
        exit $ST_CR
fi

Skript vyhodnocuje pomocou programu SmartMonTools hodnoty S.M.A.R.T z harddisku a pokiaľ zistí, že hodnoty Spinup Retry Count, Reallocated Sector Count, Reallocation Event Count, Current Pending Sector Count a Offline Uncorrectable Sector Count sú nulové, teda vracajú exit kód 0. Nastavil som aj stav „warning“ pokiaľ sú všetky hodnoty nulové okrem Spinup Retry Count (od hodnoty 1 do 9) a Reallocation Event Count (od hodnoty 1 do 9). Tuto sa vyhodnotí exit kód 1. V opačnom prípade nastáva stav „critical“ a nastaví sa hodnota 3.

Týmto druhým článkom by som chcel uzavrieť mini seriál o sieťovom monitorovacom programe Nagios. Dúfam, že som niekomu pomohol sa aspoň trochu zorientovať v konfigurácii. Samozrejme, že Nagios ponúka oveľa viac ako som popísal v článkoch. Toto sú iba základy a popisoval som vlastné skúsenosti s konfiguráciou. Správna konfigurácia však nie je na pár minút, ale na pár hodín až niekoľko dní :).

root_podpora

Odkazy:

Oficiálna stránka Nagiosu
Oficiálna stránka pluginov
Definície objektov

Byl pro vás článek přínosný?

Autor článku