Nagios で Pacemaker のクラスタの状態を監視する

とある Pacemaker で HA クラスタにしてるシステムで Pacemaker のクラスタの状態を監視したときのメモ。

Pacemaker から次のような方法でパッシブに Nagios に通知すれば良さそうですけど・・・

パッシブチェックのための処理を監視対象のサーバに仕込むのはけっこう面倒なので Nagios からのアクティブチェックで監視できるようにします。

次のようなものを監視したいです。

  • ノードが online 以外になっている(offline とか standby)
  • リソースがコケてフェイルカウントがあがってる
  • リソースを移動させたときのロケーション制約が残ったまま

これらの情報は crm_mon コマンドで取得できるので、Nagios から nrpe 経由で crm_mon コマンドを実行してその内容を元に結果を出力する Nagios プラグインを作ります。

check_pacemaker.sh

#!/bin/bash

tmp=$(mktemp /tmp/check_pacemaker.XXXXXX)
trap 'rm -f $tmp' EXIT

sudo crm_mon -1NDfn -L > "$tmp"

output=$(
  cat "$tmp" | grep '^Node' | grep -v 'online$'

  cat "$tmp" | sed -n -e '/^Failed Actions:/,/^$/p'

  cat "$tmp" | sed -n -e '/^Migration Summary:/,/^$/p' | grep 'fail-count' >/dev/null &&\
  cat "$tmp" | sed -n -e '/^Migration Summary:/,/^$/p'

  cat "$tmp" | sed -n -e '/^Negative Location Constraints:/,/^$/p' | tail -n +2 | grep . >/dev/null &&\
  cat "$tmp" | sed -n -e '/^Negative Location Constraints:/,/^$/p'
)

if [ -n "$output" ]; then
  echo "$output" | tr '|' ' '
  exit 1
fi

sudo crm_mon -s

crm_mon の出力を一時ファイルに書いていますがよく考えたら変数に入れるだけで十分でした。

sudo するために以下のような sudoers も必要です。secure ログへの出力がうざかったので nrpe では syslog も無効にしています。

Defaults:nrpe !syslog
nrpe ALL=(root) NOPASSWD: /usr/sbin/crm_mon -1NDfn -L, /usr/sbin/crm_mon -s

次のような通知が発生します。

正常なとき

[OK] CLUSTER OK: 2 nodes online, 3 resources configured

ノードが standby のとき

[WARNING] Node db02: standby

ノードが offline のとき

[WARNING] Node db02: OFFLINE

リソースにロケーション制約がついているとき

[WARNING] Negative Location Constraints:
 cli-ban-mysql-on-db01  prevents mysql from running on db01

リソースがコケたとき

[WARNING] Failed Actions:
* mysql_monitor_20000 on db01 'not running' (7): call=77, status=complete, exitreason='',
    last-rc-change='Thu Oct 24 09:55:25 2019', queued=0ms, exec=0ms

Migration Summary:
* Node db01:
   mysql: migration-threshold=1000000 fail-count=1 last-failure='Thu Oct 24 09:55:25 2019'
* Node db02:

リソースがコケたときの通知がめちゃくちゃ冗長な気がするのと、Nagios のプラグインの出力は1行目と2行目以降で意味に違いがあったりパフォーマンスデータがパイプで区切られる仕様だったりするはずなのだけど・・・

とりあえず動いているので良しとします。

これを次のように nrpe の設定ファイルに仕込んで、

command[check_pacemaker]=/usr/lib64/nagios/plugins/check_pacemaker.sh $ARG1$

Nagios から次のように監視します。

define command{
    command_name    check_nrpe
    command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a "$ARG2$"
}

define service{
    use                   generic-service
    host_name             db-active
    service_description   Pacemaker
    check_command         check_nrpe!check_pacemaker
}

さいごに

ぐぐると次のようなものも見つかりました。

あと pcs-snmp というものもあって SNMP で crm_mon と同じような情報が得られるようです。