第13章 クラスターイベントのスクリプトのトリガー

Pacemaker クラスターはイベント駆動型のシステムで、イベントはリソースやノードの障害、設定の変更、またはリソースの開始や停止になります。Pacemaker クラスターアラートを設定すると、クラスターイベントの発生時に外部で一部の処理を行うことができます。クラスターアラートを設定するには、以下の 2 つの方法の 1 つを使用します。
  • Red Hat Enterprise Linux 7.3 より、アラートエージェントを使用して Pacemaker アラートを設定できるようになりました。アラートエージェントは、リソース設定と操作を処理するためにクラスター呼び出しのリソースエージェントと同様にクラスターが呼び出す外部プログラムです。これは推奨される方法で、クラスターアラートをより簡単に設定できます。Pacemaker アラートエージェントの説明は 「Pacemaker アラートエージェント (Red Hat Enterprise Linux 7.3 以降)」 を参照してください。
  • ocf:pacemaker:ClusterMon リソースはクラスターの状態を監視でき、クラスターイベントごとにアラートをトリガーできます。このリソースは、標準の間隔で crm_mon コマンドをバックグランドで実行します。 ClusterMon リソースの詳細は 「モニタリングのリソースを使ったイベント通知」 を参照してください。

13.1. Pacemaker アラートエージェント (Red Hat Enterprise Linux 7.3 以降)

クラスターイベントの発生時に Pacemaker アラートエージェントを作成して外部で一部の処理を行うことができます。クラスターは環境変数を用いてイベントの情報をエージェントに渡します。エージェントは、E メールメッセージの送信、ログのファイルへの記録、監視システムの更新など、この情報を自由に使用できます。

13.1.1. サンプルアラートエージェントの使用

サンプルアラートエージェントの 1 つを使用するとき、必要性に見合うようスクリプトを確認してください。サンプルエージェントは、特定のクラスター環境のカスタムスクリプトを作成するためのテンプレートとして提供されます。
サンプルアラートエージェントの 1 つ を使用するには、クラスターの各ノードにエージェントをインストールする必要があります。たとえば、以下のコマンドは alert_snmp.sh.sample スクリプトを alert_snmp.sh としてインストールします。
# install --mode=0755 /usr/share/pacemaker/alerts/alert_snmp.sh.sample /var/lib/pacemaker/alert_snmp.sh
スクリプトをインストールした後、そのスクリプトを使用するアラートを作成できます。以下の例は、インストールされた alert_snmp.sh アラートエージェントを使用するアラートを設定し、クラスターイベントを SNMP トラップとして送信します。デフォルトでは、正常なモニター呼び出し以外のすべてのイベントを SNMP サーバーに送信します。この例では、タイムスタンプの形式はメタオプションとして設定されます。メタオプションの詳細は、「アラートメタオプション」 を参照してください。アラートの設定後にアラートの受信側が設定され、アラート設定が表示されます。
# pcs alert create id=snmp_alert path=/var/lib/pacemaker/alert_snmp.sh meta timestamp_format="%Y-%m-%d,%H:%M:%S.%01N".
# pcs alert recipient add snmp_alert 192.168.1.2
# pcs alert
Alerts:
 Alert: snmp_alert (path=/var/lib/pacemaker/alert_snmp.sh)
  Meta options: timestamp_format=%Y-%m-%d,%H:%M:%S.%01N.
  Recipients:
   Recipient: snmp_alert-recipient (value=192.168.1.2)
以下の例は alert_smtp.sh エージェントをインストールし、インストールされたアラートエージェントを使用するアラートを設定してクラスターイベントを E メールメッセージとして送信します。アラートの設定後に受信側が設定され、アラート設定が表示されます。
# install --mode=0755 /usr/share/pacemaker/alerts/alert_smtp.sh.sample /var/lib/pacemaker/alert_smtp.sh
# pcs alert create id=smtp_alert path=/var/lib/pacemaker/alert_smtp.sh options email_sender=donotreply@example.com
# pcs alert recipient add smtp_alert admin@example.com
# pcs alert
Alerts:
 Alert: smtp_alert (path=/var/lib/pacemaker/alert_smtp.sh)
  Options: email_sender=donotreply@example.com
  Recipients:
   Recipient: smtp_alert-recipient (value=admin@example.com)
pcs alert create および pcs alert recipient add コマンドの形式に関する情報は 「アラートの作成」 and 「アラートの受信側」 を参照してください。

13.1.2. アラートの作成

以下のコマンドはクラスターアラートを作成します。設定するオプションは、追加の環境変数として指定するパスでアラートエージェントスクリプトに渡されるエージェント固有の設定値です。id の値を指定しないと、値が生成されます。アラートメタオプションに関する情報は、「アラートメタオプション」 を参照してください。
pcs alert create path=path [id=alert-id] [description=description] [options [option=value]...] [meta [meta-option=value]...]
複数のアラートエージェントを設定できます。この場合、クラスターは各イベントですべてのアラートエージェントを呼び出します。アラートエージェントはクラスターノード上でのみ呼び出されます。アラートエージェントは Pacemaker リモートノードが関係するイベントに対して呼び出されますが、これらのノード上では呼び出されません。
以下の例は、各イベントで my-script.sh を呼び出す簡単なアラートを作成します。
# pcs alert create id=my_alert path=/path/to/myscript.sh
サンプルアラートエージェントの 1 つを使用するクラスターアラートの作成方法の例は、「サンプルアラートエージェントの使用」 を参照してください。

13.1.3. アラートの表示、編集、および削除

以下のコマンドは、設定されたすべてのアラートと設定されたオプションの値を表示します。
pcs alert [config|show]
以下のコマンドは、指定した alert-id 値を持つ既存のアラートを更新します。
pcs alert update alert-id [path=path] [description=description] [options [option=value]...] [meta [meta-option=value]...]
以下のコマンドは、指定の alert-id 値を持つアラートを削除します。
pcs alert remove alert-id

13.1.4. アラートの受信側

通常、アラートは受信側に送信されます。よって、各アラートに 1 つ以上の受信側を追加設定できます。クラスターは受信側ごとに別々にエージェントを呼び出します。
受信側は、IP アドレス、E メールアドレス、ファイル名など、エージェントがサポートし認識できるものになります。
以下のコマンドは新しい受信側を指定のアラートに追加します。
pcs alert recipient add alert-id recipient-value [id=recipient-id] [description=description] [options [option=value]...] [meta [meta-option=value]...]
以下のコマンドは、既存のアラート受信側を更新します。
pcs alert recipient update recipient-id [value=recipient-value] [description=description] [options [option=value]...] [meta [meta-option=value]...]
以下のコマンドは指定のアラート受信側を削除します。
pcs alert recipient remove recipient-id
以下のコマンド例は、受信者 ID が my-recipient-id のアラート受信側 my-alert-recipient をアラート my-alert に追加します。これにより、 my-alert に設定されたアラートスクリプトを各イベントで呼び出すよう、クラスターが設定されます。
#  pcs alert recipient add my-alert my-alert-recipient id=my-recipient-id options value=some-address

13.1.5. アラートメタオプション

リソースエージェントと同様に、メタオプションをアラートエージェントに対して設定すると、Pacemaker の呼び出し方法を調整できます。アラートメタオプションの説明は 表13.1「アラートメタオプション」 を参照してください。メタオプションは、アラートエージェントごとまたは受信側ごとに設定できます。

表13.1 アラートメタオプション

メタ属性デフォルト説明
timestamp-format
%H:%M:%S.%06N
イベントのタイムスタンプをエージェントに送信するときにクラスターが使用する形式。この文字列は date(1) コマンドと使用されます。
timeout
30s
アラートエージェントがこの時間内に完了しないと終了させられます。
以下の例は、my-script.sh スクリプトを呼び出すアラートを設定し、2 つの受信側をアラートに追加します。最初の受信側の ID は my-alert-recipient1 で、2 つ目の受信側の ID は my-alert-recipient2 です。スクリプトは各イベントで 2 回呼び出され、呼び出しのタイムアウト値はそれぞれ 15 秒です。1 つの呼び出しは受信側 someuser@example.com に渡され、タイムスタンプの形式は %D %H:%M になります。もう 1 つの呼び出しは受信側 otheruser@example.com へ渡され、タイムスタンプの形式は %c になります。
# pcs alert create id=my-alert path=/path/to/my-script.sh meta timeout=15s
# pcs alert recipient add my-alert someuser@example.com id=my-alert-recipient1 meta timestamp-format=%D %H:%M
# pcs alert recipient add my-alert otheruser@example.com id=my-alert-recipient2 meta timestamp-format=%c

13.1.6. アラート設定コマンドの例

以下の例は、基本的なアラート設定コマンドの一部と、アラートの作成、受信側の追加、および設定されたアラートの表示に使用される形式を表しています。
以下のコマンドは簡単なアラートを作成し、アラートに 2 つの受信側を追加した後、設定された値を表示します。
  • アラート ID の値が指定されていないため、alert が値となるアラート ID が作成されます。
  • 最初の受信側作成コマンドは、rec_value の受信側を指定します。このコマンドには受信側 ID が指定されていないため、受信側 ID の値として alert-recipient が使用されます。
  • 2 番目の受信側作成コマンドは、rec_value2 の受信側を指定します。このコマンドは、my-recipient を受信側 ID として指定します。
# pcs alert create path=/my/path
# pcs alert recipient add alert rec_value
# pcs alert recipient add alert rec_value2 id=my-recipient
# pcs alert config
Alerts:
 Alert: alert (path=/my/path)
  Recipients:
   Recipient: alert-recipient (value=rec_value)
   Recipient: my-recipient (value=rec_value2)
以下のコマンドは 2 番目のアラートとそのアラートの受信側を追加します。2 番目のアラートのアラート ID は my-alert で、受信側の値は my-other-recipient です。受信側 ID が指定されていないため、my-alert-recipient が受信側 ID として使用されます。
# pcs alert create id=my-alert path=/path/to/script description=alert_description options option1=value1 opt=val meta meta-option1=2 m=val
# pcs alert recipient add my-alert my-other-recipient
# pcs alert
Alerts:
 Alert: alert (path=/my/path)
  Recipients:
   Recipient: alert-recipient (value=rec_value)
   Recipient: my-recipient (value=rec_value2)
 Alert: my-alert (path=/path/to/script)
  Description: alert_description
  Options: opt=val option1=value1
  Meta options: m=val meta-option1=2
  Recipients:
   Recipient: my-alert-recipient (value=my-other-recipient)
以下のコマンドは、アラート my-alert と受信側 my-alert-recipient のアラート値を変更します。
# pcs alert update my-alert options option1=newvalue1 meta m=newval
# pcs alert recipient update my-alert-recipient options option1=new meta metaopt1=newopt
# pcs alert
Alerts:
 Alert: alert (path=/my/path)
  Recipients:
   Recipient: alert-recipient (value=rec_value)
   Recipient: my-recipient (value=rec_value2)
 Alert: my-alert (path=/path/to/script)
  Description: alert_description
  Options: opt=val option1=newvalue1
  Meta options: m=newval meta-option1=2
  Recipients:
   Recipient: my-alert-recipient (value=my-other-recipient)
    Options: option1=new
    Meta options: metaopt1=newopt
以下のコマンドは、受信側 my-alert-recipientalert から削除します。
# pcs alert recipient remove my-recipient
# pcs alert
Alerts:
 Alert: alert (path=/my/path)
  Recipients:
   Recipient: alert-recipient (value=rec_value)
 Alert: my-alert (path=/path/to/script)
  Description: alert_description
  Options: opt=val option1=newvalue1
  Meta options: m=newval meta-option1=2
  Recipients:
   Recipient: my-alert-recipient (value=my-other-recipient)
    Options: option1=new
    Meta options: metaopt1=newopt
以下のコマンドは設定から myalert を削除します。
# pcs alert remove my-alert
# pcs alert
Alerts:
 Alert: alert (path=/my/path)
  Recipients:
   Recipient: alert-recipient (value=rec_value)

13.1.7. アラートエージェントの作成

Pacemaker アラートには、ノードアラート、フェンスアラート、およびリソースアラートの 3 種類があります。アラートエージェントに渡される環境変数は、アラートの種類によって異なります。アラートエージェントに渡される環境変数と、特定のアラートの種類に関連する環境変数の説明は、表13.2「アラートエージェントに渡される環境変数」 を参照してください。

表13.2 アラートエージェントに渡される環境変数

環境変数説明
CRM_alert_kind
アラートの種類 (ノード、フェンス、またはリソース)
CRM_alert_version
アラートを送信する Pacemaker のバージョン
CRM_alert_recipient
設定された送信側
CRM_alert_node_sequence
アラートがローカルノードで発行されるたびに増加するシーケンス番号。Pacemaker によってアラートが発行された順序を参照するために使用することができます。後で発生したイベントのアラートは、先に発生したイベントのアラートよりも確実にシーケンス番号が大きくなります。この番号は、クラスター全体を対象とする番号ではないことに注意してください。
CRM_alert_timestamp
エージェントの実行前に timestamp-format メタオプションによって指定された形式で作成されたタイムスタンプ。これにより、エージェント自体が呼び出されたタイミング (システムの負荷やその他の状況によって遅延される可能性があります) に関係なく、エージェントは信頼できる精度が高いイベント発生時間を使用できます。
CRM_alert_node
影響を受けるノードの名前
CRM_alert_desc
イベントの詳細。ノードアラートの場合はノードの現在の状態 (番号または lost) になります。フェンスアラートの場合は、フェンス操作の要求元、ターゲット、フェンス操作のエラーコードなどを含む要求されたフェンス操作の概要になります。リソースアラートの場合は CRM_alert_status と同等の読み取り可能な文字列になります。
CRM_alert_nodeid
状態が変更したノードの ID (ノードアラートの場合のみ提供)。
CRM_alert_task
要求されたフェンスまたはリソース操作 (フェンスおよびリソースアラートの場合のみ提供)。
CRM_alert_rc
フェンスまたはリソース操作の数値の戻りコード (フェンスおよびリソースアラートの場合のみ提供)。
CRM_alert_rsc
影響を受けるリソースの名前 (リソースアラートのみ)。
CRM_alert_interval
リソース操作の間隔 (リソースアラートのみ)
CRM_alert_target_rc
操作の予期される数値の戻りコード (リソースアラートのみ)。
CRM_alert_status
操作の結果を示すために Pacemaker によって使用される数値コード (リソースアラートのみ)。
アラートエージェントを記述するとき、以下を考慮する必要があります。
  • アラートエージェントは受信側がない状態で呼び出されることがあります (受信側が設定されていない場合)。そのため、エージェントはこの状態に対応できなければなりません (このような状況では終了する場合でも)。設定を段階的に変更し、後で受信側を追加することもできます。
  • 1 つのアラートに複数の受信側が設定された場合、アラートエージェントは受信側ごとに 1 回呼び出されます。エージェントが同時実行できない場合、受信側を 1 つのみ設定する必要があります。エージェントは受信側をリストとして解釈することができます。
  • クラスターイベントの発生時、すべてのアラートは別々のプロセスとして同時に発生します。設定されたアラートと受信側の数や、アラートエージェント内で実行されることによって、負荷が急激に増加する可能性があります。リソースが集中するアクションを直接実行せずに他のインスタンスのキューに置くなど、これを考慮してエージェントを記述する必要があります。
  • アラートエージェントは最低限のパーミッションを持つ hacluster ユーザーとして実行されます。アラートエージェントに追加のパーミッションが必要な場合は、sudo を設定してアラートエージェントが適切な特権を持つ別ユーザーとして必要なコマンドを実行できるようにすることが推奨されます。
  • CRM_alert_timestamp (このコンテンツはユーザー設定の timestamp-format によって指定)、CRM_alert_recipient、およびすべてのアラートオプションなど、ユーザー設定のパラメーターを検証およびサニタイズする場合は十分注意してください。設定エラーから保護する必要があります。また、クラスターへの hacluster レベルのアクセスがなくても CIB を変更できるユーザーが存在する場合、セキュリティーの問題が発生する可能性もあり、コードを挿入できないようにする必要があります。
  • onfail パラメーターが fence に設定されているリソースがクラスターに含まれる場合、障害時に複数のフェンス通知が送信されます (このパラメーターが設定されたリソースごとに 1 つの通知とそれに加えてさらに 1 つの通知)。STONITH デーモンと crmd デーモンの両方が通知を送信します。この場合、送信される通知の数に関係なく、Pacemaker は 1 つのフェンス操作のみを実際に実行します。

注記

アラートインターフェースは、ocf:pacemaker:ClusterMon リソースによって使用される外部スクリプトインターフェースと後方互換性を維持するよう設計されています。この互換性を維持するには、先頭に CRM_notify_ および CRM_alert_ が付けられたアラートエージェントに渡される環境変数を使用できます。ClusterMon リソースは root ユーザーとして実行し、アラートエージェントは hacluster ユーザーとして実行することがこの互換性の例外になります。ClusterMon によるスクリプトの設定に関する情報は、「モニタリングのリソースを使ったイベント通知」 を参照してください。