Puppet言語には「クラス(class)」があります。オブジェクト指向言語を使ったことがある方ならピンと来たことでしょう。Puppet言語のそれは、一般的な言語のクラスと概念は似ているところもありますが別物です。とは言っても、基本的な使い方は難しくありません。クラスの基本記法は以下のようになります。
class (クラス名) {
:
(マニフェストなど)
:
}
さらにクラスは付随するファイルなどのデータをひとまとめにして「モジュール」にできます。先ほどテンプレートの実験をしたときはローカルファイルとして配置していました。これではテンプレートを使うときはあらかじめ配布する必要があって面倒です。モジュールを使うとテンプレートをmaseter側から配布できるようになり、とても便利になります。
それではクラス名を「http_server」として、先ほどのマニフェストをモジュールにしてみましょう。最初にモジュールを配置する“入れ物”を準備します。「/etc/puppet/modules」配下にモジュール名のディレクトリを作成し、さらに「manifests」「files」「tenmplates」ディレクトリを作成します。作成後は以下のようなツリー構造になります。
/etc/puppet/modules/http_server/ +-- manifests +-- files +-- templates
manifestsディレクトリにはマニフェストファイルを配置します。モジュールは最初init.ppを実行しますので、メインのコードはこのファイルの中に収めます。templatesディレクトリには先ほど作成したようなerbテンプレートを配置します。filesディレクトリは今回使いませんが、fileリソースで取得するファイルを配置できます。
それでは作成したディレクトリの中に先ほど作成したテンプレートファイルをコピーします。
次にinit.ppの中身ですが、先ほど作成したマニフェストをクラスの基本記法に収めたものになります。基本は「class http_server{ 〜 }」の間にマニフェストを収めるだけです。fileリソースのtemplate関数のところだけ修正していますが、これについては後述しますので、そのままコピーして保存してください。
class http_server { if $memorysize_mb >= 8192 { $keepalive = 500 } else { $keepalive = 100 } case $operatingsystem { centos: { $httpd = "httpd" $conf = "/etc/httpd/conf/httpd.conf" $template = "httpd.conf_centos.erb" } ubuntu: { $httpd = "apache2" $conf = "/etc/apache2/apache2.conf" $template = "httpd.conf_ubuntu.erb" } default: { fail("unknown operatingsystem") } } package { $httpd: ensure => present, } file { $conf: ensure => present, content => template("http_server/$template"), require => Package[$httpd], } service { $httpd: ensure => running, enable => true, subscribe => File[$conf], } }
ここまでの作業でツリーの構造が以下のようになれば完成です。
/etc/puppet/modules/http_server/ |-- manifests | +-- init.pp +-- files +-- templates +-- httpd.conf_centos.erb +-- httpd.conf_ubuntu.erb
最後に「site.pp(/etc/puppet/manifests/site.pp)」ファイルを作成しましょう。ホスト名を「www01」とした場合、クラスやモジュールを呼び出すには以下のように記述します。
node www01 { include http_server }
「include (モジュール名)」が今回作成したモジュールを呼び出している部分です。これなら1行で済みますし、サーバー増設のときもnodeブロックを同様に追加していくだけですので、ラクラク対応できますね。
また、クラスやモジュールの呼び出しは以下のようにも記述できます。
node www01 { class {'http_server': } }
この記述ではクラスにパラメーターを渡すこともできます。
なお本連載では、分かりやすさを重視していますので、クラスやモジュールで他にできること、「型の定義」「変数のスコープ」などの入門者向けだと少し難しい内容は説明しません。それらの詳しいことは公式サイトにあります。以下のドキュメントを参照してください。
準備は整いましたので、実際に構築してみましょう。まずはここでもドライランしてみましょう。agent側のサーバーで以下のように実行します。
# puppet agent -t --noop Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for www01 Info: Applying configuration version '1417487814' Notice: /Stage[main]/Http_server/Package[httpd]/ensure: current_value absent, should be present (noop) Notice: /Stage[main]/Http_server/File[/etc/httpd/conf/httpd.conf]/ensure: current_value absent, should be present (noop) Info: /Stage[main]/Http_server/File[/etc/httpd/conf/httpd.conf]: Scheduling refresh of Service[httpd] Notice: /Stage[main]/Http_server/Service[httpd]/ensure: current_value stopped, should be running (noop) Info: /Stage[main]/Http_server/Service[httpd]: Unscheduling refresh on Service[httpd] Notice: Class[Http_server]: Would have triggered 'refresh' from 3 events Notice: Stage[main]: Would have triggered 'refresh' from 1 events Notice: Finished catalog run in 0.17 seconds
ここでエラーが出た場合はエラーの内容に応じて修正してください。問題なければ「--noop」オプションを外して実際に構築してみましょう。
# puppet agent -t Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for www01 Info: Applying configuration version '1417487814' Notice: /Stage[main]/Http_server/Package[httpd]/ensure: created Notice: /Stage[main]/Http_server/Service[httpd]/ensure: ensure changed 'stopped' to 'running' Info: /Stage[main]/Http_server/Service[httpd]: Unscheduling refresh on Service[httpd] Notice: Finished catalog run in 6.49 seconds
構築できたらブラウザーでアクセスしてApacheの初期ページが表示されることを確認しましょう。CentOSで動くのを確認できたら、環境のある方はUbuntuでも試してみるとよいでしょう。
次回はマニフェストの開発や運用に入ってからのtipsを紹介します。お楽しみに。
R子 うぇ〜ん、また最初からだぁ(悲)。
K男 どうしたのかな?
R子 マニフェスト間違って、構築するの失敗しちゃって……。検証用サーバーを作り直しなんですぅ(泣)。
K男 ん? VM使って実験しているんじゃなかったっけ? バックアップしなかったの?
R子 バックアップはあるんですよ……。でも、サイズが大きくて復元にすごく時間が掛かるんです(悩)。
K男 フッフッフッ、そんなときには強い味方があるんだよ(ニヤリ)。
R子 え? なんですかそれ!? イジワルしないで教えてくださいよぉ〜(願)。
K男 それは次回のお楽しみ。
R子 ひどぉ〜い(泣)。
菅原亮(すがはら りょう)
所属:NTT OSSセンタ シニア・エキスパート
1973年生まれ。10歳の時にプログラミングに目覚める。
1994年にFM-TOWNS上でLinuxを使い始めて以来、仕事趣味問わずOSSシステムを構築するようになる。
2012年よりOSSシステムの構築自動化に取り組み始め、昔の苦労を懐かしみつつ自動化の普及促進に取り組んでいる。
個人ではNTSyslog日本語対応版など主にWindows用アプリを手掛ける。趣味は家庭菜園と料理の手動構築で愛車はシルビア。
Copyright © ITmedia, Inc. All Rights Reserved.