前回はマニフェストはじめの一歩と題して、
ノード(node) 
前回のマニフェスト適用例では、
実際のシステム管理の現場ではこの様なことは稀で、
node 'client.example.com' {
    file {
        '/etc/passwd':
            owner => 'root',
            group => 'root',
            mode  => 644;
    }
}
これにより、
ノード宣言されていない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;
    }
}
どのノード名にもマッチしない場合には、
また、
node base {
    file {
        '/etc/passwd':
            owner => 'root',
            group => 'root',
            mode  => 644;
    }
}
node 'client.example.com' inherits base {
}
client.
この様に、
注意点として、
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',
    }
}
このままではクラスが宣言されただけで、
node client.example.com { include 'unix' }
この例では、
クラスもノードと同様に、
class freebsd inherits unix {
    File['/etc/passwd'] { group => 'wheel' }
    File['/etc/shadow'] { group => 'wheel' }
}
freebsdクラスがunixクラスを継承し、
また、
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'] }
}
この例では、
定義済みタイプ(Defined type) 
既存のリソースタイプを組み合わせて、
define svn_repo($path) {
    exec { "/usr/bin/svnadmin create $path/$title":
        unless => "/bin/test -d $path/$title",
    }
}
この例では、
svn_repo { puppet: path => '/var/svn' }
このマニフェストが適用されると、
定義済みタイプはノードやクラスと異なり、
複数の既存リソースタイプを組み合わせて、
リソースの依存関係
マニフェストではリソース間の依存関係を宣言することができます。
before
beforeは、
package { 'ssh':
    eusure => latest,
    before => Service[ssh],
}
service { 'ssh':
    name   => sshd,
    ensure => running,
}
この例では、
require
beforeとは反対にrequireは、
package { 'ssh':
    eusure => latest,
}
service { 'ssh':
    name    => sshd,
    ensure  => running,
    require => Package[ssh] 
}
notify
notifyはリソースに変更があった場合、
package { 'ssh':
    eusure => latest,
    notify => Service[ssh]
}
file { '/etc/ssh':
    source  => puppet://server/module/ssh,
    recurse => true,
    notify  => Service[ssh]
}
service { 'ssh':
    name   => sshd,
    ensure => running,
}
この例では、
subscribe
notifyとは逆にsubscribeは、
package { 'ssh':
    eusure => latest,
}
file { '/etc/ssh':
    source  => puppet://server/module/ssh,
    recurse => true,
}
service { 'ssh':
    name      => sshd,
    ensure    => running,
    subscribe => [ Package[ssh], File['/etc/ssh'] ]
}
今回はより高度なマニフェストの宣言方法について解説しましたが、
