Sicherlich gibt es mehrere und bessere Möglichkeiten, Oracle unter Linux für Nagios zum Laufen zu bekommen, ich beschränke mich aber (da ich kein Oracle-Experte bin) auf eine schnelle und unkomplizierte Einrichtung. Das Ziel: Das Plugin check_oracle_health von Gerhard Lausser soll funktionieren ohne dass große Umstellungen am System getätigt werden müssen!
Instant-Client für Linux als zip herunterladen (nachdem man sich angemeldet hat) und unter /opt/oracle entpacken (Da ich den Instantclient 11.2 genommen habe, entstand bei mir das Unterverzeichnis instantclient_11_2)
Stand 24.03.2011 Version 11.2.0.2.0 http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
NOTE: Oracle hat festgelegt, das alle Installation von Oracle Komponneten unter dem linux Benutzer oracle getätigt werden sollen. Der instantclient benötigt diese Vorgabe nicht. Sollte jedoch ein kompletter Oracle client über den Installer installiert werden, muss dem User Nagios die lese Rechte an den Datein eingerichtet werden.
Möchte man die Oracle-Datenbank mit Ihrer SID als Benutzer ansprechen so schreibt man die Variablen in die Datei /etc/bash.bashrc.local (wenn nicht vorhanden, dann einfach anlegen) und meldet sich erneut an.
PATH=$PATH:/opt/oracle/instantclient_11_2 export PATH LD_LIBRARY_PATH=/opt/oracle/instantclient_11_2 export LD_LIBRARY_PATH export ORACLE_USERID=system/password export ORACLE_SID=oracle_sid1 export ORA_HOME=/opt/oracle/instantclient_11_2 export ORACLE_HOME=/opt/oracle/instantclient_11_2 export TNS_ADMIN=/opt/oracle/instantclient_11_2/network/admin
Die Oracle-Userid und die Oracle-SID werden nur benötigt, wenn man in den Checks diese Daten auch benutzt. Das Gleiche gilt für die tnsnames.ora. Alternativ kann man diese Daten auch weglassen und in den jew. Checks die Daten direkt angeben.
Die tnsnames.ora muss dann im Verzeichnis /opt/oracle/instantclient_11_2/network/admin angelegt werden und mit den korrekten Daten gefüllt werden. Standardmäßig ist das Verzeichnis /network/admin nicht im *zip enthalten und muss angelegt werden. Der Aufbau ist wie folgt:
dbsid1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = TCP)
(PROTOCOL = TCP)
(Host = DBSERVER)
(Port = 1521)
)
)
(CONNECT_DATA =
(SID = dbsid1)
(GLOBAL_NAME = dbsid1)
)
)
1521 Standard Port für Oracle
Hinweis vorweg:
Eines der größten Probleme scheint mit den Systemvariablen in Nagios aufzutreten: Als Benutzer nagios oder als root funktioniert ein Check, führt nagios diesen Check selbst aus, dann scheitert der Versuch. Der Grund: Der Benutzer Nagios und der Prozess Nagios haben unterschiedliche Environment-Umgebungen und damit unterschiedliche Systemvariablen. Damit der Prozess die Oracle-Komponenten über die Systemvariablen auch findet, wird das Startscript von Nagios angepasst:
vi /etc/init.d/nagios
Da schon am Anfang des Scripts Variablen stehen, fügen wir unsere Oracle-Variablen einfach nur hinzu (siehe oben). Nach einem Neustart des Nagios-Prozesses stehen die Variablen in Nagios zur Verfügung.
Das Downloaden und Einbinden ist wie bei jedem Plugin und wird daher hier nicht mehr beschrieben. Aber: Ich stelle hier kurz 2 Möglichkeiten vor:
Vorher aber die resource.cfg um jew. eine Variable pro Passwort erweitern: $USER8$!
Entweder man definiert ein Kommando und übergibt die Parameter erst in dem Service-Check:
define command {
command_name check_oracle_health
command_line $USER1$/check_oracle_health $ARG1$
}
Oder man definiert diese Daten schon im Kommando und spart sich das beim Service (bei beiden Fällen werden jetzt die oben weggelassenen Variablen wieder angefügt)
define command {
command_name check_oracledb1_health_tablespace_usage
command_line $USER1$/check_oracle_health --connect '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$HOSTADDRESS$)(PORT=1521))(CONNECT_DATA=(SID=oracle_sid1)))' --user system --password $USER8$ --mode tablespace-usage --tablespace USER_DATA
}
Hierzu bitte unbedingt das HowTo lesen, wie das AddOn funktioniert: http://labs.consol.de/nagios/check_oracle_health/
Eine weitere nette Angelegenheit ist die Übergabe der SID aus der Hostkonfiguration. Bewerkstelligt wird dies über das Benutzen von Custom Object Variables http://nagios.sourceforge.net/docs/3_0/customobjectvars.html.
Es wird eine _variable (_SID meineDB ) in die Host Konfiguration eingefügt und an den Command Aufruf ($_ÜBERGABEVAR$) Übergeben.
Um check_oracle_health benutzen zu können benötigt Perl die CPAN-Module DBI und DBD::Oracle
Alles Wichtige über Perl Module kann unter http://de.selfhtml.org/perl/module/intro.htm und http://www.cpan.org/modules/INSTALL.html (en) nachgelesen werden.
Dieser Teil soll mögliche Ideen und Hilfestellung bieten für ein weiteres Vorgehen. KEINE MUSTERLÖSUNG
Versionen Nagios Testsystems OpenSUSE 11.1 (x86_64)
Linux 2.6.27.7-9-default CPAN.pm version 1.9205 nagios-3.2.0-10.1 apache2-2.2.10-2.8.1 perl-base-5.10.0-62.16 check_oracle_health-1.6.8.1.tar.gz DBD-Oracle-1.28
- Download Oracle instantclient 11.2 + Oracle instantclient 11.2 SDK. Entpacken verschieben s.o
- Setzen der Oracle System Variablen s.o
- Donwload / Kompilieren des DBD::Oracle Modules
#>cpan cpan[1]> install DBD::Oracle
*cpan konnte bei mir die Version des instantClient nicht auflösen. Das Modul wurde heruntergeladen und musste per Hand unter Angabe der Oracle instantclient Version kompiliert werden.
#>cd /root/.cpan/build/DBD-Oracle-x.x.x #>perl Makefile.Pl -V 11.2 #>make #>make install
- kompilieren des check_oracle_health Modules
#>/configure --prefix=/usr/lib/nagios --with-nagios-user=nagios --with-nagios-group=nagios --with-perl=/usr/bin/perl --with-statefiles-dir=/tmp #>make #>make install
Connection Test check_oracle_health –mode tnsping
#>./check_oracle_health --connect '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=HOSTNAME)(PORT=1521))(CONNECT_DATA=(SID=emrep)))' --user nagios --password nagios --mode tnsping OK - connection established to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=HOSTNAME)(PORT=1521))(CONNECT_DATA=(SID=emrep))).
F: Nagios Service Status –> failed: Can't load……DBD/Oracle/Oracle.so …..libnnz11.so: Als root kann check_oracle_health aber aufgerufen werden
CRITICAL - cannot connect to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.115.100.132)(PORT=1521))(CONNECT_DATA=(SID=emrep))). install_driver(Oracle) failed: Can't load '/usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libnnz11.so: cannot open shared object file: No such file or directory at /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi/DynaLoader.pm line 203. at (eval 14) line 3 ..............
A: Leserechte und Variable überprüfen.
F: ORA-01017: invalid username/password:
CRITICAL - cannot connect to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.115.204.88)(PORT=1521))(CONNECT_DATA=(SID=oemrep))). ORA-01017: invalid username/password: logon denied (DBD ERROR: OCISessionBegin)
A: Anlegen eines Nagios Users oder benutzen der System Benutzer
F: SID Der Zieldatenbank nicht richtig angegeben
CRITICAL - cannot connect to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=vbs10grid1)(PORT=1521))(CONNECT_DATA=(SID= emrep_flasch ))). ORA-24327: need explicit attach before authenticating a user (DBD ERROR: OCISessionBegin)
A: Auf dem Zieldatenbanksystem smon prozesse identifizieren um richtige SID zu finden.
ps -ef | grep smon oracle 12853 1 0 Jan09 ? 00:32:59 ora_smon_SID1