今まで我が家のサーバー管理自動化ツール Puppet で各ノードの設定ファイルであるマニフェストを配信する方法は、Puppet クライアント (puppetd) が好き勝手なタイミング (30分間隔) で Puppet サーバー (puppetmasterd) から取得するデフォルト方式だった。この方式の問題点は、管理ノード数が増えて来ると、各 Puppet クライアントの起動タイミングによっては Puppet サーバーへのアクセスが集中してしまうことだ。

Puppet サーバーは負荷が軽いわけではなく、我が家のささやかなスペックの仮想マシン (以下 VM) にとっては、意外と苦しい。しかも Puppet 経由で配信する設定やファイルの変更はそれほど緊急性が高くないことが多いので、全 Puppet クライアントが 30分おきに Puppet サーバーを見に来るのは、ハッキリ言って少々うるさい。Puppet サーバーの気持ちを代弁するなら、「そんなにしょっちゅう見に来ても、さっきと変わってねーよ」 と言ったところだろう。

そこで Puppet サーバーの負荷分散のため、マニフェストの配信を Puppet サーバーが Puppet クライアントに対して 「取りに来い」 と促す、puppetrun コマンド経由に切り替えた。Puppet クライアントが Puppet サーバーに勝手なアクセスをしないようにし、Puppet サーバー上で各ノードに対して 1台ずつ順番にマニフェストの参照をキックするスクリプトを任意のタイミングで走らせれば、アクセスを均等に散らすことができる。

切り替え手順は以下の通り (Puppet サーバー及びクライアントのバージョンは 0.22.4)。

  1. Puppet クライアントに起動オプションを追加。
  2. Puppet サーバー及びクライアントに namespaceauth.conf を用意。
  3. ファイア・ウォールで puppetrun 用ポートを開放。

完全 puppetrun 化に必要な Puppet クライアントの起動オプションは "--listen" と "--no-client" で、それぞれ puppetrun コマンドによるリクエスト待ち受けと、Puppet サーバーへの勝手なアクセス抑制を制御する。オプションの与え方はいろいろあるが、例えば CentOS なら、puppetrun 化する Puppet クライアントの /etc/sysconfig/puppet に次の行を追記または編集すれば OK。

# vi /etc/sysconfig/puppet
PUPPET_EXTRA_OPTS="--listen --no-client"

namespaceauth.conf は puppetrun 化で必須になるファイルで、ここここが参考になる。

最後に、ファイア・ウォールが有効になっていれば Puppet サーバーから Puppet クライアントへの INPUT (Puppet クライアントはデフォルトで TCP/8139 を listen する) を許可し、Puppet クライアントを再起動すれば完了。Puppet サーバーで次のコマンドを実行すると、任意のノードに対してマニフェストの取得を指示できる。

# puppetrun --host <NODE>

Ruby の LDAP ライブラリが組み込まれていない環境では

Failed to load ruby LDAP library. LDAP functionality will not be available
Triggering hoge.example.com
hoge.example.com finished with exit code 0
Finished

のように一見コマンドが失敗したかのようなメッセージが表示されるが、LDAP でノードを管理していない環境なら、気にする必要はない。

尚、全ノードを一斉にキックする "puppetrun --all" はノード管理を LDAP 化していないと使えないようだが、非 LDAP 環境でも、「マニフェスト取得促しスクリプト」 次第でどうとでもできる。僕は 「1.基本クラス (共通リソース)」 → 「2.OS 共通クラス (OS 共通及びディストリビューションごとに異なるリソース)」 → 「3.各ノード専用クラス」 とクラスを継承させ、各ノードは各自専用の "3." をインクルードする方法でマニフェストを管理しているので、puppetrun 化したノードとそうでないノードは、"3." のファイル名の付け方で区別している。

ただ Windows/Linux アカウントやメールアドレス等の管理で OpenLDAP の下地は既にあるので、気が向いたら (&精神的に余裕のあるときに) Puppet も LDAP 化してみたいところだ。

さて、実はこの puppetrun 化によって、それまで隠れていた問題が顕在化することになったのだが、この話題は別エントリーで。

Comments are closed.