Nagios: monitorovanie počítačovej siete

15. 12. 2010
Doba čtení: 11 minut

Sdílet

V dnešnom článku by som chcel priblížiť zrejme najznámejší a najpoužívanejší sieťový monitorovací program Nagios. Nagios ponúka komplexné lokálne a vzdialené testovanie serverových služieb. Poďme sa pozrieť, ako testovať servery a mať vašu počítačovú sieť „pod palcom“.

Čo Nagios dokáže?

Nagios je názov rekurzívnym akronymom slovného spojenia N.A.G.I.O.S. – „Nagios Ain't Gonna Insist On Sainthood“, čo by sa do slovenčiny dalo voľne preložiť ako: „Nagios, nie je pripravený stať sa svätým“. Tento projekt mal pôvodne názov Netsaint, v roku 2002 bol ale premenovaný na Nagios. Nagios vie testovať najrôznejšie sieťové služby ako sú: ping, veľkosť diskových kvót, bežiace procesy, zaťaženie systému, system uptime, vyťaženosť procesorov, S.M.A.R.T test HDD atď… Program je vydávaný pod licenciou GNU GPL, čiže je voľne k dispozícii na osobné a aj komerčné použitie a je ho možné kopírovať, distribuovať, modifikovať. Samotné jadro Nagiosu nevie testovať žiadne služby. Na túto prácu slúžia tzv. zásuvné moduly (pluginy). Tieto pluginy sú maličké programy a skripty, ktoré vykonávajú testy jednotlivých služieb. Výstup (stdout) na terminál musí obsahovať do 80 znakov a návratový kód od hodnoty 0 do 3. Neskôr vysvetlím, čo znamenajú tieto čísla.

Teraz by som chcel vysvetliť, aké stavy vie Nagios z pluginov vyhodnotiť:

OK = 0 Plugin je schopný otestovať službu a je vyhodnotený ako korektne pracujúca služba.
Warning = 1 Plugin je schopný otestovať službu, avšak je vyhodnotený ako „warning“, pretože dosiahol varovnú hodnotu zadefinovanú administrátorom.
Critical = 2 Plugin vyhodnotí stav „critical“, pokiaľ daná službu z nejakého dôvodu nebeží alebo dosiahol kritickú hodnotu zadefinovanú administrátorom.
Unknown = 3 Plugin vyhodnotí stav ako „unknown“, pokiaľ plugin nie je schopný otestovať službu, nie je schopný prečítať dáta z pasívneho testu alebo nastala neznáma chyba, všeobecná chyba.

Aké meracie metódy Nagios používa?

Meracie metódy môžeme rozdeliť do dvoch skupín:

   1. Pasívne
   2. Aktívne

Pasívne monitorovanie:

Cieľom pasívneho monitorovania je iba počúvanie sieťového prenosu na sieti, pričom do siete nie sú posielané žiadne testovacie pakety. Výhoda tejto testovacej metódy je tá, že nezaťažuje dodatočne počítačovú sieť.

Aktívne monitorovanie:

Aktívne monitorovanie sa spolieha na schopnosť aplikácie testovacích paketov do siete, alebo posielania paketov na servery, čím vlastne meria a sleduje ich služby. Nevýhoda tohto testovania je tá, že testovanie má za následok aj možné zvýšenie zaťaženia siete a niekedy aj jej preťaženie.

Ako vie Nagios oznamovať vzniknuté problémy?

1. V prípade vzniknutého problému bude administrátor upozornený pomocou emailovej správy.
2. V prípade vážnejšieho problému bude administrátor upozornený pomocou SMS správy.

Inštalácia Nagiosu a NSCA

Nagios som inštaloval na operačnom systéme FreeBSD 8.1 Stable s aktuálnymi portami. Na čo slúži NSCA program si vysvetlíme neskôr.

1. portinstall nagios nagios-plugins nsca
2. V súbore /etc/rc.conf je nutné pridať nasledujúce riadky, ktoré mi zaručili automatické spúšťanie po štarte systému:

 nagios_enable="YES"
nsca_enable="YES"

3. Ako webserver som použil lighttpd-1.4.28_4 a do lighttpd.conf som pridal následovné hodnoty:

 # nastavenie document rootov priečinkov "/nagios/" a "/nagios/cgi-bin/"
alias.url       += ("/nagios/cgi-bin/" => "/usr/local/www/nagios/cgi-bin")
alias.url       += ("/nagios/" => "/usr/local/www/nagios")

# zapnutie akceptovanie .cgi prípon súborov
$HTTP["url"] =~ "/cgi-bin/" {
      cgi.assign = ( ".cgi" => "" )
}

## definovanie typu autentifikácie
auth.backend    = "htpasswd"

## umiestnenie súbora s meno a heslom (hash)
auth.backend.htpasswd.userfile = "/usr/local/etc/nagios/htpasswd.users"

# zapnutie autentifikácie pre priečinok "nagios"
auth.require = (
                 "/nagios" =>
                  (
                        "method" => "basic",
                        "realm" => "Nagios login",
                        "require" => "valid-user"
                  )
)

4. V konfiguračnom súbore modules.conf odkomentujeme:

server.modules = (
  "mod_auth",       # podpora autentifikácie
  "mod_fastcgi"     # podpora fastcgi
)

5. Následne si vytvoríme password backend príkazom:

htpasswd -c /usr/local/etc/nagios/htpasswd.users [user]

6. V súbore cgi.cfg musíte definovať práva na čítanie alebo kompletnú správu webovej časti Nagiosu pre daného užívateľa [user].

7. Nakoniec treba otestovať, či sa spustí webové rozhranie:

http:///nagios

Objekty (objects)

Nagios používa na definovanie testovaných služieb tzv. objekty. Sú to konfiguračné súbory definované v konfiguračnom súbore nagios.cfg. Tieto objekty konfiguračných súborov sa umiestňujú zväčša do priečinka „objects“.

Definovanie hosťov cfg_dir=/usr/lo­cal/etc/nagios/ob­jects/hosts.cfg
Definovanie monitorovaných služby cfg_dir=/usr/lo­cal/etc/nagios/ob­jects/services­.cfg
Definovanie kontaktov cfg_file=/usr/lo­cal/etc/nagios/ob­jects/contacts­.cfg
Definovanie časových intervalov notifikácií cfg_file=/usr/lo­cal/etc/nagios/ob­jects/timeperi­ods.cfg
Definovanie príkazov cfg_file=/usr/lo­cal/etc/nagios/ob­jects/commands­.cfg
Definovanie kontaktných skupín cfg_file=/usr/lo­cal/etc/nagios/ob­jects/contactgrou­ps.cfg
Definovanie skupín pre hostiteľov cfg_file=/usr/lo­cal/etc/nagios/ob­jects/hostgrou­ps.cfg
Definovanie skupín pre služby cfg_file=/usr/lo­cal/etc/nagios/ob­jects/service­groups.cfg
Definovanie eskalácií cfg_file=/usr/lo­cal/etc/nagios/ob­jects/escalati­ons.cfg
Definovanie informácií o hosťoch cfg_file=/usr/lo­cal/etc/nagios/ob­jects/hosttes­xtinfo.cfg

Editácia konfiguračných súborov

Riadky, ktoré začínajú znakom „#“, sú považované za komentár a nebudú spracované.

Riadky, ktoré následujú po znaku „;“, sú považované za komentár a nebudú taktiež spracované.

Definovanie zariadení (Host Definition)

V tomto konfiguračnom súbore sa definujú monitorovacie zariadenia napr. pracovné stanice, servery, tlačiarne atď, ktoré majú IP adresu alebo hostname. Parameter check_command popisuje, aký zadefinovaný príkaz, ktorého definícia je popísaná v konfiguračnom súbore commands.cfg. Ďalším parametrom je max_check_attempts, ktorý udáva maximálny počet opakovaní testu, pokiaľ nebude zariadenie vyhodnotené s chybovým hlásením. Ak by nastala takáto udalosť, tak parametrom retry_interval sa určí hodnota v minútach za aký čas budú vykonávané ďalšie testy, inak sú testy vykonávané každé 4 minúty o čom hovorí parameter check_interval. Ďalej následuje flap detekcia čo znamená, že pokiaľ začnú kolísať stavy v krátkom časovom úseku, tak sa vypnú notifikácie, aby nás nezahltili notifikácie. Parameter notification_interval znamená, čas v sekundách ako často budú odosielané notifikácie administrátorov definovaných v contacts.cfg. Typ perióda notifikácií, je definovaná v timeperiods.cfg. V tomto prípade je to „24×7“, čo znamená neustále odosielanie notifikácií.

....

define host{
        name                            generic-host ; názov šablóny
        notifications_enabled           1       ; Notifikácie sú zapnuté
        event_handler_enabled           1       ; Zapisovanie udalostí do "even handlera" je zapnuté
        flap_detection_enabled          1
        process_perf_data               1       ; Povolenie logovanie všetkých stavov (ok, critical, warning) do logov
        retain_status_information       1       ; Uchováva informácie o stave ak sa program reštartuje
        retain_nonstatus_information    1       ; Retain non-status information across program restarts
        register                        0       ;
        }

define host{
        use                     generic-host ; použi "generic-host" šablónu
        name                    server       ; názov template
        active_checks_enabled   1        ; aktívne testovanie je zapnuté
        passive_checks_enabled  0            ; pasívne testovanie je vypnuté
        max_check_attempts      3        ; počet opakovaných testovaní, ak sa test nevyhodnotí ako "ok"
    check_interval      4
        notification_interval   120      ; interval notifikácií v sekundách
        notification_period     24x7
        notification_options    w,d,u,r      ; pri ktorých stavoch sa má posielať notifikácia: w=warning, d=down, u=up, r=recovery
        register                0
        host_name               example.org  ; hostname servera
        alias                   example.org  ; alias
        address                 82.zz.yy.xx  ; IP adresa servera
}

....

Parameter „notifcation_op­tions“

Parameter Význam
w varovný stav služby – WARNING
c varovný stav služby – CRITICAL
r varovný stav služby – RECOVERY
u varovný stav služby – UNREACHABLE
n oznámenia nebudú posielané

Definovanie služieb (Service Definition)

V tejto časti sa definujú služby, ktoré chceme testovať pomocou „!“, za ktorým následuje argument1, argument2, argumenent[n]… (check_mysql_qu­ery!argument1!ar­gument2!argume­nent[n]). Test je aktívny, pretože testujeme aktuálny systém kde beží Nagios a notification_period je nastavený na workhours, čo znamená, že v pracovné dni od 9:00 hodiny do 18:00 v podvečer.

....

define service{
        use                             generic-service
        name                            active
        active_checks_enabled           1
        passive_checks_enabled          0
        is_volatile                     0
        check_period                    24x7
        max_check_attempts              3
        normal_check_interval           1
        retry_check_interval            3
        notification_interval           120
        notification_period             workhours
        notification_options            w,u,c,r
        register                        0
}

define service{
        use                             active
        host_name                       example.org
        service_description             SSH
        contact_groups                  admins      ; definícia "admins" je v hostgroups.cfg

        check_command                   check_mysql_query!'select * from mantis_user_table'!2!5!mantis!mantis!MantiS
}

....

Syntax pluginu „check_mysql_query“ je následovný:

check_mysql_query -q SQL_query [-w warn] [-c crit] [-H host] [-P port] [-s socket] [-d database] [-u user] [-p password]

Preto som nastavil argumenty, ktoré vidíte hore takto:

$ARG1$ = 'select * from mantis_user_table' --> -q SQL_query
$ARG2$ = 2 --> [-w warn]
$ARG3$ = 5 --> [-c crit]
$ARG4$ = mantis --> [-d database]
$ARG5$ = mantis --> [-u database]
$ARG6$ = MantiS --> [-p password]

Tieto argumenty treba definovať v commands.cfg, aby sa pravidelne vykonávali. Ďalej poďme na samotné príkazy.

Definovanie príkazov (Command Definition)

Tu sa definuje syntax príkazov pomocou argumentov, ktoré sú definované v  services.cfg.

....

define command{
        command_name    check_mysql_query
        command_line    $USER1$/check_mysql_query -q $ARG1$ -w $ARG2$ -c $ARG3$ -H localhost -d $ARG4$ -u $ARG5$ -p $ARG6$
}

define command{
        command_name    check_ftp
        command_line    $USER1$/check_ftp -H localhost -p $ARG1$  -S -w $ARG2$ -c $ARG3$
}

....

Definovanie kontaktov (Contact Definition)

V tomto súbore je definovaný kontakt na systémového administrátora, ktorý má na starosti dané služby v čase definovanom v parametri service_notification_period a ako spôsob notifikácie je nastavené odosielanie emailov. O tom hovorí zasa parameter service_notification_commands. E-maily budú odosielané, iba ak bude test služby vyhodnotený v parametri service_notification_options a to:  w=warning, u=unreachable, c=critical, r=recovery.

....

define contact{
        contact_name                    peto
        alias                           Meno Priezvisko
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r
        host_notification_options       d,u,r
        service_notification_commands   notify-by-email
        host_notification_commands      host-notify-by-email
        email                           example@example.org
}

....

Definovanie časových intervalov (Time Period Definition)

Táto definícia je dôležitá, pretože v nej definujeme administrátora, deň a čas kedy sa mu majú odosielať notifikácie o problémoch. V aktuálnom príklade sú notifikácie zapnuté 24 hodín denne. Tieto notifikácie sa budú odosielať osobám, ktoré boli zadefinované v  contacts.cfg.

....

define timeperiod{
        timeperiod_name 24x7
        alias           24 Hours A Day, 7 Days A Week
        sunday          00:00-24:00
        monday          00:00-24:00
        tuesday         00:00-24:00
        wednesday       00:00-24:00
        thursday        00:00-24:00
        friday          00:00-24:00
        saturday        00:00-24:00
}

define timeperiod{
        timeperiod_name workhours
        alias           only workhours
        monday          09:00-18:00
        tuesday         09:00-18:00
        wednesday       09:00-18:00
        thursday        09:00-18:00
        friday          09:00-18:00
}

....

Definovanie skupín kontaktov (Contact Group Definition)

V tejto definícii sa pridáva do parametra members administrátori, ktorí patria do skupiny „admins“, pre použitie v  contacs.cfg.

....

define contactgroup{
        contactgroup_name       admins
        alias                   Administrators ; alias
        members                 jano,peto      ; členovia v tejto skupine "admins", ktorí sa nachádzajú v contacs.cfg
}

....

Definovanie skupín pre hostiteľov (Host Group Definition)

....

define hostgroup{
        hostgroup_name  remote      ; pomenovanie skupiny hostiteľov, ktoré sa použijú v services.cfg
        alias           Remote Host ; alias
        members         example.org ; člen skupiny "example.org" definovaný v services.cfg
}

....

Definovanie skupín pre služby (Service Group Definition)

Definovanie skupín pre služby slúži napr. na zotriedenie služby ping všetkých serveroch v sieti.

....

define servicegroup{
        servicegroup_name ping
        alias ping
}

....

Definovanie eskalácií služieb (Service Escalation Definition)

Definovanie eskalácií služieb je veľmi dôležitá vec pokiaľ chcete, aby pri chybovej udalosti vám nechodili správy každých 120 minút (2 hod. default) definované v services.cfg. Tu máte možnosť definovať pre jednotlivé služby alebo pre hosťov prvú a poslednú notifikáciu vo vami definovanom intervale. Napr. chcete, aby vám prišli najprv e-maily a až potom otravné sms-ky napr. až po piatom e-mailovom upozornení.

....

define serviceescalation{
        host_name               example.org
        service_description     FTPs        ; testovaná služba, názov musí sedieť s názvom služby zadefinovanej v súbore services.cfg
        first_notification      1       ; pošle hneď prvú notifikáciu
        last_notification       10      ; posielanie notifikácií skončí pri 10 notifikácii (pokiaľ zadáte "0" tak sa budú odosielať "donekonečna")
        notification_interval   60      ; interval týchto posielaní je 60 minút. (počíta sa interval_lenght zadefinovaný v nagios.cfg)
        contact_groups          admins      ; kontaktná skupina
}

....

Poznámka: je povolené definovať iba jednu správu ako: first_notification=1, last_notification=0 a notification_interval=0. Exvivalent je: first_notification=1, last_notification=1notification_interval=xy.

Definovanie eskalácií hosťov (Host Escalation Definition)

Táto definícia slúži na to, ak chcete eskalovať jednotlivých hosťov. V tomto prípade je zadefinovaná služba FTPs. Parameter contact_groups ukazuje, že budú posielané sms-ky, ale až od 5 (first_notification)  do 8 (last_notification)  notifikácie v časovom intervale 60 sekúnd  (notification_interval).

....

define hostescalation{
    host_name       example.org
        service_description     FTPs        ; testovaná služba, názov musí sedieť s názvom služby zadefinovanej v súbore services.cfg
        first_notification      5       ; pošle v poradí až piatu sms notifikáciu
        last_notification       8       ; posielanie notifikácií skončí pri 8 notifikácii (pokiaľ zadáte "0" tak sa budú odosielať "donekonečna")
        notification_interval   60      ; interval týchto posielaní je 60 minút. (počíta sa interval_lenght zadefinovaný v nagios.cfg)
    contact_groups      admins-sms
}

....

Definovanie rozšírených informácií o hosťoch (Extended Host Information Definition)

Rozšírené informácie o hosťoch slúžia na bližšiu identifikáciu jednotlivých hosťov.

....

define hostextinfo{
    host_name   example.org
    notes       This is the primary Netware file server
    notes_url   http://webserver.my_domain.org/hostinfo.pl?host=example.org
    icon_image  novell40.png
    icon_image_alt  IntranetWare 4.11
    vrml_image  novell40.png
    statusmap_image novell40.gd2
    2d_coords   100,250
    3d_coords   100.0,50.0,75.0
}

....

Pokiaľ si chcete otestovať, či je vaša Nagios konfigurácia správna, použite následovný príkaz:

nagios -v /usr/local/etc/nagios/nagios.cfg

Malo by vypísať niečo takéto: „Things look okay – No serious problems were detected during the pre-flight check“.

bitcoin školení listopad 24

Ešte niečo o umiestneniach Nagios súborov v systéme.

/usr/local/et­c/nagios konfiguračné súbory
/usr/local/li­bexec/nagios Nagios plugins
/var/spool/nagios Nagios logy
/usr/local/bin Nagios spúšťací súbor

Záver

Dnešný článok sa končí a nabudúce by som rád vysvetlil spôsoby, akým Nagios testuje vzdielené servery, ich služby a ako nastaviť práva webového frontendu. Ďalej by som chcel vysvetliť, ako si vytvoriť svoj vlastný plugin a testovať konkrétnu službu, ktorú práve chceme mať pod kontrolou.

Autor článku