先ほど後回しにしていたテンプレートについて説明します。Puppetのテンプレートは設定ファイルなどで、特定の個所を動的に生成して埋め込むものです。具体的にいうと、Puppetはテンプレート機能にRubyの「ERBテンプレート」を採用していて、直接Rubyのコードを埋め込むことなどもできますが、本連載では最もよく使われる変数の埋め込みに絞って説明します。
テンプレートについて説明する前に変数について説明します。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で使える便利な変数についてお話しします。
その前に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種別、搭載メモリが表示されましたね。
それではお待ちかねのテンプレートです。ここでも最初に簡単な実験からはじめましょう。以下の内容で「/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.