如何使用CentOS 6中的Icinga / Nagios通过HA代理监控networking服务器节点

在本指南中,我不关注设置HA代理或为什么要这样做。 如果你有它,并且想要使用Icinga来正确地监控它,那么下面是你如何去做这件事的一个想法。

所以这是一个潜在的情况:

  • 2个数据中心A和B.
  • 每个数据中心1个HA代理节点
  • 每个HA代理指向每个数据中心A1,A2,B1,B2中的2个Web服务器
  • 这个场景中的Web服务器实际上是一个Web服务端点,并且一个简单的HTTP GET到URL并不能告诉你有关系统的实际健康状况

监测明智的你可以解决你的当前活动节点的外部检查(如pingdom或其他)。 这将有一些影响,虽然:

  • 你不会testing被动节点,这意味着在节点切换之前,你不确定被动节点是否工作
  • 一个节点的失败不会给你一个明确的错误指示

所以这里是一个偏执的人的方法:

  • 我想从外部IP(s),通过HA代理一直监视每个节点,并进入系统捕捉任何故障
  • 我想要对后端服务进行实际的Web服务调用,以validation它是否正常工作 – 如果您正在testing一个正常的Web站点,显然不适用

让我们开始吧

首先,您需要在haproxy中启用cookie插入,并为每个后端节点分配唯一的密钥。 这通常用于会话粘性 – 也就是说,如果有人访问您的站点,如果它仍然可用,总会得到相同的后端节点。 但它也可以用来通过发送适当的cookie来监视单个节点。 所以,如果不存在添加cookies到您的haproxy服务器定义:

cookie SERVERID insert indirect nocache server webA1 10.0.0.1:80 cookie S1 server WebA2 10.0.0.2:80 cookie S2 

其次,你需要弄清楚什么是最有意义的检查,在这个你需要做一些思考和独自摆弄,找出最有意义的东西,以及如何检查使用nagios的真棒check_http。 为了完整起见,我将在下面给出一个复杂的例子,说明如何testingPOST到后端Web服务。 对于这个示例场景,要求是:

  - Post data should be <echo>Hello</echo> - A successful execution will return the echo string back - Disable any cache through HTTP headers - Set content-type to text/xml and expect the same back - SSL should be used - Host name is example.com - Port is 443 - URI is /service - Max response time is 3 seconds 

这将由以下参数来处理check_http(Cent OS 6上的/ usr / lib64 / nagios / plugins / check_http)

 -P "<echo>Hello</echo>" -r 'Hello' -k "Cache-Control: no-cache" -k "Pragma: no-cache" -k "Content-Type: text/xml; charset=UTF-8" -k "Accept: text/xml" -S -H example.com -p 443 -u /service -t 3 

现在,这一切都应该给你一个很好的输出,首先得到这个工作。

那么现在是时候让一些自定义方面能够通过cookie来select节点,还可以select性地发送一个IP来覆盖DNS,例如,如果您想通过被动数据中心检查path。 为此,我们将编写一个围绕check_http的小型shell脚本包装器,它将采用一个参数作为后端节点的主机名(为了方便起见,让我们使用icinga认为主机名是什么)和一个可选参数来覆盖要检查的服务器的IP(绕过DNS查找)。 这一切都导致了一个shell脚本看起来像这样(我build议把它放在/ usr / lib64 / nagios / plugins /和chown中,按照其他插件那样chmod):

 #/bin/bash if [ -z "$1" ] then echo "Usage: $0 host-name [haproxy-ip]" exit 2 fi if [[ $# -eq 2 ]]; then APPEND_OPTS=" -I $2" fi #Map icinga/nagios host names to haproxy node names in case these differ and you don't want to expose them on the internetz declare -A nodes nodes=(["webA1"]="S1" ["webA2"]="S2" ["webB1"]="S3" ["webB2"]="S4") node=${nodes["$1"]} /usr/lib64/nagios/plugins/check_http -P "<echo>Hello</echo>" -r 'Hello' -k "Cache-Control: no-cache" -k "Pragma: no-cache" -k "Content-Type: text/xml; charset=UTF-8" -k "Accept: text/xml" -S -H example.com -p 443 -u /service -t 3 -k "Cookie: SERVERID=$node" $APPEND_OPTS 

请注意,SERVERID是在haproxy中设置的cookie的名称。

一旦这个到位,你可以定义你的nagios检查命令,类似于:

 #Check path through av A fw and haproxy define command{ command_name check_node_external_a command_line $USER1$/check_node '$HOSTNAME$' '<A external IP>' } 

其中check_node是包装器脚本的名称,“外部IP”是用于到达数据中心A中系统的IP。

这样可以在最近几天为我节省很多时间,所以我希望它也能让你朝正确的方向发展。