【Serf】ダイナミック tag をリモートから変更する方法

【Serf】ダイナミック tag をリモートから変更する方法 はてなブックマーク - 【Serf】ダイナミック tag をリモートから変更する方法


自分用(._.) φ メモメモ

■ダイナミック・タグ機能とは

Serf は v.0.4.0 以降、タグ機能が使えるようになりました。各々のノード上で、任意の「key」と「value」の情報を保持します。タグは複数設定することができます。

なにより、この機能はダイナミックタグと呼ばれています。その名前の通り、随時タグの情報を追加・変更・削除することが出来ます。これは、古いバージョンの「role」機能に相当しますが、変更する時は serf エージェントの再起動が必要でした。ダイナミックタグでは、その必要がありません。

また、タグを変更するとイベントハンドラ「member-update」も発効します。このタイミングに合わせて、任意のコマンドや処理を行う事も可能です。

そんなタグですが、リモート上にある Serf エージェントのタグを変えたいときは一手間が必要です。以下は、その手順を簡単に整理しました。

■通常のタグ登録と削除

自分自身のタグを変更するには、対象サーバの中で ‘serf tags’ コマンドを実行します。新しくタグを登録するときは ‘-set’ オプションを指定し、’key=value’ の形式で記述します。

$ serf tags -set role=develop
Successfully updated agent tag

タグの状況を見たいときは、’serf members’ で確認できます。

$ serf members
miku3  192.168.39.11:7946  alive  role=develop

登録したタグを削除するには、’-delete’ オプションを用い、’key’ にあたるものを指定します。

$ serf tags -delete role
Successfully updated agent tags

■リモートのタグを変更するには

前提条件として、serf エージェント起動時に RPC で使用する IP アドレスとポート番号を明示する必要があります。未指定(デフォルト)は、’127.0.0.1:7373′ のため、リモートからのタグ変更は受け付けません。

RPC アドレスの指定は ‘-rpc-addr=’ オプションを指定します。例えば、ネットワーク側の IP アドレスが ‘192.168.39.11’ で、ポート番号 ‘7373’ の場合は(ポート番号も明示が必要)、

$ serf agent -rpc-addr=192.168.39.11:7373

上記のように指定します。

あるいは、JSON 設定ファイル上で、以下の様にします。

  "rpc_addr": "192.168.39.11:7373",
  "rpc_auth": "test",

※設定ファイルの場合のみ “rpc_auth” オプションで認証用トークンを指定することが出来ます。rpc_addr の指定だけでは、アクセス可能なネットワーク上にポートが晒されてしまうので、iptables 等で制限をかけないと、だれでもポートに接続できます。それを防ぐため、トークンを指定することが可能です。実運用では、このように rpc_auth を指定することが望ましいでしょう。

$ serf tags -set role=web -rpc-addr=192.168.39.11:7373 -rpc-auth="test"
Successfully updated agent tags

注意点としては、’serf members’ など、一般的なコマンドを実行するときも RPC アドレスと、token 指定している場合はトークンの指定が必要です。

$ serf members -rpc-addr=192.168.39.11:7373 -rpc-auth="test"

逆に考えると、serf のコマンドを実行するときは、対象サーバにログインする必要が無いとも言えます。上記のように、’serf members’ 等のコマンドは、’serf agent’ が稼働していないサーバでも実行できるのが大きな特長です。

■まとめ

このように、リモートからも動的にタグを変更する事ができます。タグ変更時にもスクリプトを実行したり、対象サーバにログインしなくてもタグが変更出来るので、色々使い勝手があるのではないでしょうか。

■おまけ:タグを変更するという別解

当初、リモートで制御出来る事を知らなかった私めは、タグをリモートで変更するためのイベントハンドラとスクリプトを書いていました。。

$ serf agent -event-handler=user:settag=/opt/serf/changetag.pl

エージェント起動時、ユーザイベント「settag」を定義しておきます。これを、serf agent が起動する全サーバにスクリプトを置き、かつ、イベントハンドラの定義を行います。

タグを指定・削除したいときは、次のようにユーザイベント発行します。

$ serf event settag nodename::set::key::value
$ serf event settag nodename::delete::key

‘nodename’ にあたるホスト名に一致する ‘set’ か ‘delete’ に応じてキーの追加と削除を行います。スクリプトは Gist に晒していますので、興味がありましたらどうぞ。

■参考

$ serf tags –help
$ serf members –help