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格式输出,请参考:#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define OK       0
#define WARNING1
#define CRITICAL 2
#define UNKNOWN3

#define LEN 1023
#define LEN_SHORT 24

int main() {
      int ret;
      FILE *fp;

      int line=0;
      char readbuf;

      char available_swap;
      char used_swap;
      char free_swap;
      char use_percent_swap;

      char available_mem;
      char used_mem;
      char free_mem;
      char use_percent_mem;

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


      int exitstatus=OK;

      char *exit_status={"OK","WARNING","CRITICAL","UNKNOWN"};

      char status_information;
      char performance_data;

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

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

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

                              if(i==2) {
                                        sprintf(available_swap,"%s",str);
                              //        printf("available_swap=%s\n",available_swap);
                              }
                              else if(i==3) {
                                        sprintf(used_swap,"%s",str);
                              //        printf("used_swap=%s\n",used_swap);
                              }
                              else if(i==4) {
                                        sprintf(free_swap,"%s",str);
                              //        printf("free_swap=%s\n",free_swap);
                              }
                              else if(i==5) {
                                        sprintf(use_percent_swap,"%s",str);
                              //        printf("use_percent_swap=%s\n",use_percent_swap);
                                        break;
                              }
                        }
                }

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

                              if(j==2) {
                                        sprintf(available_mem,"%s",str);
                              //        printf("available_mem=%s\n",available_mem);
                              }
                              else if(j==3) {
                                        sprintf(used_mem,"%s",str);
                              //        printf("used_mem=%s\n",used_mem);
                              }
                              else if(j==4) {
                                        sprintf(free_mem,"%s",str);
                              //        printf("free_mem=%s\n",free_mem);
                              }
                              else if(j==5) {
                                        sprintf(use_percent_mem,"%s",str);
                              //        printf("use_percent_mem=%s\n",use_percent_mem);

                                        break;
                              }
                        }
                }

      }

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

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

        ret=pclose(fp);
        if(ret!=NULL) {
                perror("pclose");
        }

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

        if(atoi(use_percent_mem)<=80) {
                exitstatus=OK;
        }
        else if(atoi(use_percent_mem)>80 && atoi(use_percent_mem)<90) {
                exitstatus=WARNING;
        }
        else if(atoi(use_percent_mem)>90) {
                exitstatus=CRITICAL;
        }
        else {
                exitstatus=UNKNOWN;
        }
               

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

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

      printf("%s: %s | %s\n",exit_status,status_information,performance_data);

      return exitstatus;
}

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,一般是脚本执行异常是返回这个值;

   
页: [1] 2 3
查看完整版本: 自动化运维之--如何实现nagios插件的编写?