時折、どこかのノードで設定ファイルとか編集をしたら、自動的に同期して他のノードでも設定を変えて欲しい時がある。
台数が多ければAnsibleなどで設定ファイルを一括更新するが、2\~3台でそこまでするのもなぁ…というときは、Lsyncdを使って自動的に同期させると良いだろう。

Lsyncdは、inotify(Linuxに用意されている、ファイルの変更を検知する仕組み)で、変更を検知したと同時にrsyncでファイルを同期するデーモンツールだ。
比較的簡単に設定ができ、ファイルの削除や新規追加、変更でも同期を自動的に行ってくれる。もちろん、中身はrsyncなのでssh経由でのリモート同期も可能だ。

ここでは、各サーバで「/opt/syncd」というディレクトリを、ssh経由での通信で自動同期させてみる。
なお、前にもこっちで書いてたようだが、今回のはssh経由での通信を行わせる(やったことあるの忘れてた)。

1.インストール

まずはインストールから。
以下のように、yumやapt-getでインストールできる。

RHEL系(以下では、CentOS7を使用)

rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum install lsyncd rsync

Debian/Ubuntu系

sudo apt-get install lsyncd

これで、インストールができた。

2.設定

まず、各サーバでsshの公開鍵認証によるログイン設定を行う。
自動同期を行う各サーバで、以下の処理を実行する。

ssh-keygen
ssh-copy-id ユーザ@ホスト名(IPアドレス)
[root@BS-PUB-GALERA-01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
2b:51:e5:3b:6a:2f:37:30:29:54:ba:12:0c:f6:34:15 root@BS-PUB-GALERA-01.BLACKNON.LOCAL
The key's randomart image is:
+--[ RSA 2048]----+
|     .E.  .      |
|  o o   .o       |
| . = . o. .      |
|    + o.   .     |
|     o..S.o      |
|    . o.+o .     |
|     ...+o       |
|       o..o      |
|         o..     |
+-----------------+
[root@BS-PUB-GALERA-01 ~]# ssh-copy-id root@XXX.XXX.XXX.XXX
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@XXX.XXX.XXX.XXX's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@XXX.XXX.XXX.XXX'"
and check to make sure that only the key(s) you wanted were added.

これで、sshの公開鍵認証でのログイン設定が完了した。
次に、lsyncdの設定ファイルを記述する。

「/usr/share/doc/lsyncd/lrsync.lua」もしくはこちらの情報を参考に、以下のように「/etc/lsyncd.conf」を作成する。

●/etc/lsyncd.conf

-- 基本設定
settings = {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/run/lsyncd.stat",
statusInterval = 1,
}

-- 各ノードごとの同期設定
sync{
default.rsyncssh,
delay = 0,
source="/opt/syncd",
host="ユーザ名@ホスト名(IPアドレス)",
targetdir="/opt/syncd",
delete="running"
}

上記のような設定ファイルを各ノードに設置し、lsyncdを起動する。

service lsyncd start

これで、「/opt/syncd」配下の中身が各ノードで全て同期されるようになった。
同期も、「delay=0」と指定しているので、3台程度であれば即座に反映される。設定ファイルの同期であれば、問題なく利用できるだろう。