The examples of commands we've seen so far have included all the information needed to execute the checks as command-line options, for example, specifying the host address for check_ping
or the HTTP port for check_http
. An alternative way to get the information required to execute checks is via environment variables. While this isn't enabled by default, it's a method of providing a large amount of context information to a plugin that may save some configuration effort. However, it's only suitable for specialized applications of Nagios Core and, because it's resource intensive, it may not scale very well, meaning it could be unsuitable for very busy Nagios Core servers.
In this example, we'll enable environment macros and then write a short wrapper script for check_ping
that reads the address to PING from its executing environment, rather than from a command-line option.
You should have a Nagios Core 4.0 or newer server running with a few hosts and services configured already, and you should have some understanding of how command objects define the usage of plugins and of the macros defined by Nagios Core.
This is a reasonably advanced recipe that assumes some basic familiarity with environment variables in Unix-like operating systems.
We can enable environment macros and implement our command wrapper as follows:
/usr/local/nagios/etc
:# cd /usr/local/nagios/etc
nagios.cfg
file:# vi /usr/local/nagios/etc/nagios.cfg
enable_environment_macros
option. It defaults to 0
. Set it to 1
instead. Save the file and exit:enable_environment_macros=1
/usr/local/nagios/libexec
:# cd /usr/local/nagios/libexec
check_ping_hostaddress
:# vi check_ping_hostaddress
#!/bin/sh exec /usr/local/nagios/libexec/check_ping -H "${NAGIOS_HOSTADDRESS:?}" "$@"
nagios
group, and executable:# chown root.nagios check_ping_hostaddress # chmod 0770 check_ping_hostaddress
NAGIOS_HOSTADDRESS
environment variable set:# sudo -s -u nagios $ ./check_ping_hostaddress -w 100,20% -c 200,40% ./check_ping_hostaddress: 2: ./check_ping_hostaddress: NAGIOS_HOSTADDRESS: parameter not set or null $ NAGIOS_HOSTADDRESS=127.0.0.1 ./check_ping_hostaddress -w 100,20% -c 200,40% PING OK - Packet loss = 0%, RTA = 0.04 ms|rta=0.041000ms;100.000000;200.000000;0.000000 pl=0%;20;40;0
$ exit # /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # /etc/init.d/nagios reload
We should now have a check_ping_hostaddress
plugin available to us, which will allow us to use it in a command without having to pass $HOSTADDRESS$
in the command_line
directive's value.
We enabled macro environment variables in the Nagios Core configuration. This makes the set of macros normally useable in the command_line
directive, such as $HOSTADDRESS$
, available to the script as environment variables, with their names prefixed with NAGIOS_
. We then wrote a wrapper script for the check_ping
command that uses the $NAGIOS_HOSTADDRESS$
environment variable to define the address it should check, meaning that we don't have to specify the target host on the command line. It also copies any other arguments given to it to the check_ping
call with the $@
expansion and throws an error if it doesn't have a value for NAGIOS_HOSTADDRESS
.
We could add a command to use this plugin and a corresponding service check like this:
define command { command_name check_ping_hostaddress command_line $USER1$/check_ping_hostaddress -w 100,20% -c 200,40% } define service { use local-service host_name localhost service_description PING check_command check_ping_hostaddress }
We can get an idea of the set of variables passed to the plugin by having it dump its environment to a file somewhere within it to inspect its contents before the exec
call:
export > /tmp/nagios-plugin-export
When the plugin is next executed by Nagios Core, we find a new file /tmp/nagios-plugin-export
with contents that show the many macros now available to us as environment variables:
export LANG='en_US.UTF-8' export LANGUAGE='en_US:en' export NAGIOS_ADMINEMAIL='[email protected] ' export NAGIOS_ADMINPAGER='[email protected]' export NAGIOS_ARG1='' export NAGIOS_ARG10='' export NAGIOS_ARG11='' export NAGIOS_ARG12='' ...
Any of these variables can be used within the script. This includes the macros generated by any custom directives we might have declared for our host or service.
Not all the Nagios macros are exported this way to plugins by default, even with enable_environment_macros
turned on. For a complete breakdown of the macros available to you on the command line and in the environment, we can consult the relevant sections of the Nagios Core documentation at the following links:
It's important to note that the documentation for enable_environment_macros
cautions that making all the macros available as environment variables is reasonably resource intensive and therefore might be inappropriate for large setups. We should only enable this option after careful consideration of whether we need it. It may be preferable to pass the required values explicitly in the command_line
directive, as the example configuration does by default.
18.117.189.228