Назад | Перейти на главную страницу

Corosync / Pacemaker + Haproxy Failed Actions: недостаточно прав

Я настраиваю кластер Corosync / Pacemaker + HAproxy, используя следующее руководство по Ubuntu 14.04 LTS: 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, и моя конфигурация выглядит следующим образом:

Чтобы все проверить, я завершаю процесс haproxy, выполнив следующую команду: sudo kill -9 [PID #]

Затем я проверяю состояние своего кластера и получаю следующее сообщение об ошибке: «Неудачные действия: недостаточно прав». Я не менял определение пользователя / группы haproxy, и мой aisexec {} использует root как для пользователя, так и для группы.

Какие у меня должны быть разрешения, если я хочу, чтобы Corosync / Pacemaker управлял Haproxy?

РЕДАКТИРОВАТЬ: Когда я запускаю следующую команду остановки службы, haproxy перезапускается, как ожидалось. Проверка crm status демон haproxy работает как обычно

# 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:

После внесения изменений Федерико упомянул (/bin/kill $pid || return 7) это не меняет моей проблемы, и я нахожу это в своих журналах:

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

Думаю проблема в сценарий инициализации, он не уважает Спецификация 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

отправляет сигнал SIGTERM на pid, найденный в $PIDFILE тогда и только тогда, когда этот pid принадлежит $ HAPROXY. Если названный $PIDFILE не существует, killproc предполагает, что демон $ HAPROXY не запущен. Статус выхода устанавливается на 0 для успешной доставки сигналов по умолчанию SIGTERM и SIGKILL, иначе на 7, если программа не была запущена. Он также считается успешным, если не был указан сигнал и не было программы для завершения, потому что оно уже завершено.