swatchでログを監視しよう

DRBDはシステムのログにさまざまな情報を記録します。

ログの記録を元に自動でメールの送信や修復プログラムの実行ができると便利で、そのためのユーティリティがLinuxにはいくつも用意されています。今回はswatchを紹介します。

 

swatchとは


ファイルに記録される文字列を常にチェックして、特定の文字列を見つけると、予めきめたアクションを実行します。例えば、Split-Brain detected が/var/log/messagesに記録されると、管理者にメールを送信するようなことができます。

開発サイトはこちらです。

 

インストール


CentOS7での例を紹介します。

swatchはEPELに含まれているので、最初にこのリポジトリをインストールします。

# yum install epel-release

EPELリポジトリがインストールできたら、swatchをインストールします。

# yum install -y swatch
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
* epel: nrt.edge.kernel.org
* extras: ftp.riken.jp
* updates: ftp.riken.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ swatch.noarch 0:3.2.3-24.el7 を インストール
--> 依存性の処理をしています: perl(Date::Calc) のパッケージ: swatch-3.2.3-24.el7.noarch
--> 依存性の処理をしています: perl(Date::Manip) のパッケージ: swatch-3.2.3-24.el7.noarch
--> トランザクションの確認を実行しています。
---> パッケージ perl-Date-Calc.noarch 0:6.3-14.el7 を インストール
--> 依存性の処理をしています: perl(Bit::Vector) >= 7.1 のパッケージ: perl-Date-Calc-6.3-14.el7.noarch
--> 依存性の処理をしています: perl(Carp::Clan) のパッケージ: perl-Date-Calc-6.3-14.el7.noarch
--> 依存性の処理をしています: perl(Bit::Vector) のパッケージ: perl-Date-Calc-6.3-14.el7.noarch
---> パッケージ perl-Date-Manip.noarch 0:6.41-2.el7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ perl-Bit-Vector.x86_64 0:7.3-3.el7 を インストール
---> パッケージ perl-Carp-Clan.noarch 0:6.04-10.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
================================================================================================
インストール中:
swatch noarch 3.2.3-24.el7 epel 52 k
依存性関連でのインストールをします:
perl-Bit-Vector x86_64 7.3-3.el7 base 165 k
perl-Carp-Clan noarch 6.04-10.el7 base 26 k
perl-Date-Calc noarch 6.3-14.el7 base 210 k
perl-Date-Manip noarch 6.41-2.el7 base 1.2 M

トランザクションの要約
================================================================================================
インストール 1 パッケージ (+4 個の依存関係のパッケージ)

総ダウンロード容量: 1.6 M
インストール容量: 13 M
Downloading packages:
(1/5): perl-Bit-Vector-7.3-3.el7.x86_64.rpm | 165 kB 00:00:00 
(2/5): perl-Carp-Clan-6.04-10.el7.noarch.rpm | 26 kB 00:00:00 
(3/5): perl-Date-Calc-6.3-14.el7.noarch.rpm | 210 kB 00:00:00 
warning: /var/cache/yum/x86_64/7/epel/packages/swatch-3.2.3-24.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
swatch-3.2.3-24.el7.noarch.rpm の公開鍵がインストールされていません
(4/5): swatch-3.2.3-24.el7.noarch.rpm | 52 kB 00:00:00 
(5/5): perl-Date-Manip-6.41-2.el7.noarch.rpm | 1.2 MB 00:00:00 
------------------------------------------------------------------------------------------------
合計 1.4 MB/s | 1.6 MB 00:00:01 
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 から鍵を取得中です。
Importing GPG key 0x352C64E5:
Userid : "Fedora EPEL (7) <epel@fedoraproject.org>"
Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
Package : epel-release-7-11.noarch (@extras)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : perl-Carp-Clan-6.04-10.el7.noarch 1/5 
インストール中 : perl-Bit-Vector-7.3-3.el7.x86_64 2/5 
インストール中 : perl-Date-Calc-6.3-14.el7.noarch 3/5 
インストール中 : perl-Date-Manip-6.41-2.el7.noarch 4/5 
インストール中 : swatch-3.2.3-24.el7.noarch 5/5 
検証中 : perl-Bit-Vector-7.3-3.el7.x86_64 1/5 
検証中 : swatch-3.2.3-24.el7.noarch 2/5 
検証中 : perl-Date-Manip-6.41-2.el7.noarch 3/5 
検証中 : perl-Date-Calc-6.3-14.el7.noarch 4/5 
検証中 : perl-Carp-Clan-6.04-10.el7.noarch 5/5

インストール:
swatch.noarch 0:3.2.3-24.el7

依存性関連をインストールしました:
perl-Bit-Vector.x86_64 0:7.3-3.el7 perl-Carp-Clan.noarch 0:6.04-10.el7 
perl-Date-Calc.noarch 0:6.3-14.el7 perl-Date-Manip.noarch 0:6.41-2.el7

完了しました!

使い方


swatchには監視の文字列と、それを見つけた時に実行するアクションを定義する設定ファイルが必要です。どこに置いての良いのですが、今回は/etc/swatchという名前でディレクトリを作り、その中に設定ファイルを作成します。

# mkdir -p /etc/swatch
# vi /etc/swatch/sb-test

/etc/swatch/sb-testは次のような内容になります。

watchfor /Split-Brain detected/
          exec "/usr/local/bin/test.sh"

上記の例はSplit-Brain detectedが見つかった時に/usr/local/bin/test.shを起動します。
/usr/local/bin/test.shは次のような内容にしました。

#!/bin/sh

echo "Split Brain!!" >> /tmp/sb-log

テストなので/tmp/sb-logに”Split Brain!!”の文字を記録するだけの簡単なスクリプトです。

 

実行


swatchを実行します。引数には設定ファイルと、監視するファイルを指定します。Split-Brain detectedはDRBDの場合両方のノードに記録されるので、どちらのノードで実行しても同じように動作します。

今回はDRBDのPrimaryのnode1で実行します。

[root@node1 ~]# swatch -c /etc/swatch/sb-test -t /var/log/messages

テストのためにnode2側でDRBDの通信を切り、強制的に両ノードをPrimary状態にします。そのあと通信が回復するとスプリットブレインの状態になります。

[root@node2 ~]# drbdadm disconnect r0
[root@node2 ~]# drbdadm primary r0
[root@node2 ~]# mount /dev/drbd0 /mnt
[root@node2 ~]# umount /mnt
[root@node2 ~]# drbdadm secondary r0
[root@node2 ~]# drbdadm connect r0

 

DRBDがスプリットブレインを検知して、/var/log/messagesに”Split-Brain detected”が記録されました。

Oct 2 06:57:52 node1 kernel: block drbd0: helper command: /sbin/drbdadm initial-split-brain minor-0 exit code 0 (0x0)
Oct 2 06:57:52 node1 kernel: block drbd0: Split-Brain detected but unresolved, dropping connection!
Oct 2 06:57:52 node1 kernel: block drbd0: helper command: /sbin/drbdadm split-brain minor-0
Oct 2 06:57:52 node1 kernel: block drbd0: helper command: /sbin/drbdadm split-brain minor-0 exit code 0 (0x0)
Oct 2 06:57:52 node1 kernel: drbd r0: conn( WFReportParams -> Disconnecting ) 
Oct 2 06:57:52 node1 kernel: drbd r0: error receiving ReportState, e: -5 l: 0!
Oct 2 06:57:52 node1 kernel: drbd r0: ack_receiver terminated
Oct 2 06:57:52 node1 kernel: drbd r0: Terminating drbd_a_r0

swatchがこの文字列を検知して/usr/local/bin/test.shが実行されます。スクリプトの実行結果は次のファイルで確認できます。

[root@node1 ~]# cat /tmp/sb-log 
Split Brain!!