Teil 1 – Einsetzen der Abhängigkeiten und Grundinstallation
Teil 2 – Konfiguration von Nagios
Teil 3 – Überwachen von Endgeräten
a) rudimentäre Drucker
b) VoIP Geräte
c) Windows-PCs (mit Nagios Plugin)
d) Linux-Server (auch mit dem Nagios-Plugin)
Teil 3 1/2 – Fehlerbehandlung in der Konfiguration
a) Hilfe! Wie finde ich den Fehler
Teil 4 – Meldungen/Alarme zum Empfänger reichen
a) per simpler Mail
b) per Anruf (zBsp. ISDN)
c) per SMS
Teil 5 – Manuelle Modifikationen (Tipps!)
<<im Aufbau>>>
————————————————————————
Teil 1 – Einsetzen der Abhängigkeiten und Grundinstallation
Wir gehen im Folgenden von diesen Gegebenheiten aus :
– Unser PC ist so dimensioniert das er noch >50MB Speicherplatz anbietet
– Unser PC ist möglichst sehr gut verfügbar und hat idealerweise eine Möglichkeit zur ISDN Nutzung
– Wir setzen Nagios ebenfalls idealerweise auf 2 PCs auf, welche unterschiedliche Anbindungen haben.
– Unser Linux ist Debian, zur Not auch Ubuntu
– Wir sind bei der Installation «root»
– Später werden wir Nagios als «nagios» (!) ansprechen.
– Linuxer sind seltsam, zum editieren nehme ich «nano» – wer «vi» mag nehme den..
–unter Debian–
i. Abhängigkeiten erfüllen
apt-get install apache2 build-essential php5 libapache2-mod-php5 libgd2-xpm-dev
ii. Benutzer und Gruppe erstellen
useradd -m nagios passwd nagios groupadd nagios usermod -G nagios nagios groupadd nagcmd usermod -a -G nagcmd nagios usermod -a -G nagcmd www-data
iii. Herunterladen von Nagios Source und den Addons
mkdir nagios-download && cd nagios-download
Wir suchen uns die gewünschte Version von hier aus, wir benötigen den Core und die Plugins! Wget lädt für uns in das Download-Verzeichnis und wir machen weiter.
Alternativ nehmen wir die zur Zeit der Erstellung aktuellste Version 3.2.0 und 1.4.14 :
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.0.tar.gz wget http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.14.tar.gz tar -xzf nagios-3.2.0.tar.gz tar -xzf nagios-plugins-1.4.14.tar.gz
iv. Nagios kompilieren
./configure --with-command-group=nagcmd make all make install make install-init make install-config make install-commandmode
v. Wir kompilieren das Webinterface
make install-webconf htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin /etc/init.d/apache2 reload
vi. Die Plugins kompilieren
./configure --with-nagios-user=nagios --with-nagios-group=nagios make make install
vii. Wir stellen das Nagios Startskript in Runlevel 2
ln -s /etc/init.d/nagios /etc/rcS.d/S99nagios
viii. Wichtig ! Für spätere Zeitpunkte! wir setzen uns ein Skript für unseren Nutzer (hier root) um schnell die Konfigurationsdateien zu überprüfen! Bitte beim «täglichen Nutzer» erstellen, da wir ja root nur zur Installation nutzen möchten! Es gibt mehrere Wege zum Ziel, dies ist meiner:
nano ~/.bashrc
In die nun geöffnete Bash.rc setzen wir :
alias nag='/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg'
Und schließen Nano oder vi. Nach einem ab und anmelden unter aktuell root können wir mit «nag» die Konfigurationsdateien überprüfen und erhalten idealerweise ein :
Things look okay - No serious problems were detected during the pre-flight check
Herzlichen Glückwunsch, Nagios ist installiert und könnte bereits starten. KÖNNTE!
————————————————————————
Teil 2 – Konfiguration von Nagios
Wir teilen das ganze nun in «Anfänger» (i.) und «das reicht schon» – und «wir wollen Funktionalität prüfen, nicht nur Anwesenheit» (ii.) !
i. Basis-Konfiguration
Am einfachsten kann man ein Gerät überwachen welches sich im Netzwerk schlichtweg anpingen lässt.
Das setzen wir am Beispiel eines Routers, welcher sich praktischerweise auf 10.0.0.1 befindet – so um :
Man wechsle in das Nagios Hauptverzeichnis .. :
cd /usr/local/nagios/etc/objects
Unter dem Verzeichnis «Objects» befindet sich unser Hauptsteuerungsmechanismus – die Konfigurationsdateien der Objekte.
Wir möchten gerne von Null anfangen, das eignet sich in meinen Augen am besten um zu lernen und erstellen eine Neue Konfiguration, die wir «Router.cfg» nennen, in ihr sollen später alle «Router» Ihre Überwachungskonfiguration finden :
nano router.cfg
In die Konfigurationsdatei, welche idealerweise noch leer ist – setzen wir nun unsere Definition unseres ersten, zu überwachenden Routers ein, an jedem «host» können wir mehrere Arten der Prüfung fahren, aber step by step:
Hinweis! (Siehe zur Konfiguration auch «Tipp2» ganz unten im Thread!)
define host{ use generic-switch ; Das ist ein vordefiniertes Template - welches wir nun für Router nehmen. host_name unser_router ; Der Maschinenlesbare Name, also ohne Leerzeichen etc. alias Dieser Router verbindet Zentrale 1 mit 2 und ist sehr wichtig ; ein langer - menschenlesbarer Text, ein Alias address 10.0.0.1 ; Die IP des Gerätes, wir hatten uns auf 10.0.0.1 geeinigt. hostgroups switches ; Welcher Gruppe gehört dieser einzelne Router an? Der vordefinierten Gruppe "switches" }
Ist eigentlich ganz einfach – nicht? Ist ja auch das «Schnellschema»..
Nun müssen wir unsere zu prüfenden Schemen anpassen, wir setzen direkt nach dem o.g. Eintrag diesen hier ein:
define service{ use generic-service ; Wir nutzen, mal wieder ein Template, der einfachherheithalber aus den Vorlagen host_name unser_router ; Wie heisst nochmal das Gerät welches geprüft werden soll? Achja, "unser_router" service_description PING ; Beschreibung des Services - diese kommt zBsp. bei Fehlermeldungen zur Ansicht. check_command check_ping!200.0,20%!600.0,60% ; Wir geben dem Plugin "PING" seine Anweisungen normal_check_interval 5 ; Wenn alles okay ist dann prüfe alle 5 Minuten retry_check_interval 1 ; Schlägt Check1 fehl, prüfe alle 1 Minute ob wir wieder online sind }
Fertig.
Nun könn(t)en wir bereits unseren Nagios laufen lassen, jedoch – was passiert wenn etwas schief geht? Wer wird informiert?
Wir werfen einen kurzen Blick in die Contacts.cfg und setzen unseren Namen und unsere Email ein.
ACHTUNG! Bitte stell sicher das Dein System auch Emails versenden kann!
Nagios Konfig. prüfen mit «nag» – ist alles okay?
Nagios starten.
/etc/init.d/nagios start
Wer nunmehr mag, kann schon per Apache auf seinen Neuen Nagios Webauftritt schauen :
http://localhost/nagios
Benutzer ist per default : nagiosadmin
Passwort : nagiospwd
Sicherheitsbedenken wegen des einfachen Passwortes? Richtig, wir setzen unser eigenes :
htpasswd2 -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
Eingeben. Übernommen. Fertig. Verloren? Befehl als root neu starten.
Wir können auch noch den Zugriff separieren, aber das sprengt den Rahmen – wer es mag .. :
nano /etc/apache2/conf.d/nagios.conf
Ende der Schnellanleitung.
ii. Funktionsweite Konfiguration (wir beginnen bei Null – aber wir lernen viel)
Fangen wir einfach an und entfernen alle Vorlagen .. :
cd /usr/local/nagios/etc/objects mkdir backup mv *.cfg backup
So. Nun sind wir rein und können verstehen wie Nagios arbeitet und warum.
##### Neubau heisst viel Zeit haben – ich arbeite an beidem ######
————————————————————————
Teil 3 – Überwachen von Endgeräten
————————————————————————
Teil 3 1/2 – Fehlerbehandlung in der Konfiguration
a) Hilfe! Wie finde ich den Fehler
Fehler gefunden? Nagios startet nicht? Was nun?
Versuche es mit dem Nagios Prüfroutinchen, der v erbosity :
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
Das sollte Dir den Fehler deutlich einkreisen!
————————————————————————
Teil 4 – Meldungen/Alarme zum Empfänger reichen
Vorweg, da zwingend benötigt um per Telefon alarmiert zu werden – aber OffTopic – wer noch keine Sprachausgabe – also besser gesagt eine Sprachsynthese in sein Asterisk integriert hat sollte dies an dieser Stelle mit meinem HOWTO zu MBROLA tun. MBROLA ist Freeware und kann frei genutzt werden, für kommerzielle Einsätze sollte man auf CEPSTRAL wechseln – ich nutze hier kein MBROLA mehr, weshalb meine Skripte den CEPSTRAL Weg folgen werden, die Übernahme nach MBROLA ist aber ein Kinderspiel.
Wer noch SMS Kontakt wünscht der kann dies zBsp. hier finden, oder hier – ich stehe auf ausgesprochene Worte und eine bestätigte Warnung (durch abheben des Hörers)
Wir richten unsere KONTAKTE richtig ein, das machen wir über die Datei «contacts.cfg» in objects :
define contact{ contact_name nagiosadmin use phone-contact alias Voller Name pager Die Rufnummer - so wie Asterisk sie DIREKT wählen kann, also : zBsp. "SIP/40" email TECHNIK@WELTKONZERN.DE } define contact{ contact_name nagiosemail-empfaenger use phone-contact alias Voller Name email TECHNIK2@WELTKONZERN.DE } define contactgroup{ contactgroup_name admins alias Nagios Administrators members nagiosadmin, nagiosemail-empfaenger }
Speichern.
Wir modifizieren die «commands.cfg» im Verzeichnis «objects» des Nagios «etc» um unsere Sprachanrufe zu tätigen (Hinweis! Wer MBROLA nutzt muss nur den Befehl lt. HOWTO oben verändern, dieses Beispiel weist Cepstral an zu konvertieren!)
Unter den beiden Kommandos zum EMAIL Support fügen wir nun unsere beiden Telefonkommandos ein :
# 'notify-service-by-phone' command definition define command{ command_name notify-service-by-phone command_line /opt/swift/bin/swift -o /tmp/nagios-alert-service.wav -p audio/sampling-rate=8000,audio/channels=1' "NAGIOS-ÜBERWACHUNG VON EINZELNEN DIENSTEN. Zustand ist $NOTIFICATION$, $SERVICESTATE$. Der Service $SERVICEDESC$ auf $HOSTALIAS$ benötigt Ihre Aufmerksamkeit. Es wird keine weiteren Hinweise auf Ihrem Telefon zu diesem Status geben." & /var/lib/asterisk/agi-bin/nagios-anruf.sh $CONTACTPAGER$ } # 'notify-host-by-phone' command definition define command{ command_name notify-host-by-phone command_line /opt/swift/bin/swift -o /tmp/nagios-alert-host.wav -p audio/sampling-rate=8000,audio/channels=1' "NAGIOS-ÜBERWACHUNG VON HOSTS. Zustand ist $NOTIFICATION$, $SERVICESTATE$. Der Service $SERVICEDESC$ auf $HOSTALIAS$ benötigt Ihre Aufmerksamkeit. Es wird keine weiteren Hinweise auf Ihrem Telefon zu diesem Status geben." & /var/lib/asterisk/agi-bin/nagios-anruf.sh $CONTACTPAGER$ }
Nun noch den Kontakt selber unter dem default «generic-contact» in «templates.cfg» erstellen, ich habe ihn hier mit «Arbeitszeit» und nur bei kritischen Fehlern laufen lassen :
define contact{ name phone-contact service_notification_period Arbeitszeit host_notification_period Arbeitszeit service_notification_options c ; c = critical downtime events host_notification_options d,u ; down und unreachable service_notification_commands notify-service-by-phone host_notification_commands notify-host-by-phone register 0 }
Die Uhrzeiten setzen wir ebenfalls etwas eleganter, wer will schon unterm Weihnachtsbaum nen Anruf bekommen ?
timeperiods.cfg
define timeperiod{ timeperiod_name Arbeitszeit alias Normal Work Hours monday 04:00-19:00 tuesday 04:00-19:00 wednesday 04:00-19:00 thursday 04:00-19:00 friday 04:00-19:00 saturday 04:00-19:00 sunday 06:00-16:00 }
Wir müssen ebenfalls unser Shellskript in /var/lib/asterisk/agi-bin/ erstellen, wir geben eine Variable «$1» als Rufnummer für Asterisk mit – nochmals deutlich – Asterisk muss dies inkl. CHANNEL erhalten !! Also nicht «40» sondern «SIP/40» «mISDN/1/123456» oder mW «ZAP/2» oder oder..
Wir erstellen die Datei «nagios-anruf.sh» in /var/lib/asterisk/agi-bin
#!/bin/bash # # NAGIOS ALARMFUNKTIONS-SKRIPT # # $1 beinhaltet die Rufnummer des zu alarmierenden # Wir pruefen als ersten Schritt ob die Datei von NAGIOS auch wirklich existiert! # ACHTUNG! Diese Vorgehensweise hat einen Haken - alarmiert Nagios urplötzlich über viele Probleme, so wird die Sprachdatei laufend aktualisiert und # könnte zum Zeitpunkt unserer Kontrolle nicht verfügbar sein, so dass nicht alarmiert wird. Umgehung mit einer TIMESTAMP Datei und der Weiterverfolgung # des Ansatzes unten - jedes Callfile bekommt eine eigene Nummer oder halt einen TIMESTAMP, ich mache es immer so das ich bis zu 3 Nummern vergebe und dann # bei Skriptstart pruefe ob .1 da ist, dann prüfe ich ob .2 da ist, nein? dann nutze ich .2 usw # if [ -f /tmp/nagios-alert-host.wav ]; then ZEILE1="Channel: $1" # wer und wohin - variabel ZEILE6="Extension: nagios" ZEILE2="MaxRetries: 3" # Wie oft anrufen ZEILE3="RetryTime: 300" # Wartezeit zwischen.. ZEILE4="WaitTime: 50" # Wartezeit bis zur Abnahme des Apparates ZEILE5="Context: nagios" # Sprungpunkt ZEILE7="Priority: 1" # Prioritaet ZEILE8="CallerID: Nagios <91>" # Wer ruft an rm /var/spool/asterisk/entwurf/nagios_nachricht.1 2>/dev/null touch /var/spool/asterisk/entwurf/nagios_nachricht.1 # Hier setzen wir den Lock fuer die Verarbeitung von Anruf 1 - bei mir LOCK 10. touch /var/spool/asterisk/entwurf/10 echo $ZEILE1 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE2 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE3 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE4 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE5 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE6 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE7 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE8 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 mv /var/spool/asterisk/entwurf/nagios_nachricht.1 /var/spool/asterisk/outgoing/nagios_nachricht.1 # Und hier nehmen wir den Lock wieder weg rm /var/spool/asterisk/entwurf/10 2>/dev/null fi # Wir pruefen ob ein Dienst einen Neuen Status hat.. if [ -f /tmp/nagios-alert-service.wav ]; then ZEILE1="Channel: $1" # wer und wohin - variabel ZEILE6="Extension: nagios-service" ZEILE2="MaxRetries: 3" # Wie oft anrufen ZEILE3="RetryTime: 300" # Wartezeit zwischen.. ZEILE4="WaitTime: 50" # Wartezeit bis zur Abnahme des Apparates ZEILE5="Context: nagios" # Sprungpunkt ZEILE7="Priority: 1" # Prioritaet ZEILE8="CallerID: Nagios <91>" # Wer ruft an rm /var/spool/asterisk/entwurf/nagios_nachricht.1 2>/dev/null touch /var/spool/asterisk/entwurf/nagios_nachricht.1 # Hier setzen wir den Lock fuer die Verarbeitung von Anruf 1 - bei mir LOCK 10. touch /var/spool/asterisk/entwurf/10 echo $ZEILE1 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE2 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE3 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE4 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE5 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE6 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE7 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 echo $ZEILE8 >>/var/spool/asterisk/entwurf/nagios_nachricht.1 mv /var/spool/asterisk/entwurf/nagios_nachricht.1 /var/spool/asterisk/outgoing/nagios_nachricht.1 # Und hier nehmen wir den Lock wieder weg rm /var/spool/asterisk/entwurf/10 2>/dev/null fi
Ausführbar machen mit chmod a+x <dateiname>. Bitte beachtet die in diesem Skript nicht voll ausgefertigte Idee – «was passiert wenn mehrere notrufe ausgegeben werden?»
Nun ran an Asterisk – wer NICHT REALTIME nutzt kann es so machen wie ich :
extensions.conf editieren und folgendes einfügen :
Was ist AMD ? AMD findet heraus ob ein Mensch abnimmt oder eine Maschine – es funktioniert super, ein Nachteil – hört AMD das man abnimmt aber sich nicht seinem Namen meldet nimmt AMD an das ein Anrufb. rangegangen ist und legt einfach auf, bzw. führt das aus was wir wollen was passiert wenn ein AB rangeht. anbei – ich lasse die Nachricht 2 x durchsprechen, es ist halt so das man beim ersten Anruf nicht immer alles wichtige versteht.
[nagios] exten => nagios,1,AMD exten => nagios,n,GotoIf($[${AMDSTATUS}=HUMAN]?humn:mach) exten => nagios,n(humn),Playback(/tmp/nagios) exten => nagios,n(humn),Playback(/tmp/nagios) exten => nagios,n(humn),Hangup() exten => nagios,n(mach),Hangup() ; Aktion bei einem Service - ggf. nicht so dringend und somit anders zu behandeln? exten => nagios-service,1,AMD exten => nagios-service,n,GotoIf($[${AMDSTATUS}=HUMAN]?humn:mach) exten => nagios-service,n(humn),Playback(/tmp/nagios) exten => nagios-service,n(humn),Playback(/tmp/nagios) exten => nagios-service,n(humn),Hangup() exten => nagios-service,n(mach),Hangup()
Fertig.
Bitte noch mit «/etc/init.d/nagios checkconfig» die Konfiguration prüfen!
Was jeder selber wissen muss ob er nicht eine Zeitfunktion einbaut, wer will schon nachts angerufen werden weil ein Drucker ausgegangen ist, aber wie gesagt, das muss jeder selber wissen.
zBsp. so :
exten => nagios,n,GotoIfTime(22:00-06:00,mon-sun,*,*?email-reicht-aus,,1)
Teil 5 – Manuelle Modifikationen (Tipps!)
Tipp 1 – Wer nachher gerne mit der WebGUI arbeitet und zBsp. «Downtimes scheduled» oder «Notifikationen verändert» etc. wird etwas feststellen – unter meinem Debian wird aus irgendeinem Grund die Datei «nagios.cmd» täglich und nach jedem Neustart des PC / Server mit anderen Schreibrechten versehen – warum dem so ist und/oder ob es an dem Verzeichnis liegt weiss ich nicht – meine Abhilfe steht in einem kleinen «Tagesskript» an letzter Stelle :
chmod 777 /usr/local/nagios/var/rw/nagios.cmd
Dann ist wieder alles möglich – es hilft allerdings NICHT bei einem Neustart und dem Willen direkt danach etwas in der GUI zu tun.
Tipp 2 – [GuterTipp!!] Wer sich gerne «optisch» mit Nagios auseinandersetzen will, sollte die Option «parents» beherrschen und überall in der Konfiguration einpflegen !!
Parents steht für nicht mehr als das man seinem Objekt der Überwachung sagt von wem es abhängt.
Einfaches Beispiel – DSL fällt aus, der Webserver dahinter ist lokal natürlich noch zu erreichen – jedoch ist er für die Außenwelt tot.
Gibt man dem Webserver jedoch die Option parents mit, versteht er das er ebenfalls down ist wenn die Eltern ausfallen – und noch mehr, mit gesetzter Parents kann man per Klick direkt zu einer geplanten Ausfallzeit (scheduled downtime) die Kinder mit einplanen.
Eine Konfig sieht dann zBsp. so aus :
define host{ use generic-voip host_name asterisk-service alias Der ASTERISK DIENST address 10.0.0.60 hostgroups voip parents patton-isdn parents dsl-router-1 parents dsl-router-2 parents dsl-router-3 }
CentOS 5 and Asterisk 1.4.x installation
Business PBX Solution
Base Install of Asterisk on a CentOS/RHEL box:
Before you begin, you’ll probably want to bring all your packages up to date. To do so, run ‹yum -y update›. If any kernel files were updated as part of this process, you will need to reboot the machine (shutdown -r now). Repeat the process until no more updates are available.
Download the pre-requisite of asterisk:
gcc
gcc-c++
kernel-devel
bison
openssl-devel
libtermcap-devel
yum install sqlite-devel
We’ll be using yum for now(there’s no support for apt-get in CentOS 5)
yum -y update
yum install gcc gcc-c++ kernel-devel bison openssl-devel libtermcap-devel
then download the latest asterisk version at asterisk.org to /usr/src:
cd /usr/src
wget http://downloads.digium.com/pub/asterisk/asterisk-1.4-current.tar.gz
wget http://downloads.digium.com/pub/zaptel/zaptel-1.4-current.tar.gz
#if you plan to use PRI cards(eg. TE110P, TE406P) you need to download this package:
wget http://downloads.digium.com/pub/libpri/libpri-1.4-current.tar.gz
then untar all the files
tar -zxf zaptel-1.4-current.tar.gz
tar -zxf asterisk-1.4-current.tar.gz
tar -zxf libpri-1.4-current.tar.gz
### INSTALLING ZAPTEL ###
cd /usr/src/zaptel
make clean
make
make install
#If you want «service zaptel restart» command to work do this
make config
### INSTALL LIBPRI ###
# If you are using E1 cards you need to install LIBPRI
cd /usr/src/libpri
make clean
make
make install
### INSTALLING ASTERISK ###
cd /usr/src/asterisk
./configure
make
make install
#If you want sample files to be created in /etc/asterisk
make samples
#If you want program docs/manual pages for asterisk
make progdocs
#If you want «service asterisk restart» command to work do this
make config