Public:Svamberg/Návody/NConf

Z HelpDesk

Poznámky k instalaci NConf na server hype3. Základním dokumentem je Instalační příručka.

Prerekvizity

Nainstalovat balíky a kontrola nastavení dle závislostí.

Instalace

Dle návodu.

Import

Dle návodu, zde pouze pomocné skripty, které parsují /var/cache/nagios3/objects.cache

#!/usr/bin/perl
# vytvori samostatne soubory podle class v retezci '^define <class> {'
# $ cat objects.cache | parse.pl
# $ ls

use strict;

my $line;
my $class;
my $FILE;
while ($line = <STDIN>) {
        if ($line =~ /^define\s+(\w+)\s*{\s*$/) {
                $class = $1;
        }
        open ($FILE, ">>$class");
        print $FILE "$line";
        close ($FILE);
}

Druhý skript rozděluje vytvořený soubor host podle úrovně od kořene:

#!/usr/bin/perl
# program usporada hosty podle vzajemne zavislosti, do souboru
# host.0 ty v koreni, v host.1 vsechny z druhe urovne (odkazuji 
# se na hosty v host.0, atd.)
# 
# $ cat host | ./hosts.pl R99-PM
# $ ls

use strict;
use Data::Dumper;

my $line;
my $object;
my $name;
my $level = 0;
my $levels = 0;
my $parents;
my @data = ();
my $root = undef;
# test povinneho parametru
die "Chybi povinny parametr - host_name korene grafu.\n" unless ($ARGV[0]);

# cteni dat
while ($line = <STDIN>) {
        # hledani zacatku a inicializace
        if ($line =~ /^define\s+host\s*{\s*$/) {
                $object = "";
        }

        # uchovani si jmena hosta
        if ($line =~ /^\s*host_name\s+(\S+)\s*$/) {
                $name = $1;
        }
        # ulozeni rodice
        if ($line =~ /^\s*parents\s+(\S+)\s*$/) {
                $parents = $1;
        }

        # pridani radku do textu
        $object = "$object" ."$line";

        # pokud je konec, ulozit do pole a pro jistotu vse vycistit
        if ($line =~ /^\s*}\s*$/){
                if ("x$name" eq "x$ARGV[0]") {
                        $root = $#data + 1;
                        $level = 0;
                }
                push @data, { name => "$name", level => $level, parents => $parents, object => "$object" };
                $name = "";
                $parents = "";
                $object = "";
                $level = 0;

        }
}

# test, ze byl nalezen root
die "Nenalezen koren '$ARGV[0]'\n" unless $root;

# prochazime pole, coz je typicka rekurzivni uloha, protoze vzdy zname koren
sub subtree {
        my $root  = shift;
        my $level = shift;
        my $item = undef;

        $levels = $level if $levels < $level;
        foreach $item (@data) {
                if ("$$item{parents}" eq "$root") {
                        $$item{level} = $level;
                        subtree ($$item{name}, $level+1);
                }
        }
        #print "$level\t$root\n";
}

# start rekurze pro koren, zadame jmeno a uroven nasledujiciho podstromu
subtree ("$data[$root]{name}", $data[$root]{level}+1);

# tisk po levelech, nezapomenout na undef, tj. ty kteri nemaji rodice
my $item;
my $FILE;
while ($levels > -1) {
        open $FILE, ">host.$levels";
        foreach $item (@data) {
                print $FILE "$$item{object}" if $levels == $$item{level};
        }
        close $FILE;
        $levels--;
}

# debug
#print Dumper(\@data);

exit 0;

Vždy před spuštěním importu dané služby je potřeba zkontrolovat a smazat defaultní z instalace. Ale ne všechny, templaty a předkonfigurované volby ponechat.

Po importu je třeba odladit generování konfigurace, je třeba smazat duplicitní služby (v misccommand), přidat hostům a službám templaty ohledně časování testů.

Až vše vypadá dobře, lze nastavit cron tak, aby kopíroval a reloadoval nagios, viz deployment v dokumentaci NConf.

Ostatní

Upraveno CSS pro menu v /usr/share/nagios3/htdocs/side.html tak aby bylo rozpoznatelné (svítilo červeně)

Pomocníci

Jednoduchý skript, který vypíše na řádce typ, hostname, sluzbu a hodnotu o kterou se zajímame. Import totiž některé informace neukládá a přebírá je z defaultních hodnot. Proto se hodí pak pro kontroly a zjišťování úprav:

#!/usr/bin/perl
# vytiskne retezec "<typ> <hostname>:[<service>] <hodnota>"
# $ cat objects.cache | info.pl <nagios_option>
# napriklad:
# $ cat objects.cache | info.pl notification_interval

use strict;

my $line;
my $class;
my $host;
my $desc;
my $interval;
my $option = shift or die "Zadej hodnotu, napr. 'notification_interval'\n";
while ($line = <STDIN>) {
        if ($line =~ /^define\s+(\w+)\s*{\s*$/) {
                $class = $1;
                print "$class $host:$desc $interval\n" if $host;
                $host = "";
                $desc = "";
                $interval = "";
        }
        $interval = $1 if $line =~ /$option\s+(\d+)/;
        $host     = $1 if $line =~ /host_name\s+(\S+)/;
        $desc     = $1 if $line =~ /service_description\s+(\S+)/;
}
exit 0;