連載
» 2015年01月23日 18時00分 公開

新人インフラ技術者のためのサーバー構築/運用自動化入門(4):作業手順書はもういらない! Puppetにおける自動化の定義書「マニフェスト」の書き方と基礎文法まとめ (3/5)

[菅原亮, 岡本隆史,NTT OSSセンタ]

Puppetの変数とテンプレート

 先ほど後回しにしていたテンプレートについて説明します。Puppetのテンプレートは設定ファイルなどで、特定の個所を動的に生成して埋め込むものです。具体的にいうと、Puppetはテンプレート機能にRubyの「ERBテンプレート」を採用していて、直接Rubyのコードを埋め込むことなどもできますが、本連載では最もよく使われる変数の埋め込みに絞って説明します。

Puppetの変数

 テンプレートについて説明する前に変数について説明します。Puppetでは一般的なプログラミング言語と同様に変数が使えます。ただしPuppetの変数は“一度しか代入できない”という制約がある点で一般的な言語とは大きく異なります。

それでは早速試してみましょう。以下のマニフェストを実行してみてください。

$variable = "This is a test."
notify { $variable: }

 実行すると以下のようになります(実験なのでpuppet applyコマンドから直接打ち込んでいます)。

#  puppet apply
$variable = "This is a test."
notify { $variable: }
 
[CTRL]+[D]キーを押下
 
Notice: Compiled catalog for puppet in environment production in 0.03 seconds
Notice: This is a test.
Notice: /Stage[main]/Main/Notify[This is a test.]/message: defined 'message' as 'This is a test.'
Notice: Finished catalog run in 0.02 seconds

 notifyリソースはログにメッセージを出力するものです。Puppetの変数は変数名の前に「$」を付けます。ここでは変数「$variable」に代入してから表示しています。それでは一度代入した後に変更しようとするとどうなるでしょう。

#  puppet apply
$variable = "This is a test."
$variable = "Change!"
notify { $variable: } 
 
[CTRL]+[D]キーを押下
 
Error: Cannot reassign variable variable at line 2 on node puppet
Error: Cannot reassign variable variable at line 2 on node puppet

 エラーになってしまいました。先ほど説明した通り「一度しか代入できない」制約に抵触してしまったためです。この制約は一般的な言語で数値に対してよく使われる「$variable = $variable + 1」といった表現ができないことを意味するので、注意してください。

Puppetで使える便利な変数「Facts」

 次にPuppetで使える便利な変数についてお話しします。

 その前にK男さんからの指示をもう一度思い出してみましょう。CentOSとUbuntuに対応する、サーバーのホスト名を指定する、搭載メモリによって設定を変えるなど、システムの情報を取得しないと分からないものがありました。

 Puppetでは、あらかめシステムの情報を代入してある「Facts」があります。まずはどのようなものがあるか確認してみましょう。以下のように「facter」コマンドを実行してください。

#  facter
 
architecture => x86_64
augeasversion => 0.9.0
bios_release_date => 06/22/2012
bios_vendor => Phoenix Technologies LTD
bios_version => 6.00
  : (後略)

 とてもたくさんの情報が出力されたと思います。これらの情報は全てマニフェストの中から左側の名称を変数名としてアクセスできます。例えばホスト名であれば「hostname」、OSの種類であれば「operatingsystem」、メモリサイズであれば「memorysize」「memorysize_mb」です。以下のマニフェストで実験してみましょう。

#  puppet apply
notify { $hostname: }
notify { $operatingsystem: }
notify { $memorysize: } 
 
[CTRL]+[D]キーを押下
 
Notice: Compiled catalog for puppet in environment production in 0.03 seconds
Notice: 996.57 MB
Notice: /Stage[main]/Main/Notify[996.57 MB]/message: defined 'message' as '996.57 MB'
Notice: CentOS
Notice: /Stage[main]/Main/Notify[CentOS]/message: defined 'message' as 'CentOS'
Notice: builder
Notice: /Stage[main]/Main/Notify[builder]/message: defined 'message' as 'builder'
Notice: Finished catalog run in 0.03 seconds

 ホスト名、OS種別、搭載メモリが表示されましたね。

Puppetのテンプレート

 それではお待ちかねのテンプレートです。ここでも最初に簡単な実験からはじめましょう。以下の内容で「/tmp/test.erb」を作成してください。

Hostname is <%= @hostname %>

 このテンプレートはホスト名を埋め込むものです。動的に埋め込む部分は「<%= @[変数名] %>」というタグを記述します。変数名「hostname」の前が「$」ではなく「@」であることに注意してください。Puppetのテンプレートでマニフェスト側の変数を渡す時は「@」を指定します。

 Puppet v2以前の古いバージョンでは変数名の前に何も付けませんでしたが、現在は「@」を付けることになっています。


 それでは以下のマニフェストで実験してみましょう。

#  puppet apply
file{ '/tmp/test.txt':
  ensure  => present,
  content => template('/tmp/test.erb'),
}
 
[CTRL]+[D]キーを押下
 
Notice: Compiled catalog for puppet in environment production in 0.06 seconds
Notice: /Stage[main]/Main/File[/tmp/test.txt]/ensure: created
Notice: Finished catalog run in 0.06 seconds

 「/tmp/test.txt」が作成されましたので、内容を確認してみましょう。

#  cat /tmp/test.txt
Hostname is builder

 タグの部分がFactsから取得したホスト名に変わりましたね! これでK男さんから指示があった、ServerNameディレクティブに対象サーバーのホスト名に書くことができます。

テンプレートを組み込むには

 最初にオリジナルの「httpd.conf」を「httpd.conf.erb」というファイル名で/rootにコピーしてください。コピーしたら、ServerNameディレクティブの行を以下のように書き換えます。

修正前 #ServerName www.example.com:80
修正後 ServerName <%= @hostname %>:80

 これでホスト名を記述する課題には対応できましたが、その他にK男さんからの指示にあった、OSの種類や搭載メモリによって動作を変えるにはどうすればよいのでしょうか。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。