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

第5回 マニフェスト応用編(その2)

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

条件指定

セレクタ

セレクタは条件によって変数の値を変える場合に利用します。以下の例では,Facter変数$operatingsystemがFreeBSDの場合,変数$sudoにはsecurity/sudoが割り当てられ,その他の場合には$sudoにはsudoが割り当てられます。

$sudo = $operatingsystem ? {
    freebsd => 'security/sudo',
    default => 'sudo',
}

package { "$sudo": ensure => latest }

case

セレクタは条件によって変数の値を変えるために利用しますが,caseは条件によって宣言するリソースを変えたり,実行する関数を変えたりする場合に利用します。

以下の例では,OpenBSDではデフォルトでsudoが入っているため特になにもせず,その他のOSの場合にはpackageリソースを宣言して,sudoパッケージをインストールします。

case $operatingsystem {
    openbsd: {}
    default: {
        package { 'sudo':
            ensure => present
        }
    }
}

以下の例では,OS毎にincludeするクラスを変更しています。

case $operatingsystem {
    sunos:   { include 'solaris' }
    redhat:  { include 'redhat'  }
    default: { include 'generic' }
}

if/else

if/elseでは,単純なブール値での真偽判断のみが可能です。以下の例では,$booleanが真の場合には/some/fileが存在するというリソースの状態を宣言し,偽の場合には/some/other/fileが存在するというリソースの状態を宣言します。

if $boolean {
    file { '/some/file': ensure => present }
} else {
    file { '/some/other/file': ensure => present }
}

関数

Puppetは多くの組み込み関数をサポートしています。関数にはstatementタイプとrvalueタイプの2種類があります。 statementタイプの関数は独立して実行するもので,返り値はありません。以下のnotice関数はstatementタイプであり,引数で指定された文字列をログやコンソールに出力します。

notice('Something weird is going on')

以下のように関数はカッコなしても実行できます。

notice 'Something weird is going on'

template関数はrvalueタイプであり,テンプレートmytemplate.erbを評価した結果を返します。そのため,ファイル/my/fileの内容が,テンプレートmytemplate.erbの評価結果で置き換えられます。

file { '/my/file': content => template('mytemplate.erb') }

Puppetで利用可能な関数については,Puppet本家WikiのFunction Referenceをご参照ください。

クォート

マニフェストでは,英数字と-⁠ハイフン)のみで構成され,英数字ではじまる文字列は,クォートしなくても文字列として扱われますが,必ずクォートすることが推奨されています。

シングルクォートされた文字列は変数展開されませんので,以下の例では,変数$valueの値は$oneという文字列になります。

$value = '$one'

ダブルクォートされた文字列は変数展開されますので,変数$valueには変数$oneの値が割り当てられます。

$value = "$one"

変数に使われている文字列と他の文字列を明確に区別したい場合には,以下のように記述します。

$value = "${one}two"

予約語

true,false,define,inherits,classといった文字列は予約語であるため,文字列として利用する場合には,必ずクォートすることが推奨されます。

コメント

マニフェストではshスタイルのコメントをサポートしており,#以降の文字列はコメントとみなされます。

# OS毎にsudoのパッケージ名を変更する
$sudo = $operatingsystem ? {
    freebsd => 'security/sudo',
    default => 'sudo',
}

マニフェストのインポート

以下のように,importキーワードにより他のマニフェストをインポートすることができます。インポート対象のファイル名はワイルドカードで指定することもできます。

import 'other.pp'
import 'classes/*'
import 'packages/[a-z]*'

まとめ

マニフェストについての解説は今回で終了です。これでマニフェストについての必要な知識は一通り得られたことと思います。次回からは,より実践的なPuppetの利用方法について解説していきたいと思います。

参考URL

著者プロフィール

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

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

URLhttp://mizzy.org/