Chinaunix

标题: 自动化运维之--如何实现nagios插件的编写? [打印本页]

作者: ccjsj1    时间: 2015-06-09 11:18
标题: 自动化运维之--如何实现nagios插件的编写?
话题背景:

      众所周知,nagios是一个功能非常强大的开源的系统网络监测程序,通过访问http://www.nagios.org可以了解其基本特性。nagios不但能够实现对系统CPU,磁盘、网络等方面参数的基本系统监测,而且还能够监测包括HTTP等各种基本的服务类型。

      但nagios也存在不足,例如对网络设备的监控,就不如cacti强大;nagios插件非常多,但不可能100%满足所有业务监控,可以通过自己来编写插件,来实现自带插件不能监控的问题。nagios已成为大多数公司采用的监控工具,可以满足公司的大部分要求,但在实际使用过程中还会遇到一些问题;还有一些nagios自带插件不能实现的功能,这些实际情况成为nagios使用的一些问题。


本期话题:

1.nagios在使用中遇到哪些问题?
2.nagios插件是否编写过?可以举例说明。
3.如何扩展Nagios,以实现自定义监控?
4.如何借助Nagios监测常用服务?


活动时间:2015年6月9日—2015年7月9日


奖励设置:

一等奖:将选取1名讨论精彩的童鞋,赠送一本《Zabbix监控系统》作为奖励。



媒体评论:
   本书从最基础的Zabbix系统安装部署讲起,直至Zabbix系统的优化,包括了日常管理和维护Zabbix系统的各个方面,是一本不可多得的介绍Zabbix监控系统的专业书籍。在体系安排上,本书遵循由易到难、循序渐进的原则;在行文上,叙述语言通俗易懂、结构清晰,特别是本书提供了较多的实例,这些实例可以为读者实际工作提供较高的借鉴价值。

二等奖:将选取2名讨论活跃的童鞋,活每人赠送技术图书一本作为奖励:ChinaUnix技术图书文库

三等奖:我们将抽取3名参与讨论的童鞋,赠送一枚“荣誉会员”徽章

       
作者: yestreenstars    时间: 2015-06-12 08:54
讨论Nagios却以Zabbix为奖励,醉了~
作者: stay_sun    时间: 2015-06-12 09:32
楼主的帖子我也醉了   送的书。。。。
1.nagios在使用中遇到哪些问题?
nagios 好像遇到好多问题  邮件提醒   监控数据不更新啊  添加之后不监控啊
2.nagios插件是否编写过?可以举例说明。
没有写过 插件   最新学习了python  觉得可以看看 应该不难
3.如何扩展Nagios,以实现自定义监控?
好像就是 上边的东西啊  自己写插件手机信息
4.如何借助Nagios监测常用服务?
常用服务 nagios  好像可以直接添加的  达不到需求的时候 才是自己写
作者: yuhongchun    时间: 2015-06-12 10:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: ccjsj1    时间: 2015-06-12 10:23
本帖最后由 ccjsj1 于 2015-06-12 10:25 编辑

以前写的检查hpux内存插件,调用swapinfo命令,取结果后按nagios格式输出,请参考:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define OK       0
  5. #define WARNING  1
  6. #define CRITICAL 2
  7. #define UNKNOWN  3

  8. #define LEN 1023
  9. #define LEN_SHORT 24

  10. int main() {
  11.         int ret;
  12.         FILE *fp;

  13.         int line=0;
  14.         char readbuf[256];

  15.         char available_swap[LEN_SHORT];
  16.         char used_swap[LEN_SHORT];
  17.         char free_swap[LEN_SHORT];
  18.         char use_percent_swap[LEN_SHORT];

  19.         char available_mem[LEN_SHORT];
  20.         char used_mem[LEN_SHORT];
  21.         char free_mem[LEN_SHORT];
  22.         char use_percent_mem[LEN_SHORT];

  23.         int i=0,j=0;
  24.         char *str,*str_swap,*str_mem;


  25.         int exitstatus=OK;

  26.         char *exit_status[4]={"OK","WARNING","CRITICAL","UNKNOWN"};

  27.         char status_information[LEN];
  28.         char performance_data[LEN];

  29.         fp=popen("/usr/sbin/swapinfo -atm","r");
  30.         if(fp==NULL) {
  31.                 fprintf(stderr,"fopen() error.\n");
  32.                 return -1;
  33.         }

  34.         while(fgets(readbuf,256,fp)!=NULL) {
  35.                 line++;
  36.         //        printf("line=%d\n",line);

  37.                 if(line==3) {
  38.                         for(str=strtok(readbuf," %");str;str=strtok(NULL," %")) {
  39.                                 i++;

  40.                                 if(i==2) {
  41.                                         sprintf(available_swap,"%s",str);
  42.                                 //        printf("available_swap=%s\n",available_swap);
  43.                                 }
  44.                                 else if(i==3) {
  45.                                         sprintf(used_swap,"%s",str);
  46.                                 //        printf("used_swap=%s\n",used_swap);
  47.                                 }
  48.                                 else if(i==4) {
  49.                                         sprintf(free_swap,"%s",str);
  50.                                 //        printf("free_swap=%s\n",free_swap);
  51.                                 }
  52.                                 else if(i==5) {
  53.                                         sprintf(use_percent_swap,"%s",str);
  54.                                 //        printf("use_percent_swap=%s\n",use_percent_swap);
  55.                                         break;
  56.                                 }
  57.                         }
  58.                 }

  59.                 if(line==5) {
  60.                         for(str=strtok(readbuf," %");str;str=strtok(NULL," %")) {
  61.                                 j++;

  62.                                 if(j==2) {
  63.                                         sprintf(available_mem,"%s",str);
  64.                                 //        printf("available_mem=%s\n",available_mem);
  65.                                 }
  66.                                 else if(j==3) {
  67.                                         sprintf(used_mem,"%s",str);
  68.                                 //        printf("used_mem=%s\n",used_mem);
  69.                                 }
  70.                                 else if(j==4) {
  71.                                         sprintf(free_mem,"%s",str);
  72.                                 //        printf("free_mem=%s\n",free_mem);
  73.                                 }
  74.                                 else if(j==5) {
  75.                                         sprintf(use_percent_mem,"%s",str);
  76.                                 //        printf("use_percent_mem=%s\n",use_percent_mem);

  77.                                         break;
  78.                                 }
  79.                         }
  80.                 }

  81.         }

  82. //      sprintf(use_percent_sawap,"%.2d",atoi(used_swap)/atoi(available_swap));
  83. //      sprintf(use_percent_mem,"%.2d",atoi(used_mem)/atoi(available_mem));

  84. //      printf("line=%d\n",line);

  85.         ret=pclose(fp);
  86.         if(ret!=NULL) {
  87.                 perror("pclose");
  88.         }

  89. //        printf("-------------use_percent_mem=%d\n",atoi(use_percent_mem));

  90.         if(atoi(use_percent_mem)<=80) {
  91.                 exitstatus=OK;
  92.         }
  93.         else if(atoi(use_percent_mem)>80 && atoi(use_percent_mem)<90) {
  94.                 exitstatus=WARNING;
  95.         }
  96.         else if(atoi(use_percent_mem)>90) {
  97.                 exitstatus=CRITICAL;
  98.         }
  99.         else {
  100.                 exitstatus=UNKNOWN;
  101.         }
  102.                

  103.         sprintf(status_information,"Memory Usage - %s%s RAM, %s%s Swap",use_percent_mem,"%",use_percent_swap,"%");
  104. //        printf("status_information=%s\n",status_information);

  105.         sprintf(performance_data,"phyUsed=%s%s;;;0;100 swpUsed=%s%s;;;0;100",use_percent_mem,"%",use_percent_swap,"%");
  106. //        printf("performance_data=%s\n",performance_data);

  107.         printf("%s: %s | %s\n",exit_status[exitstatus],status_information,performance_data);

  108.         return exitstatus;
  109. }
复制代码

作者: expert1    时间: 2015-06-12 11:33
很简单,没啥别的。
看返回值0/1/2,

写到commands.cfg里面就好了。


作者: chenyx    时间: 2015-06-12 15:21
按照Nagios的插件规范,你可以用任何语言来写Nagios的插件,只要能按你需要的状态返回0/1/2值就可以了.
目前遇到的Nagios的问题,最多的是报警的问题.如果外部线路有问题,会造成报警邮件发不出去,也就没法报警了.
至于监控,nagios默认提供的插件就可以满足绝大多数应用的场合了,通过Nrpe,可以实现监控远端windows/Linux机器状态等高级别的信息.
作者: lyhabc    时间: 2015-06-12 23:25
@expert1
0:成功
1:警告
2:失败
nrpe貌似不能安装在Windows上吧
作者: chenyx    时间: 2015-06-13 09:50
Nrpe安装在nagios服务器中,windows上安装NSClient++
作者: ccjsj1    时间: 2015-06-15 12:17
本帖最后由 ccjsj1 于 2015-06-15 12:20 编辑

回复 6# expert1

还有个返回值 3:unknow,一般是脚本执行异常是返回这个值;

   
作者: bbzsxjj    时间: 2015-06-16 00:32
1.nagios在使用中遇到哪些问题?
   nagios 图形化展示需要借助第三方插件画图
   nagios 配置相对比较繁琐
   nagios 分布式监控性能不是很好
   nagios 在使用nrpe时需要配置sudo权限
2.nagios插件是否编写过?可以举例说明。
   nagios插件编写最好是借助于nrpe扩展,可以自由使用自己熟悉的各种语言去实现监控,
nagios只需要根据脚本返回的状态值去做不同的事情,主要有4个状态:
0 成功
1 警告
2 失败
3 未知
另外返回的信息获取的是脚本的输出值。
比如:
简单的检查服务进程存活状态的shell脚本,
只有2个状态,存活,不存活,
也就是说脚本返回0或者2即成功和失败:
  #!/bin/sh
   status=0
   msg=""
   runtime=`date +'%Y-%m-%d %H:%M:%S'`
   pid=`ps -ef|grep $1|gep -E -v 'grep'|awk '{a++}END{if(a){print a}else{print 0}}`
   if [ ${pid} -eq 0]
   then
         status=2
         msg='CRITICAL,$1 Service is not Alive at ${runtime}'
  else
        status=0
        msg='OK,$1 Service is Alive at ${runtime}'
  fi
   echo ${msg}
   exit ${status}

  之后将脚本放到客户端,比如脚本放到/opt/sbin下,名称叫chk_service.sh,
配置nrpe.cfg,添加监控mysql进程的监控项
加入:
   commands[check_mysql]=/bin/sh /opt/sbin/chk_service.sh mysql
再在server端配置:
配置一个service项目监控:
   define service{        
        use                             linux-service
        host_name                       192.168.1.18
        service_description             chk_mysql_pid_status
        check_command                check_nrpe!check_mysql
       }
  重启服务即可,另外server端的配置需要参考官方文档,比如:
你需要定义check_nrpe命令,需要定义报警smtp设置,需要添加pnp扩展去展示图形等等
   
3.如何扩展Nagios,以实现自定义监控?
   linux/unix 使用nrpe
   windows使用NSClient++
4.如何借助Nagios监测常用服务?
   同上面例子,可以自由定制各种监控脚本去监控服务,比如:
可以使用curl去检查web服务和接口的返回状态,响应时间,返回值
可以使用脚本去连接mysql/oracle获取运行状态,设置阈值,返回不同的状态
可以使用脚本测试文件存储的读写(先创建一个文件,再去读取文件内容,最后删除创建的测试文件)
可以使用脚本执行一些动作(定时重启服务,切割日志,删除缓存等)
总结:
   重要的是实现思想,不是脚本语言的本身,不管是使用python/perl/shell/c/java ,思想方法正确,就能达到预期的效果
作者: gmglx    时间: 2015-06-16 18:04
1.nagios在使用中遇到哪些问题?
之前插件传参的一些细节没弄清楚,导致某些名称总是匹配不了。
另外若有较多的主机服务特别是大部分都不同而无法套用模板的话,配置文件的编写就蛮麻烦了。
2.nagios插件是否编写过?可以举例说明。
之前需求是被监测主机不能装软件,只得自己写些python插件来通过snmp抓取数据,有cpu、磁盘、内存等等
就以流量插件为例吧,下面摘了主要的部分:
import sys
import re
from pysnmp.entity.rfc3413.oneliner import cmdgen
import time
import pickle
......
errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().nextCmd(.......)
......
pat = re.compile(netname)
n = None
for n in range(varlen):
    if pat.search(varBinds[n][1][1]) != None:
        break
    if n == varlen - 1:
        print("can not match:", netname)
        exit(state_unknown)
.......

    try:
        data = pickle.load(f)
    else:
        oldtime, oreadbyte, owritebyte = data
        .......
        pickle.dump(wdata, f)
......
if readbyte >= 0 and readbyte < warning_r or writebyte >= 0 and writebyte < warning_w:
    state = state_ok
elif readbyte >= warning_r and readbyte < critical_r or writebyte >= warning_w and writebyte < critical_w:
    state = state_warning
......
3.如何扩展Nagios,以实现自定义监控?
nagios自身就提供了接口,可以说功能少也可以说扩展强,自定义监控就自己根据需要写检测插件。
4.如何借助Nagios监测常用服务?
外部检测有自带的网页检测、ping等,还可以通过代理软件nrpe、nscp,常用的功能都有了没有可以到官网翻翻插件,再就是自己写插件了。
作者: ccjsj1    时间: 2015-06-17 08:58
回复 11# bbzsxjj
   nagios 配置相对比较繁琐
       使用第三方配置工具后会很方便,如centreon,可以定义模版,添加服务很方便;
   nagios 分布式监控性能不是很好
       还是需要第三方工具,如centreon,nagios将监控数据发给centreon,由centreon统一展现,解决了分布式问题;
作者: shjhcx    时间: 2015-06-17 09:24
支持精彩活动
作者: ccjsj1    时间: 2015-06-17 09:31
回复 14# shjhcx

谢谢!

   
作者: 刺客阿地    时间: 2015-06-17 09:54
过来支持下精彩活动。
作者: bbzsxjj    时间: 2015-06-17 15:26
回复 13# ccjsj1

centreon 也用过,总体还是不错的,不过整个下来搞的相对比较繁琐,没有zabbix更集中一些
实际上什么工具不是关键,关键是如何使用工具解决你的问题

   
作者: qq5910225    时间: 2015-06-26 15:35
推荐Check MK ,它以nagios为核心、pnp4nagios进行绘图,附带很多数据库、中间件、网络、存储、服务器的模板,很强大!和zabbix相比我更喜欢Check MK!
作者: shaoping0330    时间: 2015-07-08 15:49
1.nagios在使用中遇到哪些问题?
*机器很多以及监控项目很多的情况下,修改配置文件会比较麻烦。
*图像化不够好
*如果只是单点的情况,存在nagios机器发生故障或者网络故障而无法监测及报警;

2.nagios插件是否编写过?可以举例说明。
安装nrpe之后,感觉够用了,所以没有编写过插件。
目前是用shell编写过监控脚本,例如监控异常ip和进程、发现异常时禁用ip、每日的日志处理等,现在想来,其实可以把类似很多工作和nagios协同起来,包括每日的日志处理等都可以,只要输出状态和nagios,就可以实现自动监控了,就不用每天一台台机器去看了。

3.如何扩展Nagios,以实现自定义监控?
nrpe和NSClient。一般情况下,nagios已经足够强大,支持所需要的监控类别了。

4.如何借助Nagios监测常用服务?
通过nrpe和NSClient可以检测很多常用服务了。
例如libexec目录下很多检查命令如:check_disk,吃透其参数,然后到配置文件中如commands.cfg 配置好即可,总体来说,配置不复杂,熟悉之后更多的像体力工作(机器多的情况下)。
当然也可以只简单的监控目前机器是否alive,那不需要在目标机器上安装任何插件,只需要开通对监控机器的ping功能即可。

作者: shaoping0330    时间: 2015-07-08 15:52
对了,我之前用的短信接口报警到手机上,后来这个接口要收费了,就采用了邮件报警,一封是到公司自己的邮箱,一封是到139邮箱,然后在139邮箱上设置邮件到达通知发给手机,和短信报警差不多了。
作者: ccjsj1    时间: 2015-07-09 08:42
回复 20# shaoping0330
使用手机邮箱短信提醒功能解决短信问题挺好的,以前没有短信接口时用过,后来使用短信接口就不用了 ;)

   
作者: Ap_e    时间: 2015-07-13 11:14
使用Check_mk ~~基本满足要求
作者: xinzhuzhi    时间: 2015-07-27 14:15
回复 2# yestreenstars


    哈哈,同感啊。
作者: guobiao_cn    时间: 2015-07-29 10:42

讨论Nagios却以Zabbix为奖励,醉了~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2