Corosync/Pacemaker + Haproxy 操作失败:权限不足

Corosync/Pacemaker + Haproxy 操作失败:权限不足

我按照以下指南在 Ubuntu 14.04 LTS 上设置了 Corosync/Pacemaker 集群 + HAproxy: http://www.sebastien-han.fr/blog/2012/04/15/active-passive-failover-cluster-on-a-mysql-galera-cluster-with-haproxy-lsb-agent/

我没有添加虚拟 IP 设置,只有两个节点,都安装了 Haproxy。我使用的是 lsb:haproxy,我的配置如下:

Corosync lsb:haproxy 操作失败:权限不足 为了测试一切,我通过运行以下命令终止 haproxy 进程:sudo kill -9 [PID#]

然后我检查集群的状态并收到以下错误消息:“操作失败:权限不足”。我没有更改 haproxy 用户/组定义,并且我的 aisexec{} 对用户和组都使用 root 权限。

如果我希望 Corosync/Pacemaker 管理 Haproxy,我的权限应该是什么?

编辑:当我运行以下服务停止命令时,haproxy 会按预期重新启动。检查crm statushaproxy 守护程序是否正常运行

# sudo service haproxy stop
# sudo crm status
HaproxyHA     (lsb:haproxy):    Started node1
Failed Actions:

但是当我手动终止 pid 时,我仍然看到错误:

# sudo kill -9 $PID
HaproxyHA (lsb:haproxy): Started node1 (unmanaged) FAILED
Failed Actions:

在实施 Federico 提到的更改后,(/bin/kill $pid || return 7)它并没有改变我的问题,我在日志中发现了这一点:

pengine: warning: unpack_rsc_op: Processing failed op stop for HaproxyHA on node1: not running (7)

答案1

我认为问题在于初始化脚本,它不尊重LSB 规格

如果你查看haproxy_stop文件中的函数/etc/init.d/haproxy

haproxy_stop()
{
    if [ ! -f $PIDFILE ] ; then
        # This is a success according to LSB
        return 0
    fi
    for pid in $(cat $PIDFILE) ; do
        /bin/kill $pid || return 4
    done
    rm -f $PIDFILE
    return 0
}

特别是这一行/bin/kill $pid || return 4。这使得进程被终止时返回值为 4,根据规范,这是:用户权限不足. 这是不正确的。

如果在处理除状态之外的任何初始化脚本操作时出现错误,初始化脚本将打印错误消息并以非零状态代码退出:

1 generic or unspecified error (current practice)
2 invalid or excess argument(s)
3 unimplemented feature (for example, "reload")
4 user had insufficient privilege
5 program is not installed
6 program is not configured
7 program is not running
8-99  reserved for future LSB use
100-149   reserved for distribution use
150-199   reserved for application use
200-254   reserved

您可以尝试通过以下方式进行更改:

/bin/kill $pid || return 7

正确的方法是使用以下方法停止守护进程killproc(8)如果失败,则killproc根据 LSB 设置返回值。

例如。

/sbin/killproc -p $PIDFILE $HAPROXY

$PIDFILE当且仅当此 pid 属于 $HAPROXY 时,才 将信号 SIGTERM 发送到在 中找到的 pid 。如果名称$PIDFILE不存在,killproc 会假定 $HAPROXY 的守护进程未运行。如果成功传递默认信号 SIGTERM 和 SIGKILL,则退出状态设置为 0,否则如果程序未运行,则设置为 7。如果没有指定信号并且没有程序用于终止,因为它已经终止,则退出状态也会成功。

相关内容