オープンソースなシステム自動管理ツール Puppet

第4回 マニフェスト応用編(その1)

この記事を読むのに必要な時間:およそ 3 分

前回はマニフェストはじめの一歩と題して,マニフェストの基礎であるリソースの宣言方法について解説しました。今回は更に高度なマニフェストの宣言方法について解説します。

ノード(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ファイルも必要としている,ということになります。

著者プロフィール

宮下剛輔(みやしたごうすけ)

(株)paperboy&co.技術責任者。 社内ではサーバ周りからアプリケーション開発まで幅広く関わる一方,個人的にはPerlプログラミングを趣味として,サーバ管理用ユニットテストスイート Assurer(アシュラ)をオープンソースで公開したり,CPAN AuthorPlaggerコミッタとして活動している。また,YAPC::Asia 2007 Tokyo等の技術系カンファレンスでスピーカを務めるのも最近の楽しみのひとつ。共著書に『MASHUP++』がある。

URLhttp://mizzy.org/

コメント

コメントの記入