前回に引き続き,Puppetを実践で利用するためのテクニックについて解説します。
データファイルの階層構造
Puppet本家WikiのPuppet Best Practiceでは,データファイル(マニフェスト,モジュール,テンプレート,配布用ファイル等)を管理しやすい階層構造の例が説明されています。筆者が勤める(株)paperboy&co.では,この例をベースにして以下のような階層構造でデータファイルを管理しています。
(株)paperboy&co.におけるデータファイルの階層構造

distディレクトリには,Puppetクライアントへ配布するファイルを置きますが,直接ファイルを置かずに,更にクラスごとのディレクトリを作成し,その下に配布用のファイルを置きます。dist/{classname}以下は,Puppetクライアント上にファイルを置く時のパスと同じ構造にします。例えば,baseクラスのノードに/etc/hostsファイルを配布する場合は,dist/base/etc/hostsといった構造になります。
manifestsディレクトリにはマニフェストを置きます。site.ppにはインポートするマニフェストを列挙します。また,manifestsディレクトリの下にはクラスごとにディレクトリを作成し,その下に目的別のマニフェストファイルを置きます。例えば,単純にパッケージの追加/削除を行うためのpackage.pp,Apache関連のリソースをひとまとめにしたapache.pp,といった形になります。
templatesディレクトリ以下にはクラスごとにディレクトリを作成してテンプレートファイルを置きます。templates/{classname}以下の構造はdist/{classname}以下と同様です。
modulesディレクトリにはモジュールを置きます。
マニフェストのコーディングスタイル
Puppet本家WikiのStyle Guideでは,推奨されるマニフェストのコーディングスタイルについて説明されていますが,これに筆者独自の推奨スタイルを併せた形でご紹介します。
矢印(=>)の配置
矢印の配置は,一番長いパラメータに合わせて揃えます。
exec {
'blah':
path => '/usr/bin',
cwd => '/tmp';
'test':
subscribe => '/etc/test',
refreshonly => true;
}
ただし,配置はリソースごとに揃えることが推奨ですので,以下は推奨されない配置例です。
exec {
'blah':
path => 'usr/bin',
cwd => '/tmp';
'test':
subscribe => '/etc/test',
refreshonly => true;
}
クォート
予約語や,パラメータで予め決められている選択肢(ensureパラメータのpresent, absentなど)はクォートしません。これら以外の文字列はクォートしますが,変数展開しない場合にはシングルクォートで,変数展開する場合にはダブルクォートでクォートします。リソース名もクォートします。
file { '/tmp/somefile':
ensure => present,
owner => 'root',
group => "$group",
}
カンマ
最後のパラメータ行もカンマで終えるようにします。こうしておくと,行を入れ替える時に,単純にカット&ペーストするだけで済みます。
file { "/tmp/somefile":
ensure => exists,
owner => 'root',
}
リソースの宣言
パラメータがひとつしかないリソースは,1行で宣言します。
file { '/tmp/somefile': ensure => exists }
同じタイプのリソースを複数宣言する場合は,ひとつのブロック内に複数のリソースを宣言します。各リソースは;(セミコロン)で区切られます。この場合には,「最後のパラメータ行もカンマで終える」「パラメータがひとつしかないリソースは1行で宣言する」という原則は適用されません。
file {
'/tmp/app':
ensure => directory;
'/tmp/app/file':
ensure => exists,
owner => 'webapp';
'/tmp/app/file2':
ensure => exists,
owner => 'webapp',
mode => 755;
}
シンボリックリンク
シンボリックリンクは以下のように宣言できますが、これは推奨されない例です。
file { '/var/log/syslog':
ensure => '/var/log/messages',
}
シンボリックリンクであることを明確にするために,以下のスタイルが推奨されます。
file { '/var/log/syslog':
ensure => link,
target => '/var/log/messages',
}

