前回はマニフェストはじめの一歩と題して,マニフェストの基礎であるリソースの宣言方法について解説しました。今回は更に高度なマニフェストの宣言方法について解説します。
ノード(node)
前回のマニフェスト適用例では,マニフェストをすべてのPuppetクライアントに適用するために,puppetmasterd起動時に--nonodesオプションを指定していました。
実際のシステム管理の現場ではこの様なことは稀で,システムの役割によって適用すべきマニフェストは異なります。特定のPuppetクライアントにのみマニフェストを適用するには,次の様に宣言します。
node 'client.example.com' {
file {
'/etc/passwd':
owner => 'root',
group => 'root',
mode => 644;
}
}
これにより,client.example.comにのみ,このマニフェストが適用され,他のPuppetクライアントには適用されません(puppetmasterd起動時には,--nonodesオプションを外す必要があります)。
ノード宣言されていないPuppetクライアントでpuppetdを実行すると,以下の様なエラーが表示されます。
err: Could not retrieve configuration: Could not find client.example.com with names client.example.com, client
ノード名に英数字と-(ハイフン)以外の文字が含まれる場合には,クォートする必要があります。
複数のノードを宣言することももちろん可能です。
node 'mail.example.com' {
file {
'/etc/passwd':
owner => 'root',
group => 'root',
mode => 644;
}
}
node 'www.example.com' {
file {
'/etc/passwd':
owner => 'root',
group => 'root',
mode => 644;
}
}
node default {
file {
'/etc/passwd':
owner => 'root',
group => 'root',
mode => 644;
}
}
どのノード名にもマッチしない場合には,defaultノードで宣言されているマニフェストが適用されます。
また,ノードは継承することもできます。
node base {
file {
'/etc/passwd':
owner => 'root',
group => 'root',
mode => 644;
}
}
node 'client.example.com' inherits base {
}
client.example.comには直接マニフェストが宣言されていませんが,baseノードを継承しているので,baseノードで宣言されたマニフェストが適用されます。
この様に,継承を利用することにより,同じ内容のマニフェストを何度も宣言する必要がなくなり,マニフェストを簡略化できます。
注意点として,現在の安定版であるバージョン0.22.4では,継承元のノード名(上の例ではbase)を以下の様にクォートすると,puppetmasterd起動時にSyntax errorが出てしまいます。
node 'client.example.com' inherits 'base' {
}
おそらくバグだと思われますが,ノードの継承を行う場合にはご注意ください。
クラス(Class)
クラスにより複数のリソースをひとまとめにすることができます。クラスは以下の様に宣言します。
class unix {
file { '/etc/passwd':
owner => 'root',
group => 'root',
mode => 644;
}
file { '/etc/shadow':
owner => 'root',
group => 'root',
mode => 440;
}
exec { 'blah':
path => '/usr/bin',
cwd => '/tmp',
}
}
このままではクラスが宣言されただけで,マニフェストの内容は適用されません。適用するにはinclude関数を実行します。
node client.example.com { include 'unix' }
この例では,client.example.comノードに,unixクラスのマニフェストが適用されます。
クラスもノードと同様に,継承することが可能です。
class freebsd inherits unix {
File['/etc/passwd'] { group => 'wheel' }
File['/etc/shadow'] { group => 'wheel' }
}
freebsdクラスがunixクラスを継承し,unixクラスで宣言されたリソースのgroupパラメータを上書きしています。既に宣言されているリソースは上の例の様に『Type['Resource Name']』で参照することができます。
また,リソースのパラメータは上書きだけではなく,+>オペレータにより追加することも可能です。
class apache {
service { 'apache': require => Package['httpd'] }
}
class apache-ssl inherits apache {
# host certificate is required for SSL to function
Service[apache] { require +> File['apache.pem'] }
}
この例では,apacheクラスで宣言されているapacheサービスリソースは,httpdパッケージを必要としていますが,apacheクラスを継承したapache-sslクラスでは,httpdパッケージにプラスして,apache.pemファイルも必要としている,ということになります。

