自动化运维之--如何实现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名参与讨论的童鞋,赠送一枚“荣誉会员”徽章
讨论Nagios却以Zabbix为奖励,醉了~ 楼主的帖子我也醉了 送的书。。。。
1.nagios在使用中遇到哪些问题?
nagios 好像遇到好多问题邮件提醒 监控数据不更新啊添加之后不监控啊
2.nagios插件是否编写过?可以举例说明。
没有写过 插件 最新学习了python觉得可以看看 应该不难
3.如何扩展Nagios,以实现自定义监控?
好像就是 上边的东西啊自己写插件手机信息
4.如何借助Nagios监测常用服务?
常用服务 nagios好像可以直接添加的达不到需求的时候 才是自己写 本帖最后由 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;
} 很简单,没啥别的。
看返回值0/1/2,
写到commands.cfg里面就好了。
按照Nagios的插件规范,你可以用任何语言来写Nagios的插件,只要能按你需要的状态返回0/1/2值就可以了.
目前遇到的Nagios的问题,最多的是报警的问题.如果外部线路有问题,会造成报警邮件发不出去,也就没法报警了.
至于监控,nagios默认提供的插件就可以满足绝大多数应用的场合了,通过Nrpe,可以实现监控远端windows/Linux机器状态等高级别的信息. @expert1
0:成功
1:警告
2:失败
nrpe貌似不能安装在Windows上吧 Nrpe安装在nagios服务器中,windows上安装NSClient++ 本帖最后由 ccjsj1 于 2015-06-15 12:20 编辑
回复 6# expert1
还有个返回值 3:unknow,一般是脚本执行异常是返回这个值;