SlideShare ist ein Scribd-Unternehmen logo
ingo@lantschner.name
Nagios Plugins für NetApp-Filer entwickeln!
Workshop am 12. September 2008 in Nürnberg
1
ingo@lantschner.name
Vorgeschichte
• 2005 Spezialisierung auf Systemmonitoring, Trendanalyse, OSS, Nagios
• 2006 Upgrade und Administration des ÖGB-Nagios
• 2007 Erstellen von Plugins für VMware ESX3, Brocade Switches, HP iLO
BMCs, u.a.
! NetApp: erste Versuche mit SNMP und Erstellung von NetApp-Plugins
(Telnet/SSH basierend)
• 2008 Auftrag größere Anzahl umfassender Plugins für NetApp-Filer zu
erstellen
2
ingo@lantschner.name
NetApp Plugins 2008
• Auftraggeber CUBiT
• Work in Progress ...
• Auf die Anforderungen dieses Kunden zugeschnittene Plugins
• Datenbankabfragen statt Kommandozeilen-Parameter
• Mehrsprachig (Deutsch als Default, Englisch und Schwedisch über GNU-
gettext)
• single-/multiline Ausgabe (für Nagios 3)
• Umfassend (Hardware, ONTAP, Aggregate, traditionelle Volumes, Flexvols,
Snapshots, WAFL-Scans, Plattenzustand, gcount, Spigelsynchronität,
Brocade-Switches, vFiler, Deduplication (df -s), Domainchecks (CIFS),
qtrees, sysstat, Cache-Effektivität, ...)
3
ingo@lantschner.name
Vorgangsweise in diesem Workshop
1. Einige theoretische Erklärungen (Nagios-Plugins und DataONTAP
Schnittstellen)
2. Vorstellung eines sehr einfachen Codegerüstes (bereits funktional)
3. Vorschlag Erweiterungen 1
4. Hands-On: Integration dieser Erweiterungen
5. Vorschlag Erweiterungen 2 - Ziel: vollwertiges Nagios-Plugin
6. Vorführung und Erklärung an Hand eins fertigen Beispiels (wäre sehr viel
Tipparbeit)
7. Vorschlag Erweiterung 3 - Ziel: Performancedaten, Timeout-Management
8. Hands-On: Integration von Vorschlag 3
4
ingo@lantschner.name
Datenquellen für Nagios-Plugins
• SNMP
• schlankes, zuverlässiges Protokoll
• Version 1: Counter laufen über
• Version 2: unverschlüsselt (nur sichere Netze)
• SMTP: Verarbeiten von Warnmails
• HTTP: Perl&LWP
• Telnet/SSH: Net::SSH
• Webservices: HTTP(S), XML
5
ingo@lantschner.name
Beispiel Telnet/SSH
# connect either via telnet or ssh
if (defined $opts{telnet}) {
my $t = Net::Telnet->new( Timeout => 10,
Prompt => '/>/',
Host => $host,
);
$t->login($user, $pass);
@dlist = $t->cmd("storage show disk");
@dnames = get_disknames(); #(v4.15 v4.16 ...)
%GCOUNTS = get_gcounts($t);
foreach (keys %GCOUNTS) {
if (defined $opts{debug}) {
print "$_ --> $GCOUNTS{$_}n";
}
if ( $GCOUNTS{$_} >= $warn and $exit!=2 ) {$exit = 1}
if ( $GCOUNTS{$_} >= $crit ) {$exit = 2}
}
} else {
print "SSH not implemented yet - sorry! Pls. use --telnet.n";
exit 3;
}
6
ingo@lantschner.name
Probleme Telnet/SSH
• Net::SSH ist teils schwer zu implementieren
• Andere SSH-Module forken - schlecht für Performance/Sicherheit
• semiprofessioneller Ansatz - Änderungen im CLI können fatale Auswirkungen
haben. (Das CLI wurde nicht für automatisierte Abfragen konzipiert und wird
vom Hersteller kaum unter diesem Aspekt gewartet und weiterentwickelt)
• Telnet machte mit neueren ONTAP-Versionen Probleme
7
ingo@lantschner.name
Webservices Schnittstelle
• professioneller Ansatz (vom Hersteller unterstützt)
• relativ zukunftssicher, hat sich bei den ESX-Plugins schon bewährt
• sprachunabhängig (Java, C, Perl)
• Kommunikation über HTTP oder HTTPS
• Übertragung von XML-Files
• Strikt objektorientierte Datenstrukturen, die in Perl z.B. auch mit DataDumper
ausgegeben werden können
8
SMB calls
Ontap Counter Manager (CM)
Storage System Performance counters
Filer
Data
Archives
CLI
DFM
ManageONTAP
APIs
Windows
Perfmon
Support
Windows
Perfmon
Clients
Existing
Performanc
e
Commands
3rd
Party Management
Tools
Auto-
suppo
rt
SNMP
At the base of the performance infrastructure there are a set of performance counters
accessible through existing performance commands. Above this set of performance
counters, is a thin layer of abstraction called Counter Manager (CM).
Blockdiagramm
NetApp Performance
Infrastruktur
ingo@lantschner.name
NetApps perf-API: Terminologie
Organisationsbez. repräsentiert Beispiel
Objekte Subsysteme processor
Instanzen
physische oder
logische Einheiten
processor0
Counter
„datum“
(Messwert)
processor_busy
10
ingo@lantschner.name
Manage-ONTAP-SDK
11
ingo@lantschner.name
Manage-ONTAP-SDK
11
ingo@lantschner.name
NetApp API: Verwendung im Überblick
Schritt Aufgabe Parameter/Infos
1 Serverkontext erzeugen Servername
2 Sessionparameter setzen
Protokoll (HTTP/HTTPS)
user-credentials
3
Kommando an die Core API
des Filers senden
Kommandoname
4 Datenstruktur auswerten
child_get_*
...
12
ingo@lantschner.name
NetApp API: Verwendung im Detail
Schritt Aufgabe Parameter/Infos Code
1
Serverkontext
erzeugen
Servername
$s = NaServer->new ($filer, $major_version,
$minor_version);
2
Session-
parameter
setzen
Protokoll (HTTP/
HTTPS)
user-credentials
$s->set_transport_type("HTTP");
$s->set_style("LOGIN_PASSWORD");
$s->set_admin_user($user, $pass);
3
Kommando
an die Core
API des Filers
senden
Kommandoname
$out = $s->invoke( "volume-list-info");
# print Dumper($out) if $debug > 2;
4
Datenstruktur
auswerten
child_get_*
...
$volume_info = $out->child_get("volumes");
@result = $volume_info->children_get();
foreach $vol (@result){
" $vol_name = $vol->child_get_string("name");
...
13
ingo@lantschner.name
NetApp Simulator installieren
14
Simulator läuft als eigene „Maschine“ in einem Linux (mit
eigener IP)
! OS X: http://lanti.wordpress.com/2008/04/09/netapp-
simulator-fur-mac-os-x/
! Linux/Windows: Doku von VMware im Installationskit
(Vmware, Linux and Simulator installation.doc)
ingo@lantschner.name
Netzwerkkonfiguration „Host-only“
15
• VMware Netzwerk auf Host-Only und verbinden
• Netzwerk der VM neu starten: /etc/init.d/networking restart
• VM bekommt eine Adresse wie 172.16.151.128
• Simulator starten:
• Netzwerk des Simulators rekonfigurieren: ifconfig ns0 172.16.151.132
netmask 0xffffff00
• Testen: $ telnet 172.16.151.132
• Hosteintrag in /etc/hosts (spart viel Tipperei)
ingo@lantschner.name
Starten des NetApp Simulators
1. VM starten
2. Anmelden als ubuntu%ubuntu (= Username „ubuntu“ und Passwort
„ubuntu“)
3. Starten des Simulators: /sim3/runsim.sh
• Optional
• ggf. Anmelden als root%
• Useraccount für Abfragen über die API: nagios%nagios88
16
ingo@lantschner.name
check_netapp_space.pl - Version 0.1
• Erstes Skript zur Abfrage von Performancewerten - noch kein Nagios-Plugin
• Anforderungen
• Kontaktieren des Servers
• Daten holen und auswerten
• Ausgabe auf die Comandline
18
ingo@lantschner.name
Code und Ausgabe Version 0.1
$ ./check_netapp_space-01.pl
Volume name: cachevol
Total Size: 20971520 bytes
Used Size: 81920 bytes
Used Size: 0 %
----------------------------
Volume name: vol0
Total Size: 253640704 bytes
Used Size: 66895872 bytes
Used Size: 26 %
----------------------------
Volume name: sv_vol
Total Size: 16777216 bytes
Used Size: 278528 bytes
Used Size: 2 %
----------------------------
# Schritt 1: Servercontext erzeugen
my $s = NaServer->new ($filer, ...);
# Schritt 2: Sessionparameter setzen
check_out($s->set_transport_type("HTTP"));
check_out($s->set_style("LOGIN_PASSWORD"));
check_out($s->set_admin_user($user, $pass));
# Schritt 3: Sende Komando an die Core API
$out = $s->invoke( "volume-list-info");
...
my $volume_info = $out->child_get("volumes");
my @result = $volume_info->children_get();
foreach my $vol (@result){
my $vol_name = $vol->child_get_string("name");
print "Volume name: $vol_name n";
my $size_total = $vol->child_get_int("size-total");
print "Total Size: $size_total bytes n";
my $size_used = $vol->child_get_int("size-used");
print "Used Size: $size_used bytes n";
my $usedPrzt = $vol->child_get_int("percentage-used");
print "Used Size: $usedPrzt % n-------------n";
}
19
ingo@lantschner.name
Datenstrukturen 1: Data::Dumper
20
• Ausgabe mit Datadumper
• Ausgabe kann theoretisch auch geparst werden
• Eigentliche Aufgabe:
• Datenstrukturen auspacken
• Datenstrukturen verstehen
• Debugging (z.B. fehlerhafte Dokus aufdecken, ...)
• Code (wenn $out eine Referenz auf eine Datenstruktur ist):
use Data::Dumper;
....
print Dumper($out);
ingo@lantschner.name
Datenstrukturen 2: Ausgabe von Data::Dumper
21
$VAR1 = bless( {
'content' => '',
'name' => 'results',
'children' => [
bless( {
'content' => '',
'name' => 'volumes',
'children' => [
bless( {
'content' => '',
'name' => 'volume-info',
'children' => [
bless( {
'content' => 'cachevol',
'name' => 'name',
'children' => [],
'attrvals' => [],
'attrkeys' => []
}, 'NaElement' ),
bless( {
'content' => 'bb1ff1 ...',
'name' => 'uuid',
... ),
bless( {
'content' => 'flex',
'name' => 'type',
...),
bless( {
'content' => 'online',
'name' => 'state',
... ),
bless( {
'content' => '20971520',
'name' => 'size-total',
ingo@lantschner.name
Datenstruktur und Befehle
22
$out = $s->invoke( "volume-list-info");
...
my $volume_info = $out->child_get("volumes");
my @result = $volume_info->children_get();
foreach my $vol (@result){
my $vol_name = $vol->child_get_string("name");
$VAR1 = ( {'content' => '',
'name' => 'results',
'children' => [( {
'content' => '',
'name' => 'volumes',
'children' => [( {
'content' => '',
'name' => 'volume-info',
'children' => [( {
'content' => 'cachevol',
'name' => 'name',
'children' => [],
ingo@lantschner.name
Datenstruktur und Befehle
22
$out = $s->invoke( "volume-list-info");
...
my $volume_info = $out->child_get("volumes");
my @result = $volume_info->children_get();
foreach my $vol (@result){
my $vol_name = $vol->child_get_string("name");
$VAR1 = ( {'content' => '',
'name' => 'results',
'children' => [( {
'content' => '',
'name' => 'volumes',
'children' => [( {
'content' => '',
'name' => 'volume-info',
'children' => [( {
'content' => 'cachevol',
'name' => 'name',
'children' => [],
ingo@lantschner.name
Hands-On (Version 0.1)
! Ausgabe der Volumeinfos auf die
Comandline
! Einbau von Datadumper und Ausgabe der
Datenstruktur
23
ingo@lantschner.name
check_netapp_space.pl - Version 0.3
• prinzipiell sinnvolles Nagios-Plugin
• Anforderungen wie in Version 0.1 und zusätzlich
• Nagios-konforme Übernahme von Servername, Credentials,
Schwellwerten als Parameter (Nagios::Plugin)
• Ermitteln und Ausgabe des Maximalwertes (das am meisten belegte
Volume)
• Rückgabewert (0,1,2) abhängig von den Schwellwerten
24
Demo und Erklärung Version 0.3
ingo@lantschner.name
check_netapp_space.pl - Version 0.5
• vollwertiges Nagios-Plugin
• Anforderungen wie in Version 0.3 und zusätzlich
• Nagios-konforme Ausgabe der Performance-Daten
(Nagios::Plugin::Performance)
• Timeoutmanagement
26
ingo@lantschner.name
Performance Daten aller Volumes plotten
foreach my $vol (@result){
...
$p->add_perfdata(
label => "$vol_name",
value => $belegtPrzt,
uom => "%",
threshold => $p->threshold(),
);
...
}
27
ingo@lantschner.name
Performance Daten der Volumes plotten - Ausgabe
foreach my $vol (@result){
...
$p->add_perfdata(
label => "$vol_name",
value => $belegtPrzt,
uom => "%",
threshold => $p->threshold(),
);
...
}
$ ./check_netapp_space-05.pl -H sim3 -p nagios88
NETAPP_SPACE-05 OK - Max. used volume on sim3 is vol0 (26.00 % used) |
cachevol=0%;70;90 vol0=26%;70;90 sv_vol=2%;70;90
28
ingo@lantschner.name
Timeout-Management
my $timeout = $p->opts->timeout;
$SIG{ALRM} = sub {
$p->nagios_die("ERROR: Timeout ($timeout s) reached");
};
# hierher kommt der eigentliche Code des Plugins,
# vor allem Abfragen zum Filer und alles was sonst
# noch hängen bleiben kann.
alarm $timeout;
29
ingo@lantschner.name
Timeout-Management - Ausgabe
my $timeout = $p->opts->timeout;
$SIG{ALRM} = sub {
$p->nagios_die("ERROR: Timeout ($timeout s) reached");
};
# main code here
alarm $timeout;
$ ./check_netapp_space-05.pl -H sim3 -p nagios88
NETAPP_SPACE-05 UNKNOWN - ERROR: Timeout (15 s) reached
30
ingo@lantschner.name
Hands-On (Version 0.5)
! Nagios-konforme Ausgabe der
Performance-Daten
! Timeoutmanagement integrieren
31
ingo@lantschner.name
To be continued ...
• wahlweise auch Aggregate abfragen
• Ausgabe umfangreicher gestalten
• und vieles anderes mehr
• Weiterentwicklungen ev. zu finden auf
• Nagiosexchange
• http://ingo.lantschner.name/Nagios.html
32
ingo@lantschner.name
Danke ...
... für‘s Mitmachen und noch eine
schöne Konferenz!
ingo@lantschner.name
+43-664-143 84 18
http://ingo.lantschner.name
http://itblog.lantschner.name
33

Weitere ähnliche Inhalte

Was ist angesagt?

OSDC 2011 | FAI - Fully Automatic Installation by Thomas Lange
OSDC 2011 | FAI - Fully Automatic Installation by Thomas LangeOSDC 2011 | FAI - Fully Automatic Installation by Thomas Lange
OSDC 2011 | FAI - Fully Automatic Installation by Thomas Lange
NETWAYS
 
Ldap sqlnet
Ldap sqlnetLdap sqlnet
Ldap sqlnet
Gunther Pippèrr
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit Juju
Frank Müller
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
Sebastian Springer
 
SysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB – System DataBase — Ein Datenaggregator für System-InformationenSysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB Project
 
01 sqlplus
01 sqlplus01 sqlplus
01 sqlplus
Gunther Pippèrr
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der Nebenläufigkeit
Frank Müller
 
Python Mike Müller
Python Mike MüllerPython Mike Müller
Python Mike Müller
Aberla
 
FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
Karsten Dambekalns
 
Windows Powershell
Windows PowershellWindows Powershell
Windows Powershell
Thomas Wilhelm Wiefel
 
Varnish PHP Unconference Hamburg 2012
Varnish PHP Unconference Hamburg 2012Varnish PHP Unconference Hamburg 2012
Varnish PHP Unconference Hamburg 2012
Florian Holzhauer
 
Performance durch Caching
Performance durch CachingPerformance durch Caching
Performance durch Caching
AOE
 
Typo3 und Varnish
Typo3 und VarnishTypo3 und Varnish
Typo3 und Varnish
Oliver Thiele
 
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Christian Wenz
 
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas LangeOSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
NETWAYS
 
PhpStorm 6 Configuration for TYPO3
PhpStorm 6 Configuration for TYPO3PhpStorm 6 Configuration for TYPO3
PhpStorm 6 Configuration for TYPO3
marco-huber
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17
remigius-stalder
 
Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - Workshop
Waldemar Dell
 
digitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM Developer Day 2011: digitalSTROM-Server-AppsdigitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM.org
 

Was ist angesagt? (19)

OSDC 2011 | FAI - Fully Automatic Installation by Thomas Lange
OSDC 2011 | FAI - Fully Automatic Installation by Thomas LangeOSDC 2011 | FAI - Fully Automatic Installation by Thomas Lange
OSDC 2011 | FAI - Fully Automatic Installation by Thomas Lange
 
Ldap sqlnet
Ldap sqlnetLdap sqlnet
Ldap sqlnet
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit Juju
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
SysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB – System DataBase — Ein Datenaggregator für System-InformationenSysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB – System DataBase — Ein Datenaggregator für System-Informationen
 
01 sqlplus
01 sqlplus01 sqlplus
01 sqlplus
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der Nebenläufigkeit
 
Python Mike Müller
Python Mike MüllerPython Mike Müller
Python Mike Müller
 
FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
 
Windows Powershell
Windows PowershellWindows Powershell
Windows Powershell
 
Varnish PHP Unconference Hamburg 2012
Varnish PHP Unconference Hamburg 2012Varnish PHP Unconference Hamburg 2012
Varnish PHP Unconference Hamburg 2012
 
Performance durch Caching
Performance durch CachingPerformance durch Caching
Performance durch Caching
 
Typo3 und Varnish
Typo3 und VarnishTypo3 und Varnish
Typo3 und Varnish
 
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
 
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas LangeOSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
OSDC 2010 | FAI - ein Projekt wird 10 Jahre alt by Thomas Lange
 
PhpStorm 6 Configuration for TYPO3
PhpStorm 6 Configuration for TYPO3PhpStorm 6 Configuration for TYPO3
PhpStorm 6 Configuration for TYPO3
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17
 
Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - Workshop
 
digitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM Developer Day 2011: digitalSTROM-Server-AppsdigitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
 

Ähnlich wie OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by Ingo Latschner

Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
s0enke
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershell
Creasoft AG
 
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
NETWAYS
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
Christian Colbach
 
Automatisierte Linux Administration mit (R)?ex
Automatisierte Linux Administration mit (R)?ex Automatisierte Linux Administration mit (R)?ex
Automatisierte Linux Administration mit (R)?ex
Jan Gehring
 
Einfuehrung in die Erstellung von Software-Paketen mit dem RPM Package Manager
Einfuehrung in die Erstellung von Software-Paketen mit dem RPM Package ManagerEinfuehrung in die Erstellung von Software-Paketen mit dem RPM Package Manager
Einfuehrung in die Erstellung von Software-Paketen mit dem RPM Package Manager
Lenz Grimmer
 
Vagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungVagrant - Einführung & Verwendung
Vagrant - Einführung & Verwendung
Tilo Baller
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
Jens Siebert
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
Josef Adersberger
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
QAware GmbH
 
Automation with Ansible
Automation with AnsibleAutomation with Ansible
Automation with Ansible
SusannSgorzaly
 
Grundlagen puppet
Grundlagen puppetGrundlagen puppet
Grundlagen puppet
inovex GmbH
 
Azure Notebooks
Azure NotebooksAzure Notebooks
Azure Notebooks
TEitelberg
 
Einfacher bauen
Einfacher bauenEinfacher bauen
Einfacher bauen
johofer
 
Backend-Services mit Rust
Backend-Services mit RustBackend-Services mit Rust
Backend-Services mit Rust
Jens Siebert
 
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfDockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Syahri Ramadhan
 
Rex - Infrastruktur als Code
Rex - Infrastruktur als CodeRex - Infrastruktur als Code
Rex - Infrastruktur als Code
Jan Gehring
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
agilemethoden
 
Agorum core-installation-linux-6 4-0a
Agorum core-installation-linux-6 4-0aAgorum core-installation-linux-6 4-0a
Agorum core-installation-linux-6 4-0a
agorum Software GmbH
 

Ähnlich wie OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by Ingo Latschner (20)

Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershell
 
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
 
Automatisierte Linux Administration mit (R)?ex
Automatisierte Linux Administration mit (R)?ex Automatisierte Linux Administration mit (R)?ex
Automatisierte Linux Administration mit (R)?ex
 
Einfuehrung in die Erstellung von Software-Paketen mit dem RPM Package Manager
Einfuehrung in die Erstellung von Software-Paketen mit dem RPM Package ManagerEinfuehrung in die Erstellung von Software-Paketen mit dem RPM Package Manager
Einfuehrung in die Erstellung von Software-Paketen mit dem RPM Package Manager
 
Vagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungVagrant - Einführung & Verwendung
Vagrant - Einführung & Verwendung
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Automation with Ansible
Automation with AnsibleAutomation with Ansible
Automation with Ansible
 
Grundlagen puppet
Grundlagen puppetGrundlagen puppet
Grundlagen puppet
 
Azure Notebooks
Azure NotebooksAzure Notebooks
Azure Notebooks
 
Einfacher bauen
Einfacher bauenEinfacher bauen
Einfacher bauen
 
Backend-Services mit Rust
Backend-Services mit RustBackend-Services mit Rust
Backend-Services mit Rust
 
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfDockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
 
Rex - Infrastruktur als Code
Rex - Infrastruktur als CodeRex - Infrastruktur als Code
Rex - Infrastruktur als Code
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
 
Agorum core-installation-linux-6 4-0a
Agorum core-installation-linux-6 4-0aAgorum core-installation-linux-6 4-0a
Agorum core-installation-linux-6 4-0a
 

OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by Ingo Latschner

  • 1. ingo@lantschner.name Nagios Plugins für NetApp-Filer entwickeln! Workshop am 12. September 2008 in Nürnberg 1
  • 2. ingo@lantschner.name Vorgeschichte • 2005 Spezialisierung auf Systemmonitoring, Trendanalyse, OSS, Nagios • 2006 Upgrade und Administration des ÖGB-Nagios • 2007 Erstellen von Plugins für VMware ESX3, Brocade Switches, HP iLO BMCs, u.a. ! NetApp: erste Versuche mit SNMP und Erstellung von NetApp-Plugins (Telnet/SSH basierend) • 2008 Auftrag größere Anzahl umfassender Plugins für NetApp-Filer zu erstellen 2
  • 3. ingo@lantschner.name NetApp Plugins 2008 • Auftraggeber CUBiT • Work in Progress ... • Auf die Anforderungen dieses Kunden zugeschnittene Plugins • Datenbankabfragen statt Kommandozeilen-Parameter • Mehrsprachig (Deutsch als Default, Englisch und Schwedisch über GNU- gettext) • single-/multiline Ausgabe (für Nagios 3) • Umfassend (Hardware, ONTAP, Aggregate, traditionelle Volumes, Flexvols, Snapshots, WAFL-Scans, Plattenzustand, gcount, Spigelsynchronität, Brocade-Switches, vFiler, Deduplication (df -s), Domainchecks (CIFS), qtrees, sysstat, Cache-Effektivität, ...) 3
  • 4. ingo@lantschner.name Vorgangsweise in diesem Workshop 1. Einige theoretische Erklärungen (Nagios-Plugins und DataONTAP Schnittstellen) 2. Vorstellung eines sehr einfachen Codegerüstes (bereits funktional) 3. Vorschlag Erweiterungen 1 4. Hands-On: Integration dieser Erweiterungen 5. Vorschlag Erweiterungen 2 - Ziel: vollwertiges Nagios-Plugin 6. Vorführung und Erklärung an Hand eins fertigen Beispiels (wäre sehr viel Tipparbeit) 7. Vorschlag Erweiterung 3 - Ziel: Performancedaten, Timeout-Management 8. Hands-On: Integration von Vorschlag 3 4
  • 5. ingo@lantschner.name Datenquellen für Nagios-Plugins • SNMP • schlankes, zuverlässiges Protokoll • Version 1: Counter laufen über • Version 2: unverschlüsselt (nur sichere Netze) • SMTP: Verarbeiten von Warnmails • HTTP: Perl&LWP • Telnet/SSH: Net::SSH • Webservices: HTTP(S), XML 5
  • 6. ingo@lantschner.name Beispiel Telnet/SSH # connect either via telnet or ssh if (defined $opts{telnet}) { my $t = Net::Telnet->new( Timeout => 10, Prompt => '/>/', Host => $host, ); $t->login($user, $pass); @dlist = $t->cmd("storage show disk"); @dnames = get_disknames(); #(v4.15 v4.16 ...) %GCOUNTS = get_gcounts($t); foreach (keys %GCOUNTS) { if (defined $opts{debug}) { print "$_ --> $GCOUNTS{$_}n"; } if ( $GCOUNTS{$_} >= $warn and $exit!=2 ) {$exit = 1} if ( $GCOUNTS{$_} >= $crit ) {$exit = 2} } } else { print "SSH not implemented yet - sorry! Pls. use --telnet.n"; exit 3; } 6
  • 7. ingo@lantschner.name Probleme Telnet/SSH • Net::SSH ist teils schwer zu implementieren • Andere SSH-Module forken - schlecht für Performance/Sicherheit • semiprofessioneller Ansatz - Änderungen im CLI können fatale Auswirkungen haben. (Das CLI wurde nicht für automatisierte Abfragen konzipiert und wird vom Hersteller kaum unter diesem Aspekt gewartet und weiterentwickelt) • Telnet machte mit neueren ONTAP-Versionen Probleme 7
  • 8. ingo@lantschner.name Webservices Schnittstelle • professioneller Ansatz (vom Hersteller unterstützt) • relativ zukunftssicher, hat sich bei den ESX-Plugins schon bewährt • sprachunabhängig (Java, C, Perl) • Kommunikation über HTTP oder HTTPS • Übertragung von XML-Files • Strikt objektorientierte Datenstrukturen, die in Perl z.B. auch mit DataDumper ausgegeben werden können 8
  • 9. SMB calls Ontap Counter Manager (CM) Storage System Performance counters Filer Data Archives CLI DFM ManageONTAP APIs Windows Perfmon Support Windows Perfmon Clients Existing Performanc e Commands 3rd Party Management Tools Auto- suppo rt SNMP At the base of the performance infrastructure there are a set of performance counters accessible through existing performance commands. Above this set of performance counters, is a thin layer of abstraction called Counter Manager (CM). Blockdiagramm NetApp Performance Infrastruktur
  • 10. ingo@lantschner.name NetApps perf-API: Terminologie Organisationsbez. repräsentiert Beispiel Objekte Subsysteme processor Instanzen physische oder logische Einheiten processor0 Counter „datum“ (Messwert) processor_busy 10
  • 13. ingo@lantschner.name NetApp API: Verwendung im Überblick Schritt Aufgabe Parameter/Infos 1 Serverkontext erzeugen Servername 2 Sessionparameter setzen Protokoll (HTTP/HTTPS) user-credentials 3 Kommando an die Core API des Filers senden Kommandoname 4 Datenstruktur auswerten child_get_* ... 12
  • 14. ingo@lantschner.name NetApp API: Verwendung im Detail Schritt Aufgabe Parameter/Infos Code 1 Serverkontext erzeugen Servername $s = NaServer->new ($filer, $major_version, $minor_version); 2 Session- parameter setzen Protokoll (HTTP/ HTTPS) user-credentials $s->set_transport_type("HTTP"); $s->set_style("LOGIN_PASSWORD"); $s->set_admin_user($user, $pass); 3 Kommando an die Core API des Filers senden Kommandoname $out = $s->invoke( "volume-list-info"); # print Dumper($out) if $debug > 2; 4 Datenstruktur auswerten child_get_* ... $volume_info = $out->child_get("volumes"); @result = $volume_info->children_get(); foreach $vol (@result){ " $vol_name = $vol->child_get_string("name"); ... 13
  • 15. ingo@lantschner.name NetApp Simulator installieren 14 Simulator läuft als eigene „Maschine“ in einem Linux (mit eigener IP) ! OS X: http://lanti.wordpress.com/2008/04/09/netapp- simulator-fur-mac-os-x/ ! Linux/Windows: Doku von VMware im Installationskit (Vmware, Linux and Simulator installation.doc)
  • 16. ingo@lantschner.name Netzwerkkonfiguration „Host-only“ 15 • VMware Netzwerk auf Host-Only und verbinden • Netzwerk der VM neu starten: /etc/init.d/networking restart • VM bekommt eine Adresse wie 172.16.151.128 • Simulator starten: • Netzwerk des Simulators rekonfigurieren: ifconfig ns0 172.16.151.132 netmask 0xffffff00 • Testen: $ telnet 172.16.151.132 • Hosteintrag in /etc/hosts (spart viel Tipperei)
  • 17. ingo@lantschner.name Starten des NetApp Simulators 1. VM starten 2. Anmelden als ubuntu%ubuntu (= Username „ubuntu“ und Passwort „ubuntu“) 3. Starten des Simulators: /sim3/runsim.sh • Optional • ggf. Anmelden als root% • Useraccount für Abfragen über die API: nagios%nagios88 16
  • 18. ingo@lantschner.name check_netapp_space.pl - Version 0.1 • Erstes Skript zur Abfrage von Performancewerten - noch kein Nagios-Plugin • Anforderungen • Kontaktieren des Servers • Daten holen und auswerten • Ausgabe auf die Comandline 18
  • 19. ingo@lantschner.name Code und Ausgabe Version 0.1 $ ./check_netapp_space-01.pl Volume name: cachevol Total Size: 20971520 bytes Used Size: 81920 bytes Used Size: 0 % ---------------------------- Volume name: vol0 Total Size: 253640704 bytes Used Size: 66895872 bytes Used Size: 26 % ---------------------------- Volume name: sv_vol Total Size: 16777216 bytes Used Size: 278528 bytes Used Size: 2 % ---------------------------- # Schritt 1: Servercontext erzeugen my $s = NaServer->new ($filer, ...); # Schritt 2: Sessionparameter setzen check_out($s->set_transport_type("HTTP")); check_out($s->set_style("LOGIN_PASSWORD")); check_out($s->set_admin_user($user, $pass)); # Schritt 3: Sende Komando an die Core API $out = $s->invoke( "volume-list-info"); ... my $volume_info = $out->child_get("volumes"); my @result = $volume_info->children_get(); foreach my $vol (@result){ my $vol_name = $vol->child_get_string("name"); print "Volume name: $vol_name n"; my $size_total = $vol->child_get_int("size-total"); print "Total Size: $size_total bytes n"; my $size_used = $vol->child_get_int("size-used"); print "Used Size: $size_used bytes n"; my $usedPrzt = $vol->child_get_int("percentage-used"); print "Used Size: $usedPrzt % n-------------n"; } 19
  • 20. ingo@lantschner.name Datenstrukturen 1: Data::Dumper 20 • Ausgabe mit Datadumper • Ausgabe kann theoretisch auch geparst werden • Eigentliche Aufgabe: • Datenstrukturen auspacken • Datenstrukturen verstehen • Debugging (z.B. fehlerhafte Dokus aufdecken, ...) • Code (wenn $out eine Referenz auf eine Datenstruktur ist): use Data::Dumper; .... print Dumper($out);
  • 21. ingo@lantschner.name Datenstrukturen 2: Ausgabe von Data::Dumper 21 $VAR1 = bless( { 'content' => '', 'name' => 'results', 'children' => [ bless( { 'content' => '', 'name' => 'volumes', 'children' => [ bless( { 'content' => '', 'name' => 'volume-info', 'children' => [ bless( { 'content' => 'cachevol', 'name' => 'name', 'children' => [], 'attrvals' => [], 'attrkeys' => [] }, 'NaElement' ), bless( { 'content' => 'bb1ff1 ...', 'name' => 'uuid', ... ), bless( { 'content' => 'flex', 'name' => 'type', ...), bless( { 'content' => 'online', 'name' => 'state', ... ), bless( { 'content' => '20971520', 'name' => 'size-total',
  • 22. ingo@lantschner.name Datenstruktur und Befehle 22 $out = $s->invoke( "volume-list-info"); ... my $volume_info = $out->child_get("volumes"); my @result = $volume_info->children_get(); foreach my $vol (@result){ my $vol_name = $vol->child_get_string("name"); $VAR1 = ( {'content' => '', 'name' => 'results', 'children' => [( { 'content' => '', 'name' => 'volumes', 'children' => [( { 'content' => '', 'name' => 'volume-info', 'children' => [( { 'content' => 'cachevol', 'name' => 'name', 'children' => [],
  • 23. ingo@lantschner.name Datenstruktur und Befehle 22 $out = $s->invoke( "volume-list-info"); ... my $volume_info = $out->child_get("volumes"); my @result = $volume_info->children_get(); foreach my $vol (@result){ my $vol_name = $vol->child_get_string("name"); $VAR1 = ( {'content' => '', 'name' => 'results', 'children' => [( { 'content' => '', 'name' => 'volumes', 'children' => [( { 'content' => '', 'name' => 'volume-info', 'children' => [( { 'content' => 'cachevol', 'name' => 'name', 'children' => [],
  • 24. ingo@lantschner.name Hands-On (Version 0.1) ! Ausgabe der Volumeinfos auf die Comandline ! Einbau von Datadumper und Ausgabe der Datenstruktur 23
  • 25. ingo@lantschner.name check_netapp_space.pl - Version 0.3 • prinzipiell sinnvolles Nagios-Plugin • Anforderungen wie in Version 0.1 und zusätzlich • Nagios-konforme Übernahme von Servername, Credentials, Schwellwerten als Parameter (Nagios::Plugin) • Ermitteln und Ausgabe des Maximalwertes (das am meisten belegte Volume) • Rückgabewert (0,1,2) abhängig von den Schwellwerten 24
  • 26. Demo und Erklärung Version 0.3
  • 27. ingo@lantschner.name check_netapp_space.pl - Version 0.5 • vollwertiges Nagios-Plugin • Anforderungen wie in Version 0.3 und zusätzlich • Nagios-konforme Ausgabe der Performance-Daten (Nagios::Plugin::Performance) • Timeoutmanagement 26
  • 28. ingo@lantschner.name Performance Daten aller Volumes plotten foreach my $vol (@result){ ... $p->add_perfdata( label => "$vol_name", value => $belegtPrzt, uom => "%", threshold => $p->threshold(), ); ... } 27
  • 29. ingo@lantschner.name Performance Daten der Volumes plotten - Ausgabe foreach my $vol (@result){ ... $p->add_perfdata( label => "$vol_name", value => $belegtPrzt, uom => "%", threshold => $p->threshold(), ); ... } $ ./check_netapp_space-05.pl -H sim3 -p nagios88 NETAPP_SPACE-05 OK - Max. used volume on sim3 is vol0 (26.00 % used) | cachevol=0%;70;90 vol0=26%;70;90 sv_vol=2%;70;90 28
  • 30. ingo@lantschner.name Timeout-Management my $timeout = $p->opts->timeout; $SIG{ALRM} = sub { $p->nagios_die("ERROR: Timeout ($timeout s) reached"); }; # hierher kommt der eigentliche Code des Plugins, # vor allem Abfragen zum Filer und alles was sonst # noch hängen bleiben kann. alarm $timeout; 29
  • 31. ingo@lantschner.name Timeout-Management - Ausgabe my $timeout = $p->opts->timeout; $SIG{ALRM} = sub { $p->nagios_die("ERROR: Timeout ($timeout s) reached"); }; # main code here alarm $timeout; $ ./check_netapp_space-05.pl -H sim3 -p nagios88 NETAPP_SPACE-05 UNKNOWN - ERROR: Timeout (15 s) reached 30
  • 32. ingo@lantschner.name Hands-On (Version 0.5) ! Nagios-konforme Ausgabe der Performance-Daten ! Timeoutmanagement integrieren 31
  • 33. ingo@lantschner.name To be continued ... • wahlweise auch Aggregate abfragen • Ausgabe umfangreicher gestalten • und vieles anderes mehr • Weiterentwicklungen ev. zu finden auf • Nagiosexchange • http://ingo.lantschner.name/Nagios.html 32
  • 34. ingo@lantschner.name Danke ... ... für‘s Mitmachen und noch eine schöne Konferenz! ingo@lantschner.name +43-664-143 84 18 http://ingo.lantschner.name http://itblog.lantschner.name 33