serf-hostsを試してみた

#serf

前回1同様、serfの動作確認を行う。 今回は、ペパボのアドバンスドシニアエンジニア2であるantipopさん3が開発された、serf-hosts4を試してみた。

serf-hosts

serf-hostsは/etc/hostsの自動管理を行う。 member-join, member-leave (member-failed)のイベントに応じて、/etc/hostsへ対象ホストの追加・削除を行う。

serf-hostsの挙動について、QuickCasts5を使って動画を作成したので、こちらを見てもらえば実際の動作が分かる。

ここからは、上記の動画撮影のために揃えた環境についての説明となる。

Vagrantfile

前回使ったVagrantfileにちょっと修正を加えた。

$script = <<SCRIPT
[ -f /usr/local/src/serf.zip ] || wget -q https://dl.bintray.com/mitchellh/serf/0.6.3_linux_amd64.zip -O /usr/local/src/serf.zip
[ -f /usr/local/bin/serf ]     || unzip /usr/local/src/serf.zip -d /usr/local/bin
[ -d /usr/local/libexec/serf ]     || {
  mkdir /usr/local/libexec/serf
  wget https://raw.githubusercontent.com/kentaro/serf-hosts/master/event_handler.pl -O /usr/local/libexec/serf/serf-hosts
  chmod 755 /usr/local/libexec/serf/serf-hosts
}

mkdir -p /etc/serf/conf.d
cat<<EOS >/etc/serf/conf.d/config.json
{
  "interface": "eth1",
  "discover": "serftest",
  "encrypt_key": "TywlF+RXm2mHDIUqwCl8/w==",
  "event_handlers": ["/usr/local/libexec/serf/serf-hosts /etc/hosts"],
  "enable_syslog": true
}
EOS

sudo iptables -I INPUT -i eth1 -j ACCEPT
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "hfm4/centos6"
  config.vm.provision :shell, inline: $script

  config.vm.define :one do |c|
    c.vm.hostname = "one.dev"
    c.vm.network :private_network, ip: "192.168.128.2"
  end

  config.vm.define :two do |c|
    c.vm.hostname = "two.dev"
    c.vm.network :private_network, ip: "192.168.128.3"
  end
end

以下のコマンドを実行すれば、2つのVMが起動し、serfとserf-hostsが所定の場所に設置される。

vagrant up --provision

/usr/local/libexec

イベントハンドラ用スクリプトの設置場所については、RHEL6のFHSの説明6を読み、/usr/local/libexec/serfで管理するようにした (FHS 2.3版7にはlibexecが無かったので、/usr/local/libにするか悩んだ。)

2.2.1.13. /usr/ ディレクトリ

  • /usr/libexec、他のプログラムから呼び出される小さなヘルパープログラムを収納

この説明は/usr/libexecについてだが、今回はローカルソフトウェアに提供される/usr/localを利用する。

/etc/serf/conf.d/config.json

serfの設定ファイルは以下の通りである。event_handlersの値はarrayでなければならない。

{
  "interface": "eth1",
  "discover": "serftest",
  "encrypt_key": "TywlF+RXm2mHDIUqwCl8/w==",
  "event_handlers": ["/usr/local/libexec/serf/serf-hosts /etc/hosts"],
  "enable_syslog": true
}

実行コマンド

このserf (のイベントハンドラ) は/etc/hostsへ変更を加えるため、rootユーザで実行されなければならない。 また、単一の設定ファイルであれば-config-fileで指定すればよい。

sudo /usr/local/bin/serf agent -config-file=/etc/serf/conf.d/config.json

これまでは、gitリポジトリに/etc/hostsを管理させ、変更が生じたらデプロイツールでバラ撒いて対応していたが、serf-hostsによって、ホスト情報の追加・削除がとても楽になると思う。