您的位置:首页 > 移动开发 > IOS开发

如何编写 Nagios 插件

2011-11-28 11:30 417 查看
如何编写 Nagios 插件

Nagios 的最激动人心的方面是可以轻松地编写您自己的插件,只需要了解一些简单的指导原则即可。为了管理插件,Nagios 每次在查询一个服务的状态时,产生一个子进程,并且它使用来自该命令的输出和退出代码来确定具体的状态。退出状态代码的含义如下所示:

OK —退出代码 0—表示服务正常地工作。

WARNING —退出代码 1—表示服务处于警告状态。

CRITICAL —退出代码 2—表示服务处于危险状态。

UNKNOWN —退出代码 3—表示服务处于未知状态。

最后一种状态通常表示该插件无法确定服务的状态。例如,可能出现了内部错误。
下面提供了一个 Python 示例脚本,用于检查 UNIX® 平均负载。它假定 2.0 以上的级别表示警告状态,而 5.0 以上的级别表示危险状态。这些值都采用了硬编码的方式,并且始终使用最近一分钟的平均负载。

清单 5. Python 插件—示例工作插件[/b]

#!/usr/bin/env python

import os,sys

(d1, d2, d3) = os.getloadavg()

if d1 >= 5.0:
print "GETLOADAVG CRITICAL: Load average is %.2f" % (d1)
sys.exit(2)
elif d1 >= 2.0:
print "GETLOADAVG WARNING: Load average is %.2f" % (d1)
sys.exit(1)
else:
print "GETLOADAVG OK: Load average is %.2f" % (d1)
sys.exit(0)

在编写了这个小的可执行插件之后,接下来是使用 Nagios 注册该插件,并创建一个检查平均负载的服务定义。
这项工作也是非常简单的:使用下面的内容创建一个名为
/etc/nagios-plugins/config/mygetloadavg.cfg
的文件,根据下面的示例,向
services.cfg
文件添加一个服务。请记住,必须在
hosts.cfg
配置文件中定义
localhost


清单 6. 示例插件—使用 Nagios 进行注册[/b]

define command{
command_name    check_mygetloadavg
command_line    /path/to/check_getloadavg
}

清单 7. 创建一个使用示例插件的服务[/b]

define service{
use                             service-template
host_name                       localhost
service_description             LoadAverage
check_period                    24x7
contact_groups                  server-admins
notification_options            c,r
check_command                   check_mygetloadavg
}

编写一个完整的插件
前面的示例说明了一个采用“硬编码”方式插件的限制,它不支持运行时配置。在实际中,通常最好的方式是创建一个可配置的插件。通过这种方式,您可以创建和维护一个插件,使用 Nagios 将其注册为单个插件,并且传递参数以便为特定的情况自定义警告和危险水平。下一个示例还包括一则使用消息;经过证实,对于由几个不同的开发人员或者管理员所使用或维护的插件,这是非常有价值的。
另一个好的实践是捕获所有的异常,并后退以报告 UNKNOWN 服务状态,以便 Nagios 能够正确地管理有关这个情况的通知。那些允许异常“失败”的插件通常会退出,并返回值 1;对于 Nagios,这表示一个 WARNING 状态。请确保您的插件能够正确地区分 WARNING 和 UNKNOWN。请注意,例如,在将其作为 UNKNOWN 结果处理可能出现错误的情况下,通常可以禁用至少某些 WARNING 通知。
用 Python 编写一个插件
上述的建议—运行时参数化、一则使用消息,以及经过改进的异常处理—将得到示例插件的源代码,这段代码要比前面的长几倍。但是您可以更安全地对错误进行处理,并且能够在更广泛的范围内重用该插件。

清单 8. Python 插件—获取平均负载的完整插件[/b]

#!/usr/bin/env python

import os
import sys
import getopt

def usage():
print """Usage: check_getloadavg [-h|--help] [-m|--mode 1|2|3] \
[-w|--warning level] [-c|--critical level]"

Mode: 1 - last minute ; 2 - last 5 minutes ; 3 - last 15 minutes"
Warning level defaults to 2.0
Critical level defaults to 5.0"""
sys.exit(3)

try:
options, args = getopt.getopt(sys.argv[1:],
"hm:w:c:",
"--help --mode= --warning= --critical=",
)
except getopt.GetoptError:
usage()
sys.exit(3)

argMode = "1"
argWarning = 2.0
argCritical = 5.0

for name, value in options:
if name in ("-h", "--help"):
usage()
if name in ("-m", "--mode"):
if value not in ("1", "2", "3"):
usage()
argMode = value
if name in ("-w", "--warning"):
try:
argWarning = 0.0 + value
except Exception:
print "Unable to convert to floating point value\n"
usage()
if name in ("-c", "--critical"):
try:
argCritical = 0.0 + value
except Exception:
print "Unable to convert to floating point value\n"
usage()

try:
(d1, d2, d3) = os.getloadavg()
except Exception:
print "GETLOADAVG UNKNOWN: Error while getting load average"
sys.exit(3)

if argMode == "1":
d = d1
elif argMode == "2":
d = d2
elif argMode == "3":
d = d3

if d >= argCritical:
print "GETLOADAVG CRITICAL: Load average is %.2f" % (d)
sys.exit(2)
elif d >= argWarning:
print "GETLOADAVG WARNING: Load average is %.2f" % (d)
sys.exit(1)
else:
print "GETLOADAVG OK: Load average is %.2f" % (d)
sys.exit(0)

为了使用这个新的插件,需要使用下面的方法来注册
/etc/nagios-plugins/config/mygetloadavg2.cfg


清单 9. Python 插件—使用 Nagios 进行注册[/b]

define command{
command_name    check_mygetloadavg2
command_line    /path/to/check_getloadavg2 -m $ARG1$ -w $ARG2$ -c $ARG3$
}

另外,根据下面的示例,在
services.cfg
文件中添加或者更改服务条目。请注意,使用感叹号
!
来分隔插件参数。与前面一样,必须在
hosts.cfg
配置文件中定义
localhost


清单 10. 创建一个使用 Python 插件的服务[/b]

define service{
use                             service-template
host_name                       localhost
service_description             LoadAverage2
check_period                    24x7
contact_groups                  server-admins
notification_options            c,r
check_command                   check_mygetloadavg2!1!3.0!6.0
}

用 Tcl 编写一个插件
最后的示例是使用 Tcl 编写的一个插件,它使用简单对象访问协议 (SOAP) 和 Web 服务描述语言 (WSDL) 检查 xmenthods.net 的汇率。SOAP 为该插件提供了汇率的当前值,并将这些值与配置的范围进行比较。如果该值不属于警告的范围,那么它将被认为是 OK。如果该值大于或者小于警告级别,但是并没有超过危险极限,则将状态设置为 WARNING。否则将其设置为 CRITICAL,除非出现了网络错误,在这种情况下将状态设置为 UNKNOWN。
该插件可以识别不同的可配置参数,以便能够检查不同范围的汇率。它还可以用于检查各个国家的各种汇率。

清单 11. Tcl 插件—验证当前汇率[/b]

#!/usr/bin/env tclsh

# parse arguments
package require cmdline
set options {
{country1.arg "" "Country 1"}
{country2.arg "" "Country 2"}
{lowerwarning.arg "" "Lower warning limit"}
{upperwarning.arg "" "Upper warning limit"}
{lowercritical.arg "" "Lower critical limit"}
{uppercritical.arg "" "Upper critical limit"}
}

array set opt [cmdline::getoptions argv $options {: [options]}]

# if the user did not supply all arguments, show help message
for each necessary [array names opt] {
if {$opt($necessary) == ""} {
set argv "-help"
catch {cmdline::getoptions argv $options {: [options]}} usage
puts stderr $usage
exit 3
}
}

# load TclWebServices package
package require WS::Client

if {[catch {
# download WSDL
WS::Client::GetAndParseWsdl \ http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl \
{} currency

# create stub commands
WS::Client::CreateStubs currency

# download the actual exchange rate
set result [lindex \
[currency::getRate "England" "Japan"] 1]
} error]} {
# if downloading the rate failed for some reason, report it
puts "EXCHANGERATE UNKNOWN: $error"
exit 3
}

if {($result < $opt(lowercritical)) || ($result > $opt(uppercritical))} {
puts "EXCHANGERATE CRITICAL: rate is $result"
exit 2
}
if {($result < $opt(lowerwarning)) || ($result > $opt(upperwarning))} {
puts "EXCHANGERATE WARNING: rate is $result"
exit 1
}
puts "EXCHANGERATE OK: rate is $result"
exit 0

现在,您需要注册这个命令,以便 Nagios 知道如何调用它。为了完成这项工作,可以使用与前面类似的配置和命令定义来创建一个名为
/etc/nagios-plugins/config/exchangerate.cfg
的文件:
command_line    /path/to/check_exchangerate
-country1 $ARG1$ -country2 $ARG2$ -lowercritical \
$ARG3$ -lowerwarning $ARG4$ -upperwarning $ARG5$ -uppercritical $ARG6$

在下面的示例中,假定该命令的名称为
check_exchangerate

接下来,创建一个使用刚刚创建的插件来监视汇率的服务。下面是服务定义,它将该服务与
localhost
服务器关联起来。尽管这个检查并不真正地关联于任何物理主机,但是需要将它绑定到一台主机。如果这个检查涉及到调用受信任的网络中的服务器的 SOAP 方法,那么您可以添加需要进行监视的实际服务器,并且在这个示例中,应该将服务绑定到该服务器。清单 12 中的代码检查 英镑对日元的汇率,并验证汇率位于 225 到 275 之间。

清单 12. 添加 Tcl 插件作为一个新的服务[/b]

define service{
use                             service-template
host_name                       localhost
service_description             EXCHANGERATE
check_period                    24x7
contact_groups                  other-admins
notification_options            c,r
check_command                   check_exchangerate!England!Japan!200!225!275!300
}

结束语
您可以使用 Nagios 监视所有类型的硬件和软件。您可以编写自己的插件,这使得能够监视与 Nagios 服务器进行通信的各种对象。正如您可以使用管理命令行参数和退出状态的任何计算语言一样,存在各种各样的可能性。
高级系统管理员可以使用 Tcl 或者任何其他语言来扩展 SOAP 示例,以便与内部网 Web 服务进行通信,并编写插件以验证该服务行为的正确性。
还可以使用 C 插件或者将 C 嵌入到您最喜欢的动态语言中(对于 Python,使用
Pyinline
;对于 Perl,使用
Inline
;或者对于 Tcl,使用
Critcl
),以便将您的操作系统的 C API 与您的插件(使用高级语言编写)组合在一起。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 nagios 休闲