FMH preview - Nagios

FMH preview - Nagios

Writing Custom Nagios Plugins in Perl Nathan Vonnahme [email protected] To get the most out of this session, make sure you have Perl and the Nagios::Plugin module is installed. Why write Nagios plugins? Checklists are boring. Life is complicated. OK is complicated. Why in Perl?

Familiar to many sysadmins Cross-platform CPAN Mature Nagios::Plugin API Embeddable in Nagios (ePN) Examples and documentation Swiss army chainsaw 2011 Buuuuut I dont like Perl Nagios plugins are very simple. Use any language you like. Eventually, imitate Nagios::Plugin.

2011 got Perl? Linux and Mac already have it: which perl On Windows, I prefer 1. Cygwin (N.B. make, gcc4) 2. Strawberry Perl 3. ActiveState Perl Any version Perl 5 should work. 2011

5 got Documentation? developer-guidelines.html Or, Case sensitive! Save for later with your phone?

2011 got an idea? Check the validity of my backup file F. 2011 Simplest Plugin Ever #!/usr/bin/perl if (-e $ARGV[0]) { # File in first arg exists. print "OK\n"; exit(0); }

else { print "CRITICAL\n"; exit(2); } 2011 8 Simplest Plugin Ever Save, then run with one argument: $ ./ foo.tar.gz CRITICAL

$ touch foo.tar.gz $ ./ foo.tar.gz OK But: Will it succeed tomorrow? 2011 But OK is complicated. Check the validity* of my backup file F. Existent Less than X hours old Between Y and Z MB in size

* further opportunity: check the restore process! BTW: Gavin Carr with Open Fusion in Australia has already written a check_file plugin that could do this, but were learning here. Also confer 2001 check_backup plugin by Patrick Greenwell, but its pre-Nagios::Plugin. 2011 Bells and Whistles Argument parsing Help/documentation Thresholds Performance data These things make up the majority of

the code in any real plugin. 2011 Bells, Whistles, and Cowbell Nagios::Plugin Ton Voon rocks Gavin Carr too Used in production Nagios plugins everywhere Since ~ 2006

2011 Bells, Whistles, and Cowbell Install Nagios::Plugin sudo cpan Configure CPAN if necessary... cpan> install Nagios::Plugin Potential solutions: Configure http_proxy environment variable if behind firewall cpan> o conf prerequisites_policy

follow cpan> o conf commit cpan> install Params::Validate 2011 got an example plugin template? Use from the Nagios::Plugin distribution as your template. This is always a good place to start a plugin. Were going to be turning into the finished example. 2011 got the finished example? Published with Gist: or Note the raw hyperlink for downloading the Perl source code. The roman numerals in the comments match the next series of slides.

2011 Check your setup 1. Save ( as e.g. 2. Change the first shebang line to point to the Perl executable on your machine. #!c:/strawberry/bin/perl 3. Run it ./ 4. You should get: MY_CHECK_BACKUP UNKNOWN argument

you didn't supply a threshold 5. If yours works, help your neighbors. 2011 Design: Which arguments do we need? File name Age in hours Size in MB 2011 Design: Thresholds

Non-existence: CRITICAL Age problem: CRITICAL if over age threshold Size problem: WARNING if outside size threshold (min:max) 2011 I. Prologue (working from use strict; use warnings; use Nagios::Plugin; use File::stat; use vars qw($VERSION $PROGNAME $verbose $timeout $result);

$VERSION = '1.0'; # get the base name of this script for use in the examples use File::Basename; $PROGNAME = basename($0); 2011 II. Usage/Help Changes from in bold my $p = Nagios::Plugin->new( usage => "Usage: %s [ -v|--verbose ] [-t ] [ -f|--file= ] [ -a|--age= ]

[ -s|--size= ]", version => $VERSION, blurb => "Check the specified backup file's age and size", extra => " Examples: $PROGNAME -f /backups/foo.tgz -a 24 -s 1024:2048 Check that foo.tgz exists, is less than 24 hours old, and is between 1024 and 2048 MB. ); 2011 III. Command line arguments/options

Replace the 3 add_arg calls from with: # See Getopt::Long for more $p->add_arg( spec => 'file|f=s', required => 1, help => "-f, --file=STRING The backup file to check. REQUIRED."); $p->add_arg( spec => 'age|a=i', default => 24, help => "-a, --age=INTEGER Maximum age in hours. Default 24."); $p->add_arg( spec => 'size|s=s',

help => "-s, --size=INTEGER:INTEGER Minimum:maximum acceptable size in MB (1,000,000 bytes)"); # Parse arguments and process standard ones (e.g. usage, help, version) $p->getopts; 2011 Now its RTFM-enabled If you run it with no args, it shows usage: $ ./ Usage: [ -v|--verbose ] [-t ] [ -f|--file= ] [ -a|--age= ]

[ -s|--size= ] 2011 Now its RTFM-enabled $ ./ --help 1.0 This nagios plugin is free software, and comes with ABSOLUTELY NO WARRANTY. It may be used, redistributed and/or modified under the terms of the GNU General Public Licence (see Check the specified backup file's age and size

Usage: [ -v|--verbose ] [-t ] [ -f|--file= ] [ -a|--age= ] [ -s|--size= ] -?, --usage Print usage information -h, --help Print detailed help screen -V, --version Print version information 2011 Now its RTFM-enabled --extra-opts=[section][@file]

Read options from an ini file. See for usage and examples. -f, --file=STRING The backup file to check. REQUIRED. -a, --age=INTEGER Maximum age in hours. Default 24. -s, --size=INTEGER:INTEGER Minimum:maximum acceptable size in MB (1,000,000 bytes) -t, --timeout=INTEGER Seconds before plugin times out (default: 15) -v, --verbose Show details for command-line debugging (can repeat up to 3 times) Examples: -f /backups/foo.tgz -a 24 -s 1024:2048 Check that foo.tgz exists, is less than 24 hours old, and is between 1024 and 2048 MB. 2011 IV. Check arguments for sanity Basic syntax checks already defined with add_arg, but replace the sanity checking with: # Perform sanity checking on command line options. if ( (defined $p->opts->age) && $p->opts->age < 0 ) { $p->nagios_die( " invalid number supplied for the age option " );

} Your next plugin may be more complex. 2011 Ooops At first I used -M, which Perl defines as Script start time minus file modification time, in days. Nagios uses embedded Perl so the script start time may be hours or days ago. 2011 V. Check the stuff

# Check the backup file. my $f = $p->opts->file; unless (-e $f) { $p->nagios_exit(CRITICAL, "File $f doesn't exist"); } my $mtime = File::stat::stat($f)->mtime; my $age_in_hours = (time - $mtime) / 60 / 60; my $size_in_mb = (-s $f) / 1_000_000; my $message = sprintf "Backup exists, %.0f hours old, %.1f MB.", $age_in_hours, $size_in_mb; 2011

VI. Performance Data # Add perfdata, enabling pretty graphs etc. $p->add_perfdata( label => "age", value => $age_in_hours, uom => "hours" ); $p->add_perfdata( label => "size", value => $size_in_mb, uom => "MB" );

This adds Nagios-friendly output like: | age=2.91611111111111hours;; size=0.515007MB;; 2011 VII. Compare to thresholds Add this section. combines check_threshold with nagios_exit at the very end. # We already checked for file existence. my $result = $p->check_threshold( check => $age_in_hours, warning => undef, critical => $p->opts->age );

if ($result == OK) { $result = $p->check_threshold( check => $size_in_mb, warning => $p->opts->size, critical => undef, ); } 2011 VIII. Exit Code # Output the result and exit. $p->nagios_exit( return_code => $result, message => $message

); 2011 Testing the plugin $ ./ -f foo.gz BACKUP OK - Backup exists, 3 hours old, 0.5 MB | age=3.04916666666667hours;; size=0.515007MB;; $ ./ -f foo.gz -s 100:900 BACKUP WARNING - Backup exists, 23 hours old, 0.5 MB | age=23.4275hours;; size=0.515007MB;;

$ ./ -f foo.gz -a 8 BACKUP CRITICAL - Backup exists, 23 hours old, 0.5 MB | age=23.4388888888889hours;; size=0.515007MB;; 2011 OK? Hows your plugin going? Can you help your neighbor?

Subject: ** PROBLEM alert my plugin is WARNING ** 2011 Telling Nagios to use your plugin 1. misccommands.cfg* define command{ command_name check_backup command_line $USER1$/myplugins/ -f $ARG1$ -a $ARG2$ -s $ARG3$ }

* Lines wrapped for slide presentation 2011 Telling Nagios to use your plugin 2. services.cfg (wrapped) define service{ use normal_check_interval host_name service_description check_command generic-service 1440

# 24 hours fai01337 MySQL backups check_backup!/usr/local/backups /mysql/fai01337.mysql.dump.bz2 !24!0.5:100 contact_groups linux-admins } 3. Reload config: $ sudo /usr/bin/nagios -v /etc/nagios/nagios.cfg && sudo

/etc/rc.d/init.d/nagios reload 2011 Remote execution Hosts/filesystems other than the Nagios host Requirements NRPE, NSClient or equivalent Perl with Nagios::Plugin 2011 Remote Example: Windows 2008 (This is annoyingly complex today. Anyone?)

1. Install latest NC_Net MSI on Windows machine 2. Let it through Windows Firewall (port 1248) 3. Install Perl and Nagios::Plugin 4. Put my in C:\Program Files\MontiTech\ Nc_net_Setup_v5\script 5. Compile the NC_Net version of check_nt on the Nagios server.* 6. Make wrapper C:\Program Files\MontiTech\ Nc_net_Setup_v5\script check_my_backup.bat : @echo off C:\cygwin\bin\perl .\ -f foo.bak 2011

Profit $ plugins/check_nt -H winhost -p 1248 -v RUNSCRIPT -l check_my_backup.bat OK - Backup exists, 12 hours old, 35.7 MB | age=12.4527777777778hours;; size=35.74016MB;; 2011 Share

exchange. 2011 Other tools and languages C TAP Test Anything Protocol See from my other talk Python Shell Ruby? C#? VB? JavaScript? AutoIt!

2011 A horrifying/inspiring example The worst things need the most monitoring. 2011 Chart servers MS Word macro Mail merge Runs in user session Need about a dozen

2011 It gets worse. Not a service Not even a process 100% CPU is normal OK is complicated. 2011 Many failure modes 2011

AutoIt to the rescue Func CompareTitles() For $title=1 To $all_window_titles[0][0] Step 1 $state=WinGetState($all_window_titles[$titl e][0]) $foo=0 $do_test=0 For $foo In $valid_states If $state=$foo Then $do_test +=1 EndIf Next If $all_window_titles[$title][0] <> "" AND

$do_test>0 Then $window_is_valid=0 For $string=0 To $num_of_strings-1 Step 1 $match=StringRegExp($all_window_titles[$tit le][0], $valid_windows[$string]) $window_is_valid += $match Next if $window_is_valid=0 Then $return=2 $detailed_status="Unexpected window *" & $all_window_titles[$title][0] & "* present" & @LF & "***" & $all_window_titles[$title][0] & "*** doesn't match anything we expect."

NagiosExit() EndIf If StringRegExp($all_window_titles[$title][0], $valid_windows[0])=1 Then $expression=ControlGetText($all_window_titl es[$title][0], "", 1013) EndIf EndIf Next $no_bad_windows=1 EndFunc Func NagiosExit() ConsoleWrite($detailed_status)

Exit($return) EndFunc CompareTitles() if $no_bad_windows=1 Then $detailed_status="No chartserver anomalies at this time -- " & $expression $return=0 EndIf NagiosExit() 2011 Nagios now knows when theyre broken

2011 Life is complicated OK is complicated. Custom plugins make Nagios much smarter about your environment. 2011 Questions? Comments? 2011

Recently Viewed Presentations

  • Welcome Parents to

    Welcome Parents to

    Change the subject from Maurizio Io… Change the subject from Maurizio Tu Change the subject from Maurizio Tu e Maria Presente Indicativo dei Verbi Regolari Present Indicative Tense of Regular Verbs Presente Forms There are 3 conjugations of Italian verbs:...
  • Neurological Applications of Focused Ultrasound Nishanth Khanna MD,

    Neurological Applications of Focused Ultrasound Nishanth Khanna MD,

    A single element US transducer can focus acoustic wave propagation at a specific point . The structure of the transducer depends on the target tissue. The therapeutic benefit of FUS relies on energy deposition via acoustic wave propagation to a...
  • Headteachers Briefing Pack

    Headteachers Briefing Pack

    The Preparation Test must remain confidential and is the property of CEM. It should not be sent home. The test papers and answer sheets will be collected securely and pulped. The Preparation Test will not be marked -no marking key...
  • Earth Science

    Earth Science

    The Earth's Surface Topography: The shape of the land. The topography of an area includes the area's elevation, relief, and landforms. Elevation - Relief Elevation -height above sea level Relief - difference between the highest and the lowest points of...
  • Quality Transformation Peter Caron My slides are /

    Quality Transformation Peter Caron My slides are /

    Quality Transformation. Peter Caron. What is a Q Transformation? We need to start thinking a bit differently about things before we can answer this question.
  • Earth Day 2008 - Sowing Hope for the Planet

    Earth Day 2008 - Sowing Hope for the Planet

    Biosphere. Hydrosphere. Geosphere. Includes mixture of gases that surround the planet. Includes all living things: plants, animals, other organisms. Includes the crust, mantle, inner & outer core. ... If you do not have a water bottle, We Request that -
  • Chapter 11 The Civil War Confederate States of

    Chapter 11 The Civil War Confederate States of

    Election of 1864. Abraham Lincoln (Republican) v. George McClellan (Democrat) Lincoln is reelected - 2nd Inaugural Address: "With malice toward none, with charity for all, with firmness in the right as God gives us to see the right, let us...
  • Malaria_Speech_Synod_Assembly_Final.pptx


    Prevention - Education - Treatment - Sustainable Livelihoods . For most of us in the U.S., mosquitoes are merely a nuisance. But in many parts of the world, mosquitoes carry malaria- a preventable, treatable disease that can be deadly if...