作業手順書はもういらない! Puppetにおける自動化の定義書「マニフェスト」の書き方と基礎文法まとめ:新人インフラ技術者のためのサーバー構築/運用自動化入門(4)(3/5 ページ)
サーバー構築の自動化で利用される技術、自動化ツールとして「Kickstart」「Puppet」を紹介し、構築から運用まで、システムライフサイクル全体にわたる運用管理の自動化についても解説する連載。今回は、自動化ツールを使う上で大切な3つのことを基に、Puppetの変数とテンプレート、条件分岐、クラス、モジュールの使い方などを解説します。
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.
関連記事
- ChefのKnifeでCloudStackを操作する方法
knife-cloudstackを用意してコマンドラインでCloudStackを操作してみよう。基本コマンドのリファレンスも紹介する - PowerShell Desired State Configuration(DSC)とは(前編)
Windows OSの設定や構成を変更する場合、GUIの管理ツールを使うのが一般的である。だが台数が多かったり、構成変更や以前の構成への復旧などが頻繁だったりするとGUIでは非常に面倒だし、間違いもしやすくなる。こんな場合はPowerShell DSCを使ってインフラ構築作業を自動化するとよい。 - JobSchedulerの機能と設定〜基礎編
本連載では運用管理の一要素である「バッチジョブ管理」に着目し、より効率よいバッチジョブ管理を実現するためのツールであるオープンソースの「JobScheduler」について解説します。 - DevOps実践に有用なZabbixの機能〜自動化機能で運用負荷削減
ますますクラウド化が進む環境において、システムにはより迅速な対応が求められるようになっています。変化の早いシステムを適切に運用していくためにはどうすればいいのでしょうか? この記事では、クラウドやDevOpsを前提としたITシステムの「運用」に求められることを整理し、そういった運用に対して、オープンソースの統合監視ツール「Zabbix」がどのように有効活用できるかを紹介します。 - 工数削減だけじゃない、自動化ツールの真のメリット
運用自動化というと「人員削減」「コストが掛かる」といったネガティブな見方をする向きも多い。だが仮想化、クラウド時代において運用自動化とはそれほど単純なものではない。国内ベンダ4社のツールに真の意義を探る。 - 運用自動化ツールは経営の武器へ
運用自動化というと「コスト削減」「効率化」といったイメージが強いが、攻めの経営を支える武器となるものでもある。後編では外資ベンダー3社の運用自動化ツールを紹介する。