Installation Guide を読めば、とりあえず puppet を動かすことはできるけど、やりたいことをやろうと思ってもすぐにできるわけでもない。というわけで、ドキュメントをちゃんと読んでみることにした。
まずは puppet の設定ファイルで使われている内部言語の理解から、ということで、Language Structures を超意訳してみる。
puppet 設定の基本構成単位。管理されるコンピュータ上のオブジェクト(ファイルとかパッケージとか)を表すもので、あらかじめ用意されたビルトインタイプ以外にも、自ら定義することも可能。
file { "/etc/passwd": owner => root, mode => 644 }
package { apache: install => true }
詳しくは Type Reference を参照。
変数が利用できる。
$variable = value
$x = foo $y = bar $z = "$x$y"
設定ファイルに、別の設定ファイルをインポートできる。
import "filename"
正規表現も利用可能。
import "classes/*" import "packages/[a-z]*"
{ } によってスコープが形成される。
変数は一度割り当てられると、同一スコープ内では変更できないが、サブスコープ内では同一名の変数を割り当てることができる。
$var = value
# override $var
define testing {
$var = othervalue
}
ここでいう Components とは、自分で定義する Type のことっぽい。Components の定義と利用は以下の様な感じ。
define svnserve($source, $path, $user = false, $password = false) {
file { $path:
create => directory,
owner => root,
group => root
}
$svncmd = $user ? {
false => "/usr/bin/svn co --non-interactive $source/$name .",
default => "/usr/bin/svn co --non-interactive --username $user --password '$password' $source/$name ."
}
exec { $svncmd:
cwd => $path,
require => file[$path],
creates => "$path/.svn"
}
}
svnserve { dist:
source => "https://reductivelabs.com/svn",
path => "/dist",
user => "puppet",
password => "password"
}
svnserve { "dist/config/apps/puppet":
source => "https://reductivelabs.com/svn",
path => "/etc/puppet",
user => "puppet",
password => "password"
}
利用する時はビルトインタイプと構文上の違いはない。
Class を定義してインクルードすることができる。
class[inherits ] { ... }
継承も可能。
# really simple example
class solaris {
file {
"/etc/passwd": owner => root, group => root, mode => 644;
"/etc/shadow": owner => root, group => root, mode => 440
}
}
class solworkstation inherits solaris {
file {
"/etc/sudoers": owner => root, group => root, mode => 440;
"/bin/sudo": owner => root, group => root, mode => 4111
}
}
include solworkstation
以下の例だと、$operatingsystem の値と同名の Class と、$hostname に応じた Class がインクルードされる。
include $operatingsystem, $hostname ? {
myhost => classA, default => classB
}
$operatingsystem とか $hostname とかは、Facterというライブラリを使ってプリセットされているみたい。
Classes と Components の違いは以下の通り。
あと、Classes は引数を受け取れない、という違いもある。
Class は継承ができる。
class unix {
file { "/etc/sudoers":
owner => root,
group => root,
mode => 440
}
}
class bsd inherits unix {
File["/etc/sudoers"] {
group => wheel
}
}
puppet サーバで設定された Class 名が、puppet クライアントの /etc/puppet/classes.txt に保存されるので、それを外部プログラムなどから読み込んで利用したりできるよ、とうことらしい。
FC4 で yum insall した puppet の場合は、/var/lib/puppet/classes.txt に保存されていた。
node{ ... }
特定のホストに適用する設定を割り当てる。
以下の例だと、file type はすべてのホストに割り当てられるけど、webserver class と dbserver class の中に書かれた設定は、それぞれ特定のホストにのみ割り当てられる。
class webserver { ... }
class dbserver { ... }
file { "/etc/sudoers": mode => 440 } # apply to everyone
node host1, host2 {
include webserver
}
node host3, host4 {
include dbserver
}
node は継承することも可能。
node base {
include $operatingsystem
}
node kirby inherits base {
include webserver
}
FQDN で指定する時は、シングルクォートで囲む。
node 'host.domain.com' {
...
}
条件指定が可能。
以下の例は $os が何かによって、 $owner に入る値が変わる。
define testing(os) {
$owner = $os ? {
sunos => adm,
redhat => bin,
default => root
}
file { "/some/file": owner => $owner }
}
以下の例は $operatingsystem が何かによって、適用する class が変わる。
case $operatingsystem {
sunos: { solaris {} } # apply the solaris class
redhat: { redhat {} } # apply the redhat class
default: { generic {} } # apply the generic class
}
true, define, inherits, class は予約語。
sh スタイルのコメントが利用可。