前回は『OSS編~オーケストレーションツール Serf 01インストール編~』と題して、オーケストレーションのSerfでインストールから基本操作までを試してみました。
今回は『OSS編~オーケストレーションツール Serf 02 イベントハンドラ編~』と題して、引き続きオーケストレーションのSerfでイベントハンドラを試してみたいと思います。
イベントハンドラ
Serfではイベントが発生した際に任意のスクリプトを実行する事が出来ます。
Serfのイベントタイプ
Serfでは以下のイベントのタイプがあります。
イベントのタイプにあわせて実行するスクリプトを
・member-join
クラスターへの参加
・member-leave
クラスターからの離脱
・member-failed
メンバーの障害
・member-update
メンバーのアップデート
・member-reap
リストからの削除
・user
カスタムユーザーイベント
・query
クライアント側で実行結果が確認出来るカスタムユーザーイベント
イベントハンドラの実行
1.イベントハンドラ
先ずはSerfのイベントの環境変数を出力するスクリプトを作成します。
1 2 3 4 5 6 7 8 9 |
$ vim handler.sh #!/bin/bash echo echo "New event: ${SERF_EVENT}. Data follows..." while read line; do printf "${line}\n" done $ chmod +x handler.sh |
Serfエージェントを起動する際にイベントハンドラを指定して確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ serf agent -log-level=debug -node=foo -bind=127.0.0.1:5000 -rpc-addr=127.0.0.1:7373 -event-handler=./handler.sh ==> Starting Serf agent... ==> Starting Serf agent RPC... ==> Serf agent running! Node name: 'foo' Bind addr: '127.0.0.1:5000' RPC addr: '127.0.0.1:7373' Encrypted: false Snapshot: false Profile: lan ==> Log data will now stream in as it occurs: 2015/03/06 17:00:49 [INFO] agent: Serf agent starting 2015/03/06 17:00:49 [INFO] serf: EventMemberJoin: foo 127.0.0.1 2015/03/06 17:00:50 [INFO] agent: Received event: member-join 2015/03/06 17:00:50 [DEBUG] agent: Event 'member-join' script output: New event: member-join. Data follows... foo 127.0.0.1 |
member-joinイベントでスクリプトが実施されたのが分かります。
2.カスタムユーザーイベント
user-eventを試してみます。
別ターミナルから以下のコマンドを実行します。
1 2 |
$ serf event hello-there Event 'hello-there' dispatched! Coalescing enabled: true |
ユーザーイベントが実行されているのが分かります。
1 2 3 4 5 |
2015/03/06 17:33:21 [INFO] agent.ipc: Accepted client: 127.0.0.1:48634 2015/03/06 17:33:21 [DEBUG] agent: Requesting user event send: hello-there. Coalesced: true. Payload: "" 2015/03/06 17:33:22 [INFO] agent: Received event: user-event: hello-there 2015/03/06 17:33:22 [DEBUG] agent: Event 'user' script output: New event: user. Data follows... |
3.カスタムクエリー
カスタムクエリーを実行してみます。
イベントハンドラの結果が返ってきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ serf query test Query 'test' dispatched Ack from 'foo' Response from 'foo': New event: query. Data follows... Total Acks: 1 Total Responses: 1 2015/03/06 17:39:31 [INFO] agent.ipc: Accepted client: 127.0.0.1:48638 2015/03/06 17:39:31 [DEBUG] agent: Requesting query send: test. Payload: "" 2015/03/06 17:39:31 [INFO] agent: Received event: query: test 2015/03/06 17:39:31 [DEBUG] serf: messageQueryResponseType: foo 2015/03/06 17:39:32 [DEBUG] agent: Event 'query' script output: New event: query. Data follows... 2015/03/06 17:39:32 [DEBUG] serf: messageQueryResponseType: foo |
4.イベントハンドラの複数設定
イベントハンドラを複数設置して試してみたいと思います。
以下のコンフィグではカスタムユーザーイベント「test」で実行されるhandler.shとカスタムクエリー「load」でのみ実行されるスクリプトになります。
1 2 3 4 5 6 7 8 |
$ vim serf.conf { "role" : "test", "event_handlers" : [ "./handler.sh", "user:load=./load.sh" ] } |
load average を表示するスクリプトを作成します。
1 2 3 4 |
$ vim load.sh #!/bin/bash echo `uptime | sed -e 's/.*average: //g' -e 's/,//g'` $ chmod +x load.sh |
エージェント起動時に「-config-file」を指定して実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ serf agent -log-level=debug -node=foo -bind=127.0.0.1:5000 -rpc-addr=127.0.0.1:7373 -config-file=./serf.conf ==> Deprecation warning: 'Role' has been replaced with 'Tags' ==> Starting Serf agent... ==> Starting Serf agent RPC... ==> Serf agent running! Node name: 'foo' Bind addr: '127.0.0.1:5000' RPC addr: '127.0.0.1:7373' Encrypted: false Snapshot: false Profile: lan ==> Log data will now stream in as it occurs: 2015/03/06 18:13:06 [INFO] agent: Serf agent starting 2015/03/06 18:13:07 [INFO] serf: EventMemberJoin: foo 127.0.0.1 2015/03/06 18:13:08 [INFO] agent: Received event: member-join |
各イベントを実行してみます。
1 2 3 4 5 6 7 8 |
$ serf query load Query 'load' dispatched Ack from 'foo' Response from 'foo': 0.01 0.03 0.05 Total Acks: 1 Total Responses: 1 vagrant@vagrant-ubuntu-trusty-64:~/tmp$ serf event test Event 'test' dispatched! Coalescing enabled: true |
それぞれのイベントにあわせてスクリプトが実行されているのが分かります。
1 2 3 4 5 6 7 8 9 10 |
2015/03/06 18:13:15 [DEBUG] agent: Requesting query send: load. Payload: "" 2015/03/06 18:13:15 [INFO] agent: Received event: query: load 2015/03/06 18:13:15 [DEBUG] serf: messageQueryResponseType: foo 2015/03/06 18:13:15 [DEBUG] agent: Event 'query' script output: 0.01 0.03 0.05 2015/03/06 18:13:15 [DEBUG] serf: messageQueryResponseType: foo 2015/03/06 18:13:28 [INFO] agent.ipc: Accepted client: 127.0.0.1:48649 2015/03/06 18:13:28 [DEBUG] agent: Requesting user event send: test. Coalesced: true. Payload: "" 2015/03/06 18:13:29 [INFO] agent: Received event: user-event: test 2015/03/06 18:13:29 [DEBUG] agent: Event 'user' script output: New event: user. Data follows... |
5.暗号化
最後に暗号化を試してみます。
キーを作成してエージェント起動時に「-encrypt」で指定して実行します。
1 2 3 4 |
$ serf keygen cgFnu5Jv4sShuwAt6Jej+g== $ serf agent -encrypt cgFnu5Jv4sShuwAt6Jej+g== |
いかがでしたでしょうか?
次回もお楽しみに!!!