Consul Template
これまでの連載の応用として、
自動実行は、
この設定ファイルの自動書き換えに特化したプログラムがConsul Templateです。その名前の通り、
Consul Templateを活用する事で、
これは運用担当者にとっては非常に有用な機能です。クラウドのように、
動作原理
Consul Templateはデーモンとしてサーバに常駐し、
Consul TemplateはConsulの持つHTTPインターフェースを経由して、
このとき、
![図1 Consul TemplateとConsulクラスタの関係 図1 Consul TemplateとConsulクラスタの関係](/assets/images/admin/feature/01/serf-consul/0008/thumb/TH800_001.jpg)
Consul Templateの利点
Consul Templateの利点の一つは、
また、
セットアップ方法
consul-templateデーモン
Consul Templateはバイナリやパッケージが提供されていません。そのため、
$ sudo yum -y install git golang $ export GOPATH=/usr/local/src/go $ git clone https://github.com/hashicorp/consul-template.git $ cd consul-templae $ make $ sudo cp ./bin/consul-template /usr/bin/consul-template $ consul-template --version consul-template v0.7.1.dev
Consul環境のセットアップ
Consul Templateを動かす前提として、
ここでは例として、
![図2 consul-templateをサーバ上に設定する構成 図2 consul-templateをサーバ上に設定する構成](/assets/images/admin/feature/01/serf-consul/0008/thumb/TH800_002.jpg)
Consulサーバでは、
$ consul agent -server -bootstrap-expect=1 -data-dir=/opt/consul/data -bind=192.168.39.3
Consulノードも同様に起動します。このとき-node
で何らかのノード名称を指定しておきます。
$ consul agent -node=web1 -bind=192.168.39.11 -data-dir=/opt/consul/data -join=192.168.39.3
/etc/hostsを自動的に書き換えるには?
ローカル環境でサーバを立てると、/etc/
ファイルを書き換える必要があります。しかし、/etc/
ファイルの書き換えは管理は不要となりますが、
/etc/
の管理は、
テンプレートファイルの用意
Consul Templateを実行する前にテンプレートとなるファイルを準備します。任意の場所でhosts-node.
という名称のファイルを作成し、
# consul nodes{{range nodes}}
{{.Address}} {{.Node}}{{end}}
このように、{{range node}}
~{{end}}
で指定します。{{.変数名}}
では、
ドライモードで動作確認
Consul Template起動時の書式は次の通りです。-consul
で参照先のConsulサーバを指定します。-template
オプションで、
$ consul-template -consul <ConsulサーバのIPアドレス>:<HTTPインターフェース> \ -template "テンプレート元のファイル名:出力先ファイル名:コマンド(オプション)" \ -template "同上" (オプション) \ -dry (オプション)
-dry
オプションを使うと、
$ consul-template -consul 127.0.0.1:8500 \ -template "./hosts-node.ctmpl:/etc/hosts" \ -dry
起動すると、
# consul nodes 192.168.39.3 sion.pocketstudio.nnet
この状態で、
# consul nodes 192.168.39.3 sion.pocketstudio.net 192.168.39.11 web1 192.168.39.12 web2
またエージェントを停止したりクラスタから離脱すると、
# consul nodes 192.168.39.3 sion.pocketstudio.net 192.168.39.12 web2
このように動作確認して問題がなければ、Ctrl+C
で停止した後、
$ consul-template -consul 127.0.0.1:8500 \ -template "./hosts-node.ctmpl:/etc/hosts"
今度は-dry
オプションがないため、/etc/
を直接書き換えられることがわかります。
サービス毎に応じてグルーピングするには?
先の例では、{{range services}}
という項目が増えています。これはサービス単位で繰り返すことを表すテンプレートの記法です。
{{range services}}# {{.Name}}{{range service .Name}}
{{.Address}} {{.Node}}{{end}}
{{end}}
このテンプレートを使ってconsul-templateを実行すると、/etc/
はConsulのサービス名称毎にグループ化されて表示されますので、
# consul 192.168.39.3 consul-server # web-server 192.168.39.11 web1 192.168.39.12 web2
Webサーバへの応用例
Consulはエージェントの参加・
Nginxを使ってproxyを使う場合であれば、proxy.
のようなテンプレートファイルを用意します。新しくservice "web"
という項目が増えています。これは、web
という名称のサービスが存在する場合のみ、
upstream frontend { {{range service "web"}}
server {{.Address}}:{{.Port}};{{end}}
}
server {
listen 80 default_server;
location / {
proxy_pass http://frontend;
}
}
各々のConsulクライアントでは、web
という名称のサービスが正常に稼働していると定義するものです。
{
"service": {
"name": "web",
"tags": [ "nginx" ],
"port": 80,
"check": {
"script": "curl http://127.0.0.1:80/ >/dev/null 2>&1",
"interval": "15s",
"timeout": "5s"
}
}
}
Consul Templateでは、
$ consul-template \ -consul 127.0.0.1:8500 \ -template "/opt/consul-template/nginx.conf:/etc/nginx/conf.d/proxy.conf:service nginx restart" \ -retry 30s
これで、
今回のまとめ
Consul単体でのオーケストレーション機能を使うには、
連載のまとめ
一連の連載を通して、
自動化や効率化にあたって、