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

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

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

定義済みタイプ(Defined type)

既存のリソースタイプを組み合わせて,新たなリソースタイプを定義することができます。

define svn_repo($path) {
    exec { "/usr/bin/svnadmin create $path/$title":
        unless => "/bin/test -d $path/$title",
    }
}

この例では,svnadmin createを実行するsvn_repoというリソースタイプを新たに定義しています。svn_repoタイプのリソースを宣言してシステムに適用にするには,以下の様に記述します。

svn_repo { puppet: path => '/var/svn' }

このマニフェストが適用されると,/var/svn/pupptが存在しなければ,svnadmin create /var/svn/puppetが実行されます。

定義済みタイプはノードやクラスと異なり,継承はできません。

複数の既存リソースタイプを組み合わせて,もっと複雑な定義済みタイプを定義することもできます。例として,Puppet本家WikiのAutoFS Recipeをご参照ください。

リソースの依存関係

マニフェストではリソース間の依存関係を宣言することができます。

before

beforeは,あるリソースが指定されたリソースよりも前に適用されることを宣言します。

package { 'ssh':
    eusure => latest,
    before => Service[ssh],
}

service { 'ssh':
    name   => sshd,
    ensure => running,
}

この例では,sshサービスが起動される前に,sshパッケージがインストールされている必要があることを宣言しています。sshパッケージがインストールされていなければ,sshサービスは起動されません。

require

beforeとは反対にrequireは,あるリソースが指定されたリソースよりも後に適用されることを宣言します。beforeの例と同じ結果となるマニフェストを,requireを用いて書き直すと以下の様になります。

package { 'ssh':
    eusure => latest,
}

service { 'ssh':
    name    => sshd,
    ensure  => running,
    require => Package[ssh] 
}

notify

notifyはリソースに変更があった場合,指定されたリソースに対してイベント通知します。イベント通知を受けたリソースでは,リソースタイプに応じたアクションが実行されます。例えば,リソースタイプがserviceであれば,サービスが再起動されますし,execであればコマンドが実行されます。

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,
}

この例では,sshパッケージが更新された場合,または/etc/ssh以下のファイルに変更があった場合に,sshサービスが再起動されます。

subscribe

notifyとは逆に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'] ]
}

今回はより高度なマニフェストの宣言方法について解説しましたが,マニフェストについて覚えるべきことはもう少しありますので,更に次回に続きます。

参考URL

著者プロフィール

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

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

URLhttp://mizzy.org/