Tech

Guides
 

Execute local Nagios checks on remote systems

By Vincent Danen, Special to ZDNet Asia
Monday, July 09, 2007 10:21 AM
Vincent Danen shows how you can monitor remote services and local statistics with a little bit of work and planning.
I've covered the system monitoring tool Nagios in a previous tip, focusing on using it to monitor remote systems and explaining some of its basic configurations. But, in addition to monitoring remote services and local statistics, it can monitor local statistics on remote servers with a little bit of work and planning.

To start with, you need a means to execute the Nagios check plug-ins, which are all stand-alone programs on the remote system, and to be able to see the results locally. For this, a combination of Netcat and a "super-server" such as xinetd or ipsvd are needed. First, however, copy some of the Nagios plug-ins from a local system to the remote (if they are the same architecture) or compile the Nagios plug-ins on the remote server. The plug-ins of primary interest are: check_disk, check_load, check_procs, and check_users. Copy these files somewhere on the remote system such as /usr/local/nagios.

Next, you need a wrapper script that will execute each program. To prevent having to have a network port open for each plug-in, the wrapper will take arguments to determine which plug-in to execute. This wrapper is a simple shell script, so copy the snippet below into a file like /usr/local/bin/nagioscheck and make it executable:

#!/bin/sh

read -e -t 10 cmd

if [ "${cmd}" == "" ]; then

exit 0

fi

cname="`echo ${cmd}|cut -d ' ' -f 1`"

carg="`echo ${cmd}|cut -d ' ' -f 2-`"

case "${cname}" in

disk)

/usr/local/nagios/check_disk ${carg} && exit 0

;;

users)

/usr/local/nagios/check_users ${carg} && exit 0

;;

procs)

/usr/local/nagios/check_procs ${carg} && exit 0

;;

load)

/usr/local/nagios/check_load ${carg} && exit 0

;;

default)

exit 0

;;

esac

exit 0

Finally, using ipsvd with runit, we would make a supervised service to execute this program on an incoming connection. In this instance, we use port 122 and the following run script:

#!/bin/execlineb

/bin/fdmove -c 2 1

/bin/export PATH "/sbin:/bin:/usr/sbin:/usr/bin"

/sbin/chpst -e /etc/sysconfig/env/tcpsvd/

/sbin/chpst -e ./env/

/bin/multisubstitute {

import -D "localhost" HOSTNAME

import -D 0 IP

import -D 122 PORT

import -D 20 MAX_CONN

import -D 5 MAX_PER_HOST

import -D 20 MAX_BACKLOG

import OPTIONS

}

/sbin/tcpsvd -v -l ${HOSTNAME} -x peers.cdb -c ${MAX_CONN} -C ${MAX_PER_HOST} -b ${MAX_BACKLOG} ${IP} ${PORT}

/usr/local/bin/nagioscheck

The above is a run script suitable for use with runit on an Annvix system. It can easily be written in bash or adapted to another system (i.e., an initscript or using xinetd or inetd instead). The benefits of using ipsvd is the nice ACL control it provides, which is essential for a system such as this to ensure that only the Nagios server can connect.

Once this service is started, configure the Nagios server. First, in the services definition file, usually services.cfg, add:

define service{

use local-service

hostgroup_name remote

service_description Total Processes

check_command check_remote_procs!250!400!RSZDT

}

And in the commands.cfg file:

define command{

command_name check_remote_procs

command_line $USER1$/check_remotelocals procs -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -s $ARG3 $

}

The astute will notice these are essentially copies of the check_local_procs definitions that come predefined with Nagios. The name has been changed along with the command_line option to call your new plug-in, check_remotelocals. You'll notice the first argument is the item to check (procs), and the -H $HOSTADDRESS$ option has been added. Otherwise it's almost identical. Likewise, you will want to make similar copies for check_remote_load, check_remote_users, and check_remote_disk.

The check_remotelocals plug-in is a bash script to actually contact the remote server and get the information you need. This file is made executable and stored with the other Nagios plug-ins, for instance, in /usr/local/nagios/libexec:

#!/bin/sh

port=122

function usage()

{

printf "\ncheck_remotelocals -H [host] [nagios_args]\n\n"

}

cmd=${1}

if [ "${cmd}" == "" ]; then

usage

exit 1

fi

if [ "${2}" == "" ]; then

usage

exit 1

fi

shift

if [ "${1}" == "-H" ]; then

if [ "${2}" == "" ]; then

usage

exit 1

else

host="${2}"

fi

else

usage

exit 1

fi

shift; shift

nagargs="${*}"

if [ "${nagargs}" == "" ]; then

usage

exit 1

fi

echo "${cmd} ${nagargs}" | nc -q 1 ${host} ${port}

This script uses Netcat to contact the remote server on the specified port and pushes the custom command, which would be procs, load, etc., as well as the Nagios plug-in commandline to the remote system. You can test the script prior to restarting the Nagios server by using:

./check_remotelocals procs -H www.myhost.com procs -w 20% -c 10% -s RSZDT

PROCS OK: 123 processes with STATE = RSZDT

That indicates there are 123 processes in that state on the remote server. If you see that returned, you know the connection works.

This is a very brief look at creating custom plug-ins and wrappers with Nagios, but shows the flexibility Nagios provides with its completely open plug-in architecture. By gluing a few things together with ipsvd, Netcat, and Nagios, you can monitor system load, process usage, free disk space, and other items securely on remote servers via Nagios.



WORTHWHILE?

0

0 votes
Blog

Talkback 0 comments

There are currently no comments for this post.


Guest user

Guest user

Level: 
Joined: —
Already a member? Log in »



 

Loading...

Whitepapers/Case Studies

Downloads

Open Source News



Tech Jobs Now!

Tags

  1. canada
  2. e - mail
  3. fedora project
  4. gnome
  5. linux
  6. linux distribution
  7. mandriva
  8. mysql
  9. open source
  10. operating systems
  11. password
  12. red hat inc.
  13. repository
  14. security
  15. server
  16. ssh
  17. tool
  18. ubuntu
  19. vincent danen
  20. web