NRPE工作原理:
从Nagios的service开始(@监控服务器):
define service{host_name zc-host
service_description check-load
check_command check_nrpe!-c check_load #引用了command:check_nrpe
max_check_attempts 3
check_interval 3
retry_interval 3
check_period 24x7
notification_interval 3
notification_period 24x7
contacts zhicheng
contact_groups monitor-group
}
接下去看Nagios的command(@监控服务器):# 'check_by_nrpe' command definition
define command {
command_name check_nrpe
command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ $ARG1$ #引用了nrpe插件提供的命令
}
接下去看nrpe插件的这条命令(@监控服务器):
/usr/local/nagios/libexec/check_nrpe-H 10.14.21.145 -c check_load
#通过nrpe提供的一个应用层协议进行通信。监控服务器端从一个随机的TCP端口将“请求”发出到被监控机器正在监听中的5666TCP端口。“请求”的内容为通知10.14.21.145执行nrpe的check_load命令并回显。
被监控机器为什么会收到5666TCP端口的消息呢?(@被监控机器)
因为nrpe委托xinetd监听TCP5666端口,当TCP5666端口来消息时,xinetd负责将nrpe进程启动起来处理消息。
为什么nrpe不自己开启守护进程监听端口呢,因为一台服务器有许多网络应用,每个应用都开启一个守护进程来监听自己的端口,将会增加系统资源占用。因此统一委托xinetd来进行监听。
接下去看对check_load的定义(@被监控机器 /usr/local/nagios/etc/nrpe.cfg):
# Thefollowing examples use hardcoded command arguments...
command[check_users]=/usr/local/nagios/libexec/check_users-w 5 -c 10
command[check_load]=/usr/local/nagios/libexec/check_load-w 15,10,5 -c 30,25,20 #command[定义的nrpe命令],这里可以调用本地程序获取需要的信息
command[check_hda1]=/usr/local/nagios/libexec/check_disk-w 20% -c 10% -p /dev/hda1
command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs-w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nagios/libexec/check_procs-w 150 -c 200
而这里的/usr/local/nagios/libexec/check_load哪来的呢,来自于nagios-plugin(@被监控机器)
---------------------------------------------------------------------------------
SNMP工作原理:
从Nagios的service开始(@监控服务器)
define service{host_name zc-host
service_description check-ps
check_command check_snmp!.1.3.6.1.4.1.2021.51 #这里引用了command:check_snmp
max_check_attempts 3
check_interval 3retry_interval 3
check_period 24x7
notification_interval 3
notification_period 24x7
contacts zhicheng
contact_groups monitor-group
}
接下去看Nagios的command(@监控服务器)
# 'check_by_snmp'command definition
define command{
command_name check_snmp
command_line /usr/bin/snmpwalk -v 1 $HOSTADDRESS$ -c liyuanqiu $ARG1$ #引用了net-snmp-utils提供的snmpwalk程序
}
接下去看snmpwalk这条命令(@监控服务器):
snmpwalk -v 110.14.21.185 -c liyuanqiu .1.3.6.1.4.1.2021.51
#通过snmp提供的一个应用层协议进行通信。监控服务器从一个随机的UDP端口将“请求”发送到被监控机器正在监听中的UDP161端口。“请求”的内容为执行MIB树中ID为.1.3.6.1.4.1.2021.51所指定的命令并回显。
被监控机器为什么会收到UDP161端口的消息呢?(@被监控服务器)
snmp创建了一个守护进程对UDP161端口进行监听,并未如nrpe一样委托xinetd来监听。
接下去看snmp如何定义MIB树中ID对应的命令(@被监控服务器 /etc/snmp/snmpd.conf):
# Other ideas:
#
extend.1.3.6.1.4.1.2021.51 ps /bin/ps #定义了ID对应的命令
# extend.1.3.6.1.4.1.2021.52 top /usr/local/bin/top
# extend.1.3.6.1.4.1.2021.53 mailq /usr/bin/mailq
---------------------------------------------------------------------------------------------------------------------------------------
最后,不管是nrpe还是snmp,被监控机器都将命令的运行结果按照各自应用层的协议发送至监控服务器。