Serf/Consulで管理を自動化! ~実践的な手法を紹介~

第8回(最終回) 定型作業を自動化するConsul Template

この記事を読むのに必要な時間:およそ 4 分

/etc/hostsを自動的に書き換えるには?

ローカル環境でサーバを立てると,ホスト名とIPアドレスの名前解決を行うためには,ローカルのDNSサーバを準備するか/etc/hostsファイルを書き換える必要があります。しかし,DNSサーバを立てると管理の手間が発生しますし,サーバが増減すると,都度DNSレコードを書き換えなくてはいけません。一方の/etc/hostsファイルの書き換えは管理は不要となりますが,やはり書き換えの手間が発生します。

/etc/hostsの管理は,Consul Templateを使うことで自動化できます。ConsulエージェントがConsulクラスタに参加した時点で,自動的にIPアドレス・ホスト名の情報を追加します。それだけでなく,Consulクラスタから離脱すると,自動的に設定を削除できます。

テンプレートファイルの用意

Consul Templateを実行する前にテンプレートとなるファイルを準備します。任意の場所でhosts-node.ctmplという名称のファイルを作成し,次の内容にします。

# consul nodes{{range nodes}}
{{.Address}}    {{.Node}}{{end}}

このように,テンプレートとはテキスト形式のファイルです。ノード名に応じて繰り返す範囲を{{range node}}{{end}}で指定します。{{.変数名}}では,ホスト名やIPアドレスを変数として扱えます。

ドライモードで動作確認

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クラスタを形成しているノード情報の一覧が表示されます。Consulサーバが1台しかない状態では,次のような表示となります。

# consul nodes
192.168.39.3    sion.pocketstudio.nnet

この状態で,ConsulクライアントをConsulクラスタにjoinさせると,自動的に画面が切り替わります。web1・web2それぞれのクライアントを起動すると,次のようにホスト名・IPアドレスが自動的に反映されます。

# consul nodes
192.168.39.3    sion.pocketstudio.net
192.168.39.11    web1
192.168.39.12    web2

またエージェントを停止したりクラスタから離脱すると,自動的に離脱したホスト情報が削除されることも確認できます。以下はweb1を停止したときの表示です。

# consul nodes
192.168.39.3    sion.pocketstudio.net
192.168.39.12    web2

このように動作確認して問題がなければ,実際に設定を反映してみましょう。一旦consul-templateはCtrl+Cで停止した後,再び起動し直します。

$ consul-template -consul 127.0.0.1:8500 \
    -template "./hosts-node.ctmpl:/etc/hosts"

 今度は-dryオプションがないため,ノードの状態変化が発生すると,都度/etc/hostsを直接書き換えられることがわかります。

サービス毎に応じてグルーピングするには?

先の例では,Consulクライアントのノードであれば,無条件にテンプレートに反映していました。Consul Templateはサービス毎にファイルを書き換えることができます。次のテンプレートを用意してみましょう。新しく{{range services}}という項目が増えています。これはサービス単位で繰り返すことを表すテンプレートの記法です。

{{range services}}# {{.Name}}{{range service .Name}}
{{.Address}}    {{.Node}}{{end}}

{{end}}

このテンプレートを使ってconsul-templateを実行すると,/etc/hostsはConsulのサービス名称毎にグループ化されて表示されますので,どのサーバが何の役割を持っているか確認する用途に使う事もできます。

# consul
192.168.39.3    consul-server

# web-server
192.168.39.11   web1
192.168.39.12   web2

著者プロフィール

前佛雅人(ぜんぶつまさひと)

クリエーションライン株式会社 Technology Evangelist

ホスティングサービスで運用保守サポートに携わった後,現職へ。サポート業務や新技術検証・開発業務を行う。趣味で監視や自動化に関するOSS検証や翻訳を行うのが好き。辛口の日本酒が大好き。

Twitter:@zembutsu