This article explains how to configure SNMP for use with Nagios on a CentOS server. It’s assumed you already have Nagios installed but not necessarily configure to use SNMP to monitor a host. We use “Disk Space” monitoring in this article.
For this article, i’ve used the following versions:
1. Nagios Version 3.5.0
2. CentOS 6.2
Configure SNMP
Install SNMP:
yum install net-snmp*
Change the “community name” from “public” to something more secure. Edit the file “/etc/snmp/snmpd.conf” using this example as a guide:
com2sec mynetwork 127.0.0.1 public com2sec mynetwork 192.168.0.0/24 public com2sec mynetwork nagios.agix.com.au public group MyROGroup v1 mynetwork group MyROGroup v2c mynetwork view all included .1 access MyROGroup "" any noauth exact all none none syslocation Unknown (edit /etc/snmp/snmpd.conf) syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf) disk / 1000000 pass .1.3.6.1.4.1.4413.4.1 /usr/bin/ucd5820stat rwuser agixmon
Restart SNMP:
service snmpd restart
Test if from the localhost (the server running SNMP):
snmpwalk -v2c -c myComNameSecret localhost:161
You should get plenty of information out of it. Make sure to allow UDP port “161” through your firewall/router to this SNMP server.
Configure Nagios
Add the following to your “/usr/local/nagios/etc/objects/services.cfg” file:
define service{ use generic-service hostgroup_name group_disk_space service_description checkDiskSpace is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 60 retry_check_interval 1 notification_interval 240 notification_period 24x7 notification_options c,r check_command check_hd }
And now list the computers that need to be monitored (“MYSERVER1” and “MYSERVER2” in this example). This is in the same file as above:
define hostgroup{ hostgroup_name group_disk_space alias group_disk_space members MYSERVER1, MYSERVER2 #hostgroup_members hostgroups notes group_disk_space notes_url url action_url url }
Now edit your “/usr/local/nagios/etc/objects/commands.cfg” and add the following. Note that you should change the “public” community name to be the same as used earlier – assuming you changed it earlier:
define command{ command_name check_hd command_line $USER1$/check_hd $HOSTADDRESS$ public 90 95 /home }
You will need to add the following script contents into the file “/usr/local/nagios/libexec/check_hd”:
#!/usr/bin/perl # Dont use the embedded apache perl.... # Author : Peter # Date : Apr 11 2006 # check_hd IP COMMUNITY warnlevel criticallevel disc use POSIX; sub print_usage { print " ############################## check_hd ############################### # Version : 1.0 # Date : Apr 11 2006 # Author : Peter Stimpel # Modified : By AGIX July 03 2013 # Thanks to Benjamin Jakubowski for the idea to walk through snmp # Help : http://www.peters-webcorner.de/nagios/ # Licence : GPL - http://www.fsf.org/licenses/gpl.txt #######################################################################n"; print "check_hd IP COMMUNITY warnlevel criticallevel discn"; print"ncheck_hd -v for version infon"; } $PROGNAME = "check_hd"; if (@ARGV[0] eq "-v") { print_usage(); exit 0; } if ( @ARGV[0] eq "" || @ARGV[1] eq "" || @ARGV[2] eq "" || @ARGV[3] eq "" || @ARGV[4] eq "") { print_usage(); exit 0; } $IP=@ARGV[0]; $COMMUNITY=@ARGV[1]; $Service=@ARGV[2]; $LW=@ARGV[4]; $resultat =`/usr/bin/snmpwalk -v 2c -c $COMMUNITY $IP hrStorageDescr | grep -m 1 $LW`; $fullsize1=0; $usedsize1=0; $freespace=0; if ( $resultat ) { $resstring= $resultat; if ($resultat = ~/hrStorageDescr./) { $tsid = substr($resstring,35,2); $resultat2 =`/usr/bin/snmpwalk -v 2c -c $COMMUNITY $IP hrStorageAllocationUnits.$tsid`; $resstring2 = $resultat2; if ($resultat2 = ~/hrStorageAllocationUnits.$tsid/) { #@unit = substr($resstring2,58,5); @unit=split(/:/,$resstring2); @unit1=split(/ /,$unit[3]); $unit1=$unit1[1]; $resultat3 =`/usr/bin/snmpwalk -v 2c -c $COMMUNITY $IP hrStorageSize.$tsid`; $resstring3 = $resultat3; if ($resultat3 = ~/hrStorageSize.$tsid/) { @ta=split(/INTEGER/,$resstring3); chomp($ta[1]); $size1=substr($ta[1],1); $fullsize1 = $fullsize1 + $size1; $fullsize1 = $fullsize1 * $unit1; } $resultat4 =`/usr/bin/snmpwalk -v 2c -c $COMMUNITY $IP hrStorageUsed.$tsid`; $resstring4 = $resultat4; if ($resultat4 = ~/hrStorageUsed.$tsid/) { @tb=split(/INTEGER/,$resstring4); chomp($tb[1]); $size1=substr($tb[1],1); $usedsize1 = $usedsize1 + $size1; $usedsize1 = $usedsize1 * $unit1; } if ($usedsize1 > 0 && $fullsize1 > 0) { $freespace=$fullsize1 - $usedsize1; $freespace=$freespace / 1024 / 1024 / 1024; $percfilled=$usedsize1 * 100 / $fullsize1; if ($percfilled > @ARGV[3]) { print "critical: $LW in use " . ceil($percfilled) . "% and " . ceil($freespace) . "GB free w-$ARGV[2]% c-$ARGV[3]%n"; exit 2; } if ($percfilled > @ARGV[2]) { print "warning: $LW in use " . ceil($percfilled) . "% and " . ceil($freespace) . "GB free w-$ARGV[2]% c-$ARGV[3]%n"; exit 1; } print "OK: $LW in use " . ceil($percfilled) . "% and " . ceil($freespace) . "GB free w-$ARGV[2]% c-$ARGV[3]%n"; exit 0; } } } print "Critical : Response unknownn"; exit 2; } else { print "Critical : no responsen"; exit 2; }
Set the permissions and ownership of the above script:
chmod 755 /usr/local/nagios/libexec/check_hd chown nagios.root /usr/local/nagios/libexec/check_hd
Restart Nagios:
service nagios restart