2.5 I/O界面总结
Nagios是一套伟大的监控工具,它领先于同类商业产品的地方是:它能够与其他外部监控及可视化工具交互。Nagios擅长与其他系统交互,因为这是其创造者的设计目标,同时也因为(我们曾在本章反复说明的)除了调度和通知功能外,它只内置了很少的功能。凭借Nagios简单而优雅的设计,它擅长也必须擅长简化数据的输入和输出。本节中,我会介绍一些Nagios进行数据输入、输出的常见方式。
2.5.1 Web界面
一般情况下,当用户构建Nagios时,同时也会构建Web界面,我建议各位读者也这么做。Web界面的主要目的是提供一个窗口,以方便用户了解被监控主机的当前状态,但是除此之外,它还具有很多功能,比如:
·历史报表和趋势工具;
·设置计划宕机时间、指定主机和服务的注释界面;
·启用或禁用服务检测和通知的界面;
·检查当前配置的界面;
·绘制环境地图的工具;
·获取Nagios守护进程状态信息的工具。
Web界面是基于CGI实现的,这些CGI程序使用C语言编写,所以运行速度很快。通常,CGI程序从Nagios所维护的var目录的多个日志和状态文件中收集所需信息。因为Web界面完整的功能都能够单独写一本书了,所以我只会概括介绍其组成部分以及如何将它们结合在一起,我也会展示一些个人喜欢的以及经常访问的视图。通过如下对最上层汇总的介绍,各位读者应当能够独自对Web界面进行探索,并随时收集所需要的信息。
图2-5所展示的是Nagios的导航栏。该导航栏主要由四部分构成:基本信息(general)、当前状态(current status)、报表(report)和系统(system)。基本信息部分包含了一个链接,通过该链接能够直接访问Nagios HTML格式的完整文档。系统部分能够用来管理注释信息、安排计划宕机时间、查看系统状态、查看当前配置文件。其他两个有趣的部分就是当前状态和报表。
2.5.2 当前状态
图2-5 Nagios导航栏
当前状态部分用于向用户提供Nagios监控对象的实时状态信息。除了战术概览(tactical overview)、状态地图(map)以及网络中断(network outage)等,在监控部分下的其他视图都是由status.cgi这个CGI文件提供的。其实,读者在Web界面下90%的时间都在和status.cgi交互,这是件好事,因为status.cgi不仅提供了一个统一的界面而且还能展示丰富的信息。通常,status.cgi展示的每屏信息都包含4个元素,它们通常位于页面顶端:基于上下文的链接菜单、主机状态表格、服务状态表格以及展示区域,如图2-6所示。
左上方的链接菜单提供了快捷链接,会基于读者查看的监控对象类型发生变化。右上方的主机和服务状态表是展示区域中的主机和服务状态的汇总。需要注意的是主机和服务状态表是基于上下文的:也就是说,它们对读者在展示区域中查看的数据进行了汇总,而非Nagios中整体的主机和服务状态汇总。通常,点击展示区域的链接会提供给读者更加详细的视图。点击某个主机组会给读者显示该主机组中所有主机的汇总信息。点击某台主机会显示该主机的详细信息。
图2-7是某台主机详细信息界面的截图。各位读者可以看到,主机和服务状态信息没有显示,在展示区域的表格中列出了主机的当前状态,同时包括了一个命令菜单,这些命令能够调整该主机的状态。在这里,读者可以为主机安排计划宕机时间、通知Nagios停止对主机检测、停止发送通知以及故障状态确认等。如果通过retain state选项启用了Nagios的持久状态,则在Web界面上所做的调整将会持久保存(甚至在Nagios重启后)。
图2-6 status.cgi展示的内容
图2-7 主机的状态详细信息
图2-8是主机组汇总界面的截图。这是我最喜欢的界面,它在一屏内按照主机组分组,显示了监控环境整体的状态。我最喜欢它的原因是无论被监控环境规模多大,通常都可以在分辨率1024×768的窗口之内查看到整体的汇总信息。我会在早上通过主机组汇总信息看一下环境状态,全天都会通过它来随时了解情况。通过这个界面,能够下钻到任何主机组或主机,因为其中包括了整体环境中的所有主机和服务,并且主机和服务状态表能够总体展示当前环境状态。
图2-8 主机组汇总信息(我最喜欢的界面)
2.5.3 报表
Nagios中内置了一些很棒的报表功能。负责提供报表的CGI程序可以分为三种类型:负责提供日志转储(log dump)、负责绘制图像以及负责输出格式化报表的。告警历史(alert history)、通知(notification)以及根据日志类型简单转储每行日志的事件日志(event log)。告警直方图和趋势图通过GD库生成图形。可用性(availability)及告警汇总(alert summary)会生成格式化的报表。
所有类型的报表并非都通过相同的预生成过程进行日志转储。点击报表类型,系统会提示读者指定对象类型,以生成对应报表。基本上可以指定在任何数量的主机、主机组、服务和服务组上运行报表。当读者选择了对象类型后,系统会提示读者选择指定对象,以运行对应报表。如果各位读者在第一步选中对象类型选择为主机,那么接下来就可以指定具体的主机如服务器1。最后,读者需要选择相关报表的选项,比如报表所使用的时间周期、希望包含的状态类型(确定还是待定、运行还是故障状态)。
趋势图和直方图的主要区别就是X轴。如果报表周期选择5天,趋势图中X轴对应的就是5天中的每一天,Y轴上显示的就是服务状态(未知、严重、警告、正常)。趋势图能够直观地再现服务状态和时间的函数关系。
而直方图在X轴上显示用户自定义的、用于故障统计的时间间隔(参考故障类型),如每天的小时数或每周的天数,并在Y轴显示故障状态的数量。比如,我们选择周期为最近7天,故障统计的时间间隔为每天的小时数,那么X轴会显示24个小时的单位,Y轴则会基于故障发生的时间,显示最近7天内各种故障状态在每个小时发生的次数总和。直方图有助于可视化地展现服务故障的趋势。对于用户而言,趋势图只能展现上周一13:00时,服务器1的CPU利用率很高,而直方图能够展现出每周一13:00时,服务器1的CPU利用率都很高。
格式化后的可用性和告警汇总报表都很有用,我经常用到它们。读者可以在提高系统的SLA达标 信息时,查看可用性报表。可用性报表使用带有背景色的表格及精确的可用性数据(为了满足“5个9” 的用户,可用性是保留3位小数的百分数)进行展现,适用于任何主机、服务或其集合。告警汇总对那些不想接受短信,但是仍希望了解过去24小时(或其他自定义时间段)情况的用户。告警汇总能够过滤掉待定事件,或展示主机或服务事件,或两者都展示,还可以选择只展示故障、恢复或其他状态。我也发现可用性和告警汇总报表都能非常方便地导入到Excel表格中,以供管理层使用,这样就不用直接导出带有HTML框架的xls文件了。
2.5.4 外部命令文件
Web界面的CGI程序能够完成很多工作,比如为主机安排宕机时间、关闭通知等。和处理日志、状态文件的简单CGI封装程序(Warpper)相比,它能实现的不仅是Web界面的功能。其实,CGI程序通过外部命令文件(External Command File)的方式能够执行相应命令。命令文件是一个FIFO 文件(或称为命名管道),Nagios会定期检查该文件以获取待执行的命令。读者可以将其想象成一个指向事件队列的文件系统实体。命令文件不仅用于Web界面,也可以被任何有权限访问该文件的进程所使用。
在外部命令文件中,命令的格式如下:
[time] command_id; command_arguments
其中,Time代表的是时间戳,这个时间戳的格式是从Epoch 开始计算的Unix秒数。在Unix环境中,可以通过下述命令获取这种格式的时间戳:
date '+%s'
命令中Command_ID是读者想要执行的命令名称,不同的命令后面会使用不同的参数。在本书编写的时候,读者可以通过命令文件的方式,向Nagios守护进程发送131条不同的命令,从而进行类似启用、禁用通知、确认故障、添加注释等操作。具体的命令列表、选项参数以及Shell脚本样例详见:
http://nagios.sourceforge.net/docs/nagioscore/3/en/extcommands.html
2.5.5 性能数据
在2.2节中,我们定义的插件是:能够提供退出代码及可选汇总信息(通过stdout输出的一些文本)的小型程序。如果汇总信息包含了管道符(|),Nagios会将管道符之前的信息作为汇总文本处理,并将管道符之后的信息作为性能数据(Performance Data)处理。当信息中包含性能数据时,我们可以配置Nagios对其进行处理,相比于其他类型的数据,Nagios对性能数据的处理有很大不同。
其实,性能数据也是Nagios向其他类似RRDTool这样的图形程序输出数据的实际方式。但是大多数插件并不提供性能数据,也就是说它们输出的汇总信息中不包含管道符。通过代码2-6中的check_wrapper_generic程序很容易识别它们。
代码2-6 适用于所有插件的性能数据封装程序
#!/bin/sh # 性能数据分装程序,适用于任何Nagios 插件,自动为插件添加性能数据 # 通过link 程序将" 插件名称_wrapper" 链接到此脚本来启用本程序 # 比如,你希望为check_mem 程序添加性能数据 # 你应当执行'ln -s check_wrapper_generic check_mem_wrapper' # 去除程序名后的'wrapper' NAME='echo $0 | sed -e 's/_wrapper//'' # 调用插件并捕捉其输出信息 OUTPUT='${NAME} $@' # 捕捉插件的退出代码 CODE=$? # 重放插件输出至stdout 两次,通过管道符分离。 echo "${OUTPUT} | ${OUTPUT}" # 以与插件相同的代码退出 exit ${CODE}
上述的封装程序与代码2-5中的SSH远程执行脚本类似。该脚本以代理方式调用其他插件,并重放其他插件的输出,但是在重放时会在输出中增加管道符,从而实现对性能数据的支持。在第8章中,我会详细讲解性能数据,以及如何输入到其他可视化程序中。
2.5.6 事件代理
Nagios事件代理(Nagios Event Broker,NEB)进程用于监视事件队列,在特定事件发生时通知一个或多个事件代理模块,并将事件相关的信息传递至模块中。
NEB模块是使用C语言编写,并与Nagios核心进程在运行时连接,NEB模块在连接时会向事件代理进程发出关注事件的订阅请求,以便在事件发生时得到通知。事件类型可以配置为Nagios在事件队列中处理的各种类型。当关注事件发生后,NEB模块就能获得相关信息,并可以进行任何所需的操作,如修改队列中的事件、向其他程序传递信息、或只是改变Nagios的操作方式。
事件代理接口绝对是Nagios最强大的接口,我们能够通过一些有意思的事件代理模块对Nagios的功能进行扩展。我会在第7章中介绍其中一些,另外一些需要C语言技能并进行研究的插件,我会在第10章中进行介绍。在第10章中,我会引导各位读者创建一个NEB模块,能够通过事件代理为Nagios添加一个文件系统状态接口。