Nagios编译时可以选择支持内嵌Perl解释器。这使得Nagios可以用更高效率来执行Perl所写插件,因而如果严重依赖于Perl写的插件的话可能是个好消息。没有内嵌Perl解释器,Nagios将通过象外部命令一样用派生和执行的方法利用Perl所写的插件。当编译中选择了支持内嵌Perl解释器时,Nagios可以象调用库一样来执行Perl插件。
Stephen Davies在几年前发布了最初的嵌入式Perl解释器,Stanley Hopcroft是主要的帮助嵌入式Perl解释器改进提升的人并且应用它的对优劣性做了批注。他同时给出了有关如何更好地实现用嵌入式Perl来实现Perl插件的方法。必须注意本文档里用的"ePN",它指示Nagios用Perl,或是指示了Nagios要用嵌入式Perl解释器来编译执行它。
使用ePN(Nagios编译有嵌入式Perl解释器)的好处有:
使用ePN(Nagios嵌入式Perl解释器)比之纯粹Nagios程序的缺点相近的,是在运行Apache带有mod_perl(Apache也是使用嵌入式解释器)和运行纯粹Apache程序的两种情形对比,情况也是这样:
如果要使用嵌入式Perl解释器来运行Perl插件和Perl脚本,下面这些是需要做的:
如果要用嵌入式Perl解释器,首先需要编译Nagios支持它。只需要运行源程序配置脚本时带上--enable-embedded-perl参数即可。如果要嵌入式解释器缓存编译后的脚本,还要带上--with-perlcache参数,例子:
./configure --enable-embedded-perl --with-perlcache otheroptions...
一旦用新选项重新运行配置脚本,一定要重编译Nagios。
自Nagios的第三版开始,可以在Perl插件或脚本中指定是否需要在嵌入式Perl解释器里运行。这对于运行那些在Perl解释器里运行有问题的Perl脚本的处理将非常有帮助。
明确地指定Nagios是否要使用嵌入式Perl解释器来运行某个Perl脚本,把下面的东西加到你的Perl插件或脚本里...
如果需要Nagios使用嵌入式Perl解释器来运行Perl脚本,在Perl程序里加入下面一行:
# nagios: +epn
如果不用嵌入式解释器,在Perl程序里加入下面这一行:
# nagios: -epn
上面的行必须出现有Perl脚本的前10行里以让Nagios检测Perl程序是否要用解释器。
更多有关开发嵌入式Perl解释器里可运行Perl插件的信息可查阅这篇文档。
Stanley Hopcroft在嵌入式Perl解释器的工作机制方面卓有成效并且给出了利用嵌入式Perl解释器方面的优点和缺点的注释,他同时还给出了如何让Perl插件更好地在Perl解释器里运行的一些提示与帮助,下面内容多来自于他的注解。
需要注意本文档里用的"ePN",它指定是带有嵌入式Perl解释器的Nagios版本,如果不是,Nagios需要重新编译以带有嵌入式Perl解释器的支持。
不管是否用ePN与否,下面的内容要注意:
my $data = <<DATA; portmapper 100000 portmap 100000 sunrpc 100000 rpcbind 100000 rstatd 100001 rstat 100001 rup 100001 .. DATA %prognum = map { my($a, $b) = split; ($a, $b) } split(/\n/, $data) ;
表 12.1. 源程序转换比对
转换前 | 转换后 |
---|---|
|
|
7、调试前做点准备:
perl -MO::Deparse <your_program>
package main; use subs 'CORE::GLOBAL::exit'; sub CORE::GLOBAL::exit { die "ExitTrap: $_[0] (Embed::check_5frpc)"; } package Embed::check_5frpc; sub hndlr { shift(@_); @ARGV=@_; #! /usr/bin/perl -w # # check_rpc plugin for Nagios # # usage: # check_rpc host service # # Check if an rpc serice is registered and running # using rpcinfo - $proto $host $prognum 2>&1 |"; # # Use these hosts.cfg entries as examples # # command[check_nfs]=/some/path/libexec/check_rpc $HOSTADDRESS$ nfs # service[check_nfs]=NFS;24x7;3;5;5;unix-admin;60;24x7;1;1;1;;check_rpc # # initial version: 3 May 2000 by Truongchinh Nguyen and Karl DeBisschop # current status: $Revision: 1.17 $ # # Copyright Notice: GPL # ... rest of plugin code goes here (it was removed for brevity) ... }
作为Nagios插件的脚本或执行程序必须(至少)要做两件事:
对Nagios来说,插件里面做什么并不重要。自制插件可以是做TCP端口状态检测,运行某个数据库查询,检查磁盘空闲空间,或其他需要检测的内容。这取决于你想检测什么东西,这完全由你自己决定。
Nagios用插件的返回值来生成主机或服务的状态。下表里列出了合法的返回值以及对应的服务或主机状态。
表 12.2.
插件返回值 | 服务状态 | 主机状态 |
---|---|---|
0 | 正常(OK) | 运行(UP) |
1 | 告警(WARNING) | 运行(UP)或宕机(DOWN)/不可达(UNREACHABLE)* |
2 | 紧急(CRITICAL) | 宕机(DOWN)/不可达(UNREACHABLE) |
3 | 未知(UNKNOWN) | 宕机(DOWN)/不可达(UNREACHABLE) |
最小情况下,插件要返回一行文本输出。自Nagios 3版本起,插件可以返回多行输出文本。插件可以返回性能数据以让外部应用来做后序处理。输出文本的基本格式如下:
TEXT OUTPUT | OPTIONAL PERFDATA LONG TEXT LINE 1 LONG TEXT LINE 2 ... LONG TEXT LINE N | PERFDATA LINE 2 PERFDATA LINE 3 ... PERFDATA LINE N
性能数据(用下划线示意的部分)是可选的,如果插件输出文本里有性能数据,必须用管道符(|)把性能数据与其他数据分开,额外的大段输出行(用文字删除符示意的部分)同样也是可选的。
下面看一下插件输出的样例...
案例1:只有一行文本输出(不带性能数据)
假定插件的输出文本是这样:
DISK OK - free space: / 3326 MB (56%);
如果插件执行的是一个服务检测,整行输出都会保存在$SERVICEOUTPUT$宏里。
案例2:一行输出带性能数据
插件的输出文本中带有性能数据可给外部应用来处理。性能数据要用管道符(|)分隔开,象是这样:
DISK OK - free space: / 3326 MB (56%); | /=2643MB;5948;5958;0;5968
如果插件执行的是一个服务检测,分隔符左侧的部分将保存在$SERVICEOUTPUT$宏里并且右侧(用下划线示意)的部分将保存在$SERVICEPERFDATA$宏里面。
案例3:多行输出(正文和性能数据都有)
插件可以输出多行文本,并且带有正文输出和性能数据,象是这样:
DISK OK - free space: / 3326 MB (56%); | /=2643MB;5948;5958;0;5968
/ 15272 MB (77%);
/boot 68 MB (69%);
/home 69357 MB (27%);
/var/log 819 MB (84%); | /boot=68MB;88;93;0;98
/home=69357MB;253404;253409;0;253414
/var/log=818MB;970;975;0;980
如果插件执行的是一个服务检测,第一行分隔符左侧的部分将保存在$SERVICEOUTPUT$宏里,带有下划线标识的部分(带空格)将保存在$SERVICEPERFDATA$宏里,带删除符标识的部分(不带换行符)的部分将保存在$LONGSERVICEOUTPUT$宏里(以上的下划线和删除符只是为标记文本段而用的,实际文本中不带有符号格式--译者注)。
每个宏的最终结果是这样的:
表 12.3.
宏 | 内容 |
---|---|
$SERVICEOUTPUT$ | DISK OK - free space: / 3326 MB (56%); |
$SERVICEPERFDATA$ | /=2643MB;5948;5958;0;5968./boot=68MB;88;93;0;98./home=69357MB;253404;253409;0;253414./var/log=818MB;970;975;0;980 |
$LONGSERVICEOUTPUT$ | / 15272 MB (77%);\n/boot 68 MB (69%);\n/var/log 819 MB (84%); |
利用多行输出结果的机制,可以采取多种方式来返回性能数据:
(看起来第一行右侧部分有点"多余",真的可以不用,但其实这是作者为软件向下兼容低版本使用的插件而特意这么做的,很有必要这么做,看一下源程序就明白了。--译者注)
Nagios只处理插件返回的前4KB数据内容。这样是为了防止插件返回一个上兆或上千兆的数据块给Nagios处理。这个4K的限制很容易修改,如果你想改,可以编辑一下源代码里的MAX_PLUGIN_OUTPUT_LENGTH宏定义,在源程序包的include/nagios.h.in文件里,重编译一下Nagios就可以了,其他地方不用动!
如果想找点例子来学习开发插件,推荐去下载Nagios插件项目官方的软件包,插件代码使用多种语言(象C、Perl和SHELL脚本等)写成插件。取得Nagios插件的官方代码包的方法可以看这篇文档。
Nagios可以选择支持嵌入式Perl解释器可以提高执行Perl插件的速度。更多有关使用嵌入式Perl解释器来开发Perl插件的信息可以查阅这篇文档。