web-dev-qa-db-ja.com

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がインストールされている2つのノードのみを追加しました。私はlsb:haproxyを使用しており、構成は次のとおりです。

Corosync lsb:haproxyfailed actions: insuffient privileges すべてをテストするために、次のコマンドを実行してhaproxyプロセスを強制終了します。Sudokill-9 [PID#]

次に、クラスターのステータスを確認すると、「失敗したアクション:特権が不十分です」というエラーメッセージが表示されます。 haproxyユーザー/グループ定義を変更せず、aisexec {}はユーザーとグループの両方にrootを使用しています。

Corosync/PacemakerにHaproxyを管理させたい場合、私の権限はどうあるべきですか?

EDIT:以下のservice stopコマンドを実行すると、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:

変更を実装した後、フェデリコは(/bin/kill $pid || return 7)それは私の問題を変えません、そして私は私のログでこれを見つけます:

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

問題は initスクリプト にあると思いますが、 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になります。これは、仕様によれば、ユーザーの特権が不十分でした。これは正しくありません。

ステータス以外のinit-scriptアクションの処理中にエラーが発生した場合、initスクリプトはエラーメッセージを出力し、ゼロ以外のステータスコードで終了します。

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

このpidが$ HAPROXYに属している場合に限り、シグナルSIGTERMを$PIDFILEにあるpidに送信します。指定された$PIDFILEが存在しない場合、killprocは$ HAPROXYのデーモンが実行されていないと見なします。終了ステータスは、デフォルトのシグナルSIGTERMおよびSIGKILLを正常に配信するために0に設定され、プログラムが実行されていない場合は7に設定されます。シグナルが指定されておらず、すでに終了しているために終了用のプログラムがなかった場合も成功します。

2
Federico Sierra