Puppetサーバを集約する(複数環境対応)

はじめに

サーバ管理にpuppetを使うと、設定の管理等の点において楽できます。
一台のpuppetで複数のサービス環境に対応させる方法がわかったのでその設定方法

前提

下記についてはわかっているものとして説明

  • 既に基本的なpuppetの概念や設定がわかっていること
    • 特にpuppet.conf等の設定ファイルの記述

複数環境に対応できるのは、manifestとmodulepathのみのようです。そのためpuppet.conf等の設定ファイルはサーバに一つしか配置できません。またこの機能、本来は(production, development, test)環境に応じたmanifestを運用することを想定しているらしいです。
この機能は、個々のサービスごとのmanifestを一つのサーバで運用する方法に使うのに有効に活用できるので、下記では、そのような構成で運用する設定を載せます。

ソフトウェア

手順

サーバ(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を併用して動かすといいでしょう。