Puppetサーバを集約する(複数環境対応)
はじめに
サーバ管理にpuppetを使うと、設定の管理等の点において楽できます。
一台のpuppetで複数のサービス環境に対応させる方法がわかったのでその設定方法
前提
下記についてはわかっているものとして説明
- 既に基本的なpuppetの概念や設定がわかっていること
- 特にpuppet.conf等の設定ファイルの記述
複数環境に対応できるのは、manifestとmodulepathのみのようです。そのためpuppet.conf等の設定ファイルはサーバに一つしか配置できません。またこの機能、本来は(production, development, test)環境に応じたmanifestを運用することを想定しているらしいです。
この機能は、個々のサービスごとのmanifestを一つのサーバで運用する方法に使うのに有効に活用できるので、下記では、そのような構成で運用する設定を載せます。
ソフトウェア
- puppet v0.25.x
- CentOS v5.4
手順
サーバ(puppetmasterd)の設定
- 複数環境に対応するためのpuppet.confを用意する
# puppet.conf [main] # This is the default environment for all clients environment=infra # 1.) Defaultのenvironmentを定義(何も定義しないとproductionが割り当てられる) server = puppet pluginsync = true pluginsource = puppet://$server/plugins diff_args = -u [puppetmasterd] # specify allowed environments environments=infra,blog,iphone,board # 2.)個々のmanifest,moduleに環境名を定義 # 3.) 個々の環境ごとに使用するmanifestとmoduleを設定 # configure environments [infra] modulepath = /puppet/infra/current/idc/modules:/puppet/infra/current/ec2/modules manifest = /puppet/infra/current/manifests/site.pp [blog] modulepath = /puppet/blog/current/modules:/puppet/infra/current/idc/modules:/puppet/infra/current/ec2/modules manifest = /puppet/blog/current/manifests/site.pp [iphone] modulepath = /puppet/iphone/current/modules:/puppet/infra/current/idc/modules:/puppet/infra/current/ec2/modules manifest = /puppet/iphone/current/manifests/site.pp [board] modulepath = /puppet/board/current/modules:/puppet/infra/current/idc/modules:/puppet/infra/current/ec2/modules manifest = /puppet/board/current/manifests/site.pp
上記の通りなんですが、2.)のようにまず、puppetmasterdセクションに個々のmanifest,moduleに対して何でもいいので環境名を定義します。
3.)でその名前を付けた個々の環境で使用するmanifestとmoduleのmodulepathを定義します。
1.)は、オプションで、後で説明するClient側のpuppet.confに適用する環境が未設定の場合に適用するdefaultを定義します。これはmainセクションに定義します。
クライアント(puppetd)の設定
- puppet.confにサーバで定義した環境名を定義する
サーバのpuppet.confで定義した環境名のうち、適用したいmanifestが配置されている環境を一つ記述します
ちなみに、サーバでdefaultの環境(mainセクションのenvironmentで定義した環境)が設定されている場合、クライアントに適用されるDefaultのmanifestはその環境のmanifestとなります。逆にサーバでdefaultの環境が定義されていない場合、エラーが発生します。
# puppet.conf
[puppetd]
environment = blog
おわりに
複数のmanifestを管理していて別々のサーバと立てている場合、これで一つのサーバに集約することができると思います。しかし、puppetで管理するノードが多い場合、パフォーマンスの悪化という別の問題が発生するため、その場合passengerを併用して動かすといいでしょう。