仅当由网络触发时,运行集群检查时 check_mk_agent 才会挂起

仅当由网络触发时,运行集群检查时 check_mk_agent 才会挂起

我的检查服务器连接到几个已安装的 RHEL 节点检查代理(版本 1.2.4p3)。这些节点的组属于一个 Pacemaker 集群。

check_mk 代理是默认配置的——xinet 服务配置为绑定到端口 6556/TCP:

service check_mk
{
        type           = UNLISTED
        port           = 6556
        socket_type    = stream
        protocol       = tcp
        wait           = no
        user           = root
        server         = /usr/bin/check_mk_agent

        # If you use fully redundant monitoring and poll the client
        # from more then one monitoring servers in parallel you might
        # want to use the agent cache wrapper:
        #server         = /usr/bin/check_mk_caching_agent

        # configure the IP address(es) of your Nagios server here:
        #only_from      = 127.0.0.1 10.0.20.1 10.0.20.2

        # Don't be too verbose. Don't log every check. This might be
        # commented out for debugging. If this option is commented out
        # the default options will be used for this service.
        log_on_success =

        disable        = no
}

其中一个集群节点在打开 6556/TCP 端口的套接字时出现问题,因为在/usr/bin/check_mk_agent中脚本挂在集群检测阶段

crm_mon -1 -r | grep ···

这会使 check_mk 服务器报告该节点上的问题。

当我注释掉 check_mk_agent 脚本中的集群检测命令时,它工作正常

# Heartbeat monitoring
# Different handling for heartbeat clusters with and without CRM
# for the resource state
###if [ -S /var/run/heartbeat/crm/cib_ro -o -S /var/run/crm/cib_ro ] || pgrep crmd > /dev/null 2>&1; then
###  echo '<<<heartbeat_crm>>>'
###  crm_mon -1 -r | grep -v ^$ | sed 's/^ //; /^\sResource Group:/,$ s/^\s//; s/^\s/_/g'
###fi
###if type cl_status > /dev/null 2>&1; then
###  echo '<<<heartbeat_rscstatus>>>'
###  cl_status rscstatus
###
###  echo '<<<heartbeat_nodes>>>'
###  for NODE in $(cl_status listnodes); do
###    if [ $NODE != $(echo $HOSTNAME | tr 'A-Z' 'a-z') ]; then
###      STATUS=$(cl_status nodestatus $NODE)
###      echo -n "$NODE $STATUS"
###      for LINK in $(cl_status listhblinks $NODE 2>/dev/null); do
###        echo -n " $LINK $(cl_status hblinkstatus $NODE $LINK)"
###      done
###      echo
###    fi
###  done
###fi

在其余集群节点中未发现该问题。

我确信这不是网络问题,因为从故障节点内部打开连接时也会发生相同的行为:

telnet 127.0.0.1 6556

最奇怪的是我每天手动运行该命令crm_mon -1 -r很多次,但它从未挂起

什么可以让命令crm_mon -1 -r挂起只有一个节点当没有连接终端的情况下执行它时?

提前感谢

更新 1

我已经创建了一个新的xinetd类似于 check_mk 的服务,但更改了名称、端口号和服务器。服务器脚本仅包含以下几行

#!/bin/bash
unset LANG
export LC_ALL=C

date
/usr/sbin/crm_mon -1 -r -N
#/usr/sbin/crm_resource -L
date

它也挂了。我甚至尝试使用crm_resource -L,其输出相同,但它也挂了:

# telnet 127.0.0.1 6557
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Fri Jul 14 08:37:36 CEST 2017

更新 2

SELinux 配置是Disabled

答案1

您的 SELinux 配置是什么?

通过 xinetd 调用的 Check_mk 上下文与在 root shell 中调用的上下文不同。我曾见过这种情况妨碍 Nagios 远程插件执行器,似乎它对 check_mk 也有同样的影响。

查看 SELinux 是否强制执行:

$ getenforce

将其设置为允许并查看问题是否仍然存在:

$ setenforce 0

如果是这个问题,我建议使用 autdit2allow 调整 SELinux 策略,而不是禁用 SELinux。

有关使用 audit2allow 的信息,请参阅此链接: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Fixing_Problems-Allowing_Access_audit2allow.html

相关内容