serfで/etc/hostsファイルを自動的に設定する

serfでhostsファイルを自動的に書き換えます。

| ホスト | IP |
|:-----:|:---------:|
| node1 | 192.168.33.71 |
| node2 | 192.168.33.72 |

## インストール
[ここ](http://www.serfdom.io/downloads.html)からダウンロードする。
wgetは入ってなければ`sudo yum install -y wget`で入れておく。

```
$ wget https://dl.bintray.com/mitchellh/serf/0.6.3_linux_amd64.zip
$ unzip 0.6.3_linux_amd64.zip

# serfが無い事を確認
$ ls -lh /usr/local/bin/serf
$ sudo mv serf /usr/local/bin
$ which serf
```

## serf起動テスト
```
[node1]
$ serf agent -iface=eth1 -node=node1 &

[node2]
$ serf agent -iface=eth1 -node=node2 &

# node1のIPアドレスにjoin
$ serf join 192.168.33.71     

[node1, node2]
# node1, node2がメンバーになっていることを確認する
$ serf members 
============================
    2014/08/14 00:01:52 [INFO] agent.ipc: Accepted client: 127.0.0.1:57684
node1  192.168.33.71:7946  alive
node2  192.168.33.72:7946  alive
============================

# ログの確認
$ serf monitor
============================
    2014/08/14 00:01:59 [INFO] agent.ipc: Accepted client: 127.0.0.1:57686
2014/08/13 23:59:56 [INFO] agent: Serf agent starting
2014/08/13 23:59:56 [INFO] serf: EventMemberJoin: node1 192.168.33.71
2014/08/13 23:59:57 [INFO] agent: Received event: member-join
2014/08/14 00:01:30 [INFO] serf: EventMemberJoin: node2 192.168.33.72
2014/08/14 00:01:31 [INFO] agent: Received event: member-join
2014/08/14 00:01:52 [INFO] agent.ipc: Accepted client: 127.0.0.1:57684
2014/08/14 00:01:59 [INFO] agent.ipc: Accepted client: 127.0.0.1:57686
============================

[node1, node2]
$ serf event 'Hello World'
```

どこで実行しても全MemberでHello Worldが表示される。

## [serf-hosts](https://github.com/kentaro/serf-hosts)
/etc/hostsを自動管理する。本家のperl版をうまく動かせなかったので[shellscript版](http://blog.manabusakai.com/2014/01/serf-hosts-for-shell-script/)を利用。

先ほどのテストで起動したserfは終了させておく。

### 使い方

```
[node1]
$ wget https://gist.githubusercontent.com/manabusakai/8266181/raw/c2414cddc3648c8e5003d9fd2503653f9941b8eb/event_handler.sh
$ chmod 755 event_handler.sh
$ sudo /usr/local/bin/serf agent -iface=eth1 -node=node1 -discover=webapp -event-handler=./event_handler.sh &

# /etc/hostsにnode1追加されている事を確認
$ cat /etc/hosts
============================
...
192.168.33.71	node1
============================
```

```
[node2]
$ wget https://gist.githubusercontent.com/manabusakai/8266181/raw/c2414cddc3648c8e5003d9fd2503653f9941b8eb/event_handler.sh
$ chmod 755 event_handler.sh
$ sudo /usr/local/bin/serf agent -iface=eth1 -node=node2 -event-handler=./event_handler.sh &

# node1のIPアドレス。joinでnode2の/etc/hostsに反映される
$ sudo /usr/local/bin/serf join 192.168.33.71

# /etc/hostsにnode1, node2が追加されている事を確認
$ cat /etc/hosts
============================
...
192.168.33.72	node2
192.168.33.71	node1
============================
```

```
[node1]
# /etc/hostsにnode1, node2が追加されている事を確認
$ cat /etc/hosts
============================
...
192.168.33.71	node1
192.168.33.72	node2
============================
```
node2のserfを終了させると自動的にnode1の/etc/hostsからnode2の設定が消える。

```
[node2]
$ fg
sudo /usr/local/bin/serf agent -iface=eth1 -node=node2 -event-handler=./event_handler.sh
# Ctrl+cをおす
============================
^C==> Caught signal: interrupt
==> Gracefully shutting down agent...
    2014/08/14 00:21:55 [INFO] agent: requesting graceful leave from Serf
    2014/08/14 00:21:56 [INFO] serf: EventMemberLeave: node2 192.168.33.72
    2014/08/14 00:21:56 [INFO] agent: requesting serf shutdown
    2014/08/14 00:21:56 [INFO] agent: shutdown complete
============================

[node1]
$ cat /etc/hosts
============================
...
192.168.33.71	node1
============================
```

## 備考

### 起動(マルチキャストDNS)
serf joinしなくても自動でクラスタに参加する。

```
[node1]
$ serf agent -iface=eth1 -node=node1  -discover=webapp &

[node2]
$ serf agent -iface=eth1 -node=node2  -discover=webapp &

# node1, node2がメンバーになっていることを確認する
$ serf members 

# ログの確認
$ serf monitor  
```
hostsを書き換えるスクリプトは明示的にjoinしないとうまく反映されなかった。。


### オプション
* -log-level=debug : デバッグモード

## リンク
* [「hbstudy#60 SerfとConsulでシステム運用を楽し>くしよう！」に行ってきました＆Serf試してみまし>た](http://blog.pg1x.com/entry/2014/07/21/231327)
* [Serf Cheat Sheet 日本語版](http://qiita.com/zembutsu/items/1e2cddd0a424ef7a4895)
* [Serfが面白いと俺の中で話題にwwwwww 【改訂版】](http://www.slideshare.net/zembutsu/serf-the-liberator-2nd)
* [kentaro/serf-hosts](https://github.com/kentaro/serf-hosts)
*  [serf-hostsを試してみた](http://blog.hifumi.info/2014/07/27/try-serf-hosts/)
* [serf-hosts をシェルスクリプトで書き直した](http://blog.manabusakai.com/2014/01/serf-hosts-for-shell-script/)