NCPA 插件监控原理 buM6fl4.jpg

1. Nagios server


1.1 安装nagios前提条件

yum install -y wget httpd php gcc glibc glibc-common gd gd-devel make net-snmp curl  # nagios用的到的gcc编译器\http等支持软件

1.2 下载nagios core与 plugin

curl -C - -O https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.1.1.tar.gz   #下载nagios core
curl -C - -O http://nagios-plugins.org/download/nagios-plugins-2.1.1.tar.gz #下载nagios plugin

1.3 添加nagios用户和组

useradd nagios 
groupadd nagcmd
usermod -a -G nagcmd nagios

1.4 解压安装

tar zxvf nagios-4.1.1.tar.gz -C /tmp/ 
tar zxvf nagios-plugins-2.1.1.tar.gz -C /tmp/
cd /tmp/nagios-4.1.1/  
./configure --with-command-group=nagcmd   #安装nagios core
make all
make install
make install-init
make install-config
make install-commandmode
make install-webconf 
cp -R contrib/eventhandlers/ /usr/local/nagios/libexec/
chown -R nagios:nagios /usr/local/nagios/libexec/eventhandlers

1.5 启动nagios,并访问nagios web

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
/etc/init.d/nagios start
/etc/init.d/httpd start
htpasswd –c /usr/local/nagios/etc/htpasswd.users nagiosadmin   #配置web访问用户名及密码,即可在浏览器访问

NOTE: 这里直接配置完httpd验证就可以访问网页,是因为httpd.conf中本身有一条Include conf.d/*.conf
而安装nagios会默认在你的conf.d/下(或者vhost/等其她目录下,取决于你的httpd)创建配置文件为nagios.conf,内容默认已填好.

1.6 安装nagios plugin

cd /tmp/nagios-plugins-2.1.1/
./configure --with-nagios-user=nagios --with-nagios-group=nagios #安装nagios plugin
make
make install

1.7 增加开机启动项

chkconfig --add nagios   #添加启动项
chkconfig --level 35 nagios on
chkconfig --add httpd
chkconfig --level 35 httpd on

web访问 : http://<your nagios server or ip>/nagios

2. NCPA Server


这里先理清几个关系, 方便理解和后文阅读
撇开Naigos不谈,NCPA插件是一个单独存在的可以单独运行的一个监控,分为两个部分:
① NCPA server(agent): NCPA服务端, 对所在服务器的参数实时监控,可以自定义脚本,并对外开放api.
② check_ncpa.py: NCPA客户端, 标准的获得服务端检查的插件.
-----------分割-----------
而Nagios server的作用就是:
通过调用插件check_nrpa.py去获取被监控服务器的具体监控数据.

2.1 安装agent(被监控端)
  • 2.1.1 下载agent(地址)

  • 2.1.2 安装
    ① Windows安装
    界面只有一个需要配置项
    win-install-screenshot.png

    NOTE:如果你是用来做主动代理(active agent),则安装项下边的被动代理(passive agent)项则没有必要填写,所以填写一个token点下一步,选择文件夹就安装完成了.
    标注: token是用于做一个验证,之后需要nagios core上配置这个token监控这台服务器.

    ② Linux安装

    rpm -ivh --nofiledigest ncpa-1.8.1-1.el6.x86_64.rpm  #--nofiledigest:不验证文件的摘要信息

    同样你需要配置一个token:

    vim /usr/local/ncpa/etc/ncpa.cfg
    ...
    [api]
    community_string = mytoken
    ...
  • 2.1.3 重启服务(Linux)

    [root@xfwy bao]# /etc/init.d/ncpa_listener restart #重启服务,重新加载配置文件,只有linux需要
  • 2.1.4 测试你的agent是否成功开启
    这里需要知道
    ① 代理的IP
    ② 安装时的token

    最后,测试浏览器访问

    https://<your agent ip>:5693 #输入你的token,如果请求失败, 请查看NCPA进程/服务是否正常,防火墙是否阻止了5693端口
2.2 配置文件(ncpa.cfg)
[listener]          # 此模块包含如何连接到这台代理的设置.
ip                  # ip代理,默认为0.0.0.0
port                # NCPA server的TCP端口
uid                 # 设置运行ncpa的用户
gid                 # 设置运行ncpa的用户组
pid                 # 对ncpa server运行的Pid文件位置及命名的设置
logfile             # 日志文件指定位置
ssl_version         # 设置SSL协议使用HTTPS时使用,支持的选择项有SSLv2,SSLv3和TLSv1.
logmaxmbc           # (*)以MB(兆)为单位的日志文件文件切割,当文件大于设置值时,自动新建一个日志文件 
logbackups          # (*)配合上一个参数使用,最大保留多少个日志文件
loglevel            # (*)被记录到日志的日志等级,有效的记录等级是: INFO, NOTICE, WARNING and ERROR.
certificate         # (*)官网标记为实验性的参数,用于指定自己的SSL证书.如果不指定,NCPA会自动生成一个证书用作https连接.
[api]               # 控制api如何被访问,目前只有一个可操作参数
community_string    # 令牌(token)字符串,就是上下文提到的token.
[plugin directives] # 指定插件的目录及各个脚本后缀对应的解析器位置
plugin_path         # 插件目录

这里仅列出关于主动模式的可能用到的参数,其它配置请参考官网配置文档: NCPA Configuration

3. NCPA API


3.1 在使用check_ncpa.py之前,先要了解NCPA Server展现给我们的API是什么样子的.

  • 3.1.1 查看整个树形结构

    https://ncpaserver:5693/api/?token=nagios  #查看整个api树形结构
    --- snip ---
    {
    "value": {
      "root": {
        "process": [],
        "user": {
          "count": 1,
          "list": [
            "nscott"
          ]
        },
        "memory": {
          "swap": {
            "used": [
              8245542912,
              "b"
            ],
    --- snip ---
  • 3.1.2 访问树中的特定项

    https://ncpaserver:5693/api/memory?token=nagios #查看api下的memory
    <snip>
    "value": {
        "memory": {
          "swap": {
            "used": [
              8202797056,
              "b"
            ],
            "total": [
              17087578112,
              "b"
            ],
            "percent": [
              48.0,
              "%"
            ],
            "free": [
              8884781056,
              "b"
            ]
          },
          "virtual": {
            "available": [
    <snip>
  • 3.1.3 api树形结构内置主要的分支包含以下

    memory
    interface
    agent
    cpu
    disk
    process
    services
    具体内容各个版本可能都会不一样,请直接访问树形结构查看具体分支结构!

这些是NCPA Server提供监控服务器的基本指标,是NCPA Server程序内置的. 每一个分支包含自己的一些指标.
注意:访问磁盘时目录分割符"/"或"\"要改为"|",避免和url中分隔符冲突.

3.2 使用实例

  • 3.2.1 例如,我要查看Memory(内存)分支下的虚拟可用内存

    https://ncpaserver:5693/api/memory/virtual/available?token=nagios #查看虚拟可用内存
    {
      "value": {
        "available": [
          2683121664,  # 可以看到可用内存为2683121664 bytes(字节)
          "b"
        ]
      }
    }
  • 3.2.2将检测的值作为nagios的返回结果

    https://ncpaserver:5693/api/memory/virtual/available?token=nagios&warning=1&critical=2&check=true #设置报警值(Warning)和紧急值(Critical)
    {
      "value": {
        "returncode": 2,
        "stdout": "CRITICAL: Available was 1112682496.0b|'available_0'=1112682496.0b;1;2" # 我这里设的报警值为1 bytes, 紧急值为2 bytes,所以状态为紧急(Critical)
      }
    }

3.3 以上的check\warning\critical为检查结果说明符,说明符共有以下几种:

check   # 设置为true将显示检查后的结果, 状态是报警还是紧急还是其它, 而不是仅仅只是一个原始数据
warning # 设置警报的值
critical #设置紧急的值
unit    # 修改项目单位,例如上例中显示的b要改为B,可以写unit=B(注意,这个修改并不会将值适应这个后缀,适应后缀的请看下一条)
units   # 修改项目单位,并让值适应这个单位, 例如上例中b改成MB,可以写成units=M,且值也会从byte转为MB.(注意:不影响百分比项目)
delta   # 有一些计数器,具体的是接口的计数器,它只做简单的统计通过接口的字节数.delta作用就是,例如delta=1,就会统计每一秒经过接口的字节数,同理delta=2,就是每两秒经过接口的字节数.

3.4 使用自定义的插件

https://ncpaserver:5693/api/agent/plugins #查看插件目录有哪些插件
{
  "value": {
    "plugins": [
      "check_msmq.vbs",
      "test.vbs",
    ]
  }
}

例,使用一个插件

https://ncpaserver:5693/api/agent/plugin/test.vbs/"First Arg"?token=nagios #使用test.vbs插件,并给这个插件一个"First Arg"参数
{
  "value": {
    "returncode": 2,
    "stdout": "This worked! First Arg\n"
  }
}

3.5 api 服务

https://ncpaserver:5693/api/services #查看ncpaserver的所有服务
{
    "value": {
        "services": {
            "auditd": "running",
            "netfs": "stopped",
            "sshd": "running",
            ...
        }
    }
}

仅查看单独一个服务

https://ncpaserver:5693/api/services?service=sshd
{
    "value": {
        "service": {
            "sshd": "running"  #显示服务的状态
        }
    }
}

可以支持多个服务同时查看service=sshd&service=auditd

监控一个服务状态

https://ncpaserver:5693/api/service?service=sshd&status=running&check=true
{
    "value": {
        "returncode": 0,
        "stdout": "OK: Service sshd is running"
    }
}

4. NCPA Client

4.1 下载安装

它的工作原理类似NRPE,所以我们先下载一个check_ncpa.py到我们的nagios core

curl -O -C - https://raw.githubusercontent.com/NagiosEnterprises/ncpa/master/client/check_ncpa.py
cp check_ncpa.py /usr/local/nagios/libexec/ #拷贝到nagios工作目录
cd /usr/local/nagios/libexec
chown nagios.nagios check_ncpa.py #修改属主和属组
chmod u+x check_ncpa.py #赋予执行权限

4.2 使用check_ncpa.py
在NCPA API一节通过浏览器可以获得API给出的服务器数据,这里就是通过check_ncpa.py来获得这些数据

./check_ncpa.py -H ncpaserver -t yourtoken -M cpu/percent #命令格式为此
./check_ncpa.py -H ncpaserver -t yourtoken -M cpu/percent -v #如果有未知的错误,可以使用-v调试模式
  • 4.2.1 指定参数的插件
    例如在服务器上,我们的插件是这么运行的:

    /path/to/ncpa/plugins/test.sh -u 'one argument' -p 'another argument'

    使用check_ncpa.py则是这样的:

    ./check_ncpa.py -H ncpaserver -t yourtoken agent/plugin/test.sh -a "-u 'one argument' -p 'another argument'" #请注意,使用-a包含了插件的参数,但一定记得将这些插件的参数使用引号包含

    那么像上边这条命令,如果以url方式显示是怎么样的呢,可以-v查看一下:

    https://ncpaserver/api/agent/plugin/test.sh/-u/one argument/-p/another argument

    如果上边的这条命令-a后边没有引号包含住插件的参数,将会是这样:

    https://ncpaserver/api/agent/plugin/test.sh/-u/one/argument/-p/another argument

    更多的详细参数:

    ./check_ncpa.py --help

5. 一些部署中问题

5.1 因为windows不会去主动去找解释器,所以我们要告诉ncpa解释器在哪
例如我要写Python脚本,需要在plugin directives模块添加一个解释器位置

[plugin directives]
...
.py = C:/python27/python $plugin_name $plugin_args
...

5.2 Linux 无法执行脚本
① 因为你在写脚本的时候,已经在首行告诉脚本的执行器在哪了,所以在NCPA一般不用配置后缀名的解释器,但是一定要写好首行的解释器...我的首行少了一个/害我检查了半天.
② NCPA的脚本也是需要执行的,所以也是需要执行权限的.这里发现很奇怪一个问题,我的NCPA的用户是nagios,用户组是nagcmd,而我的脚本属主属组都为root, 且脚本的权限改为100,它也是可以执行,这个我猜应该是NCPA执行脚本还是用的root吧.

6. 参考文献

  1. Nagios 官方安装文档

  2. NCPA 配置文档