前回に引き続き,Puppetを実践で利用するためのテクニックについて解説します。
puppetrunの使い方
Puppetのデフォルトの動作は,puppetdが30分に1回puppetmasterdにマニフェストを取得しに行き,自分自身へマニフェストを適用します。この場合,puppetdがpuppetmasterdにアクセスするタイミングを制御することが難しいため,次のような懸念があります。
- Puppetクライアントが数百台あるいはそれ以上の規模になった場合に,Puppetサーバへのアクセスが同時間帯に集中する恐れがある
- 新しいマニフェストをとりあえず1台だけに適用してテストしてみたい,といった場合でも,全サーバに勝手に適用されてしまう恐れがある
この問題に対処するためには,puppetrunを利用してPuppetを運用する必要があります。
puppetrunはPuppet付属のコマンドラインツールで,puppetdを始動する(マニフェストの取得と適用を促す)ことによって,任意のタイミングでPuppetクライアントにマニフェストの取得と適用を行わせることができます。
puppetrunを利用するためには,事前にいくつかの設定が必要です。
事前に必要な設定
- Puppetサーバ側の設定
- Puppetサーバ側では特に設定の必要はありません。
- Puppetクライアント側の設定
- Puppetクライアント側では,puppetrunを実行してpuppetdへ接続してくるホストに対し,以下のように/etc/puppet/namespaceauth.confで,アクセスの許可/拒否を設定します。
[puppetrunner] allow server.example.org allow *.example.com deny *.example.net
puppetd/puppetmasterdの起動とpuppetrunの実行
- puppetdの起動
- Puppetクライアント側で以下のようにpuppetdを起動します。--listenオプションをつけることで,puppetrunからの接続を受け付けます。--no-clientオプションをつけることで,puppetrunから始動されない限り,puppetmasterdに接続しに行かなくなります。
$ sudo puppetd --verbose --server server.example.org --listen --no-client - puppetmasterdの起動
- Puppetサーバ側でpuppetmasterdを起動します。特別なオプションは必要ありません。
$ sudo puppetmasterd --verbose - puppetrunの実行
- Puppetサーバ側でpuppetrunを実行します。特にエラーがなければ,exit code 0と表示して終了します。
$ sudo puppetrun --host client.example.org Triggering client.example.org client.example.org finished with exit code 0 Finished
puppetrunのオプション
puppetrunの代表的なオプションは以下の通りです。
| オプション名 | 説明 | 利用例 |
|---|---|---|
| host | 始動する対象となるホスト。複数指定可。 | --host a.example.org --host b.example.org |
| all | 管理対象のホストすべてを始動します。(LDAPでノード管理している場合のみ) | --all |
| class | 特定のクラスをインクルードしているホストのみ始動します。(LDAPでノード管理している場合のみ) | --class web |
| parallel | 同時に始動するホストの数。デフォルトは1。 | --parallel 5 |
| tag | 特定のタグがついたリソースのみを適用する。 | --tag maintenance |
テンプレート
前回解説したファイルサーバ機能では,どのPuppetクライアントにも同じ内容のファイルが配布されるのに対し,テンプレート機能では,Puppetクライアントの条件に応じて,内容が異なるファイルをクライアント毎に作成することができます。
テンプレートの利用例として,各PuppetクライアントにServerNameが異なるApacheのhttpd.confを作成することを考えてみましょう。
まず,以下のようなERBテンプレートファイルを作成します。ERBについての詳細はRubyist Magazine 0020号 標準添付ライブラリ紹介【第10回】ERBをご参照ください。テンプレートファイルは,/var/puppet/templatesの下に置きます。テンプレートを置くディレクトリは,設定で変更することも可能です。
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
ServerName <%= fqdn %>:80
ERBテンプレートファイルには,<%= var %>のような形で,マニフェストで定義された変数や,Facter変数を埋め込むことができます。上の例では,ServerNameにFacter変数$fqdnをセットしています。
テンプレートファイルが用意できたら,以下のようなマニフェストを記述します。template()関数の引数には,テンプレートファイルの/var/puppet/templatesからの相対パスか絶対パスを指定します。このようにtemplate()関数を実行することにより,contentパラメータにはテンプレート処理されたファイルの内容がセットされ,この内容を持つ/etc/httpd/conf/httpd.confがPuppetクライアント上に作成されます。
file { '/etc/httpd/conf/httpd.conf':
content => template('etc/httpd/conf/httpd.conf'),
}

