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监控系统》作为奖励。
150007fjj1mcii3jzev3rq.jpg
(10.16 KB, 下载次数: 91)
下载附件
2015-06-09 11:52 上传
媒体评论:
本书从最基础的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 WARNING 1
#define CRITICAL 2
#define UNKNOWN 3
#define LEN 1023
#define LEN_SHORT 24
int main() {
int ret;
FILE *fp;
int line=0;
char readbuf[256];
char available_swap[LEN_SHORT];
char used_swap[LEN_SHORT];
char free_swap[LEN_SHORT];
char use_percent_swap[LEN_SHORT];
char available_mem[LEN_SHORT];
char used_mem[LEN_SHORT];
char free_mem[LEN_SHORT];
char use_percent_mem[LEN_SHORT];
int i=0,j=0;
char *str,*str_swap,*str_mem;
int exitstatus=OK;
char *exit_status[4]={"OK","WARNING","CRITICAL","UNKNOWN"};
char status_information[LEN];
char performance_data[LEN];
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[exitstatus],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,一般是脚本执行异常是返回这个值;
作者:
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