/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