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

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

[菅原亮, 岡本隆史,NTT OSSセンタ]
前のページへ 1|2|3|4|5       

「クラス」と「モジュール」でマニフェストをひとまとめ

Puppetのクラス

 Puppet言語には「クラス(class)」があります。オブジェクト指向言語を使ったことがある方ならピンと来たことでしょう。Puppet言語のそれは、一般的な言語のクラスと概念は似ているところもありますが別物です。とは言っても、基本的な使い方は難しくありません。クラスの基本記法は以下のようになります。

class (クラス名) {

  :

(マニフェストなど)

  :

}


Puppetのモジュール

 さらにクラスは付随するファイルなどのデータをひとまとめにして「モジュール」にできます。先ほどテンプレートの実験をしたときはローカルファイルとして配置していました。これではテンプレートを使うときはあらかじめ配布する必要があって面倒です。モジュールを使うとテンプレートを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':
  }
}

 この記述ではクラスにパラメーターを渡すこともできます。

Puppet言語の詳細は公式サイトへ

 なお本連載では、分かりやすさを重視していますので、クラスやモジュールで他にできること、「型の定義」「変数のスコープ」などの入門者向けだと少し難しい内容は説明しません。それらの詳しいことは公式サイトにあります。以下のドキュメントを参照してください。


作成したマニフェストを動かしてみよう

 準備は整いましたので、実際に構築してみましょう。まずはここでもドライランしてみましょう。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

 次回はマニフェストの開発や運用に入ってからのtipsを紹介します。お楽しみに。

R子 うぇ〜ん、また最初からだぁ(悲)。

K男 どうしたのかな?

R子 マニフェスト間違って、構築するの失敗しちゃって……。検証用サーバーを作り直しなんですぅ(泣)。

K男 ん? VM使って実験しているんじゃなかったっけ? バックアップしなかったの?

R子 バックアップはあるんですよ……。でも、サイズが大きくて復元にすごく時間が掛かるんです(悩)。

K男 フッフッフッ、そんなときには強い味方があるんだよ(ニヤリ)。

R子 え? なんですかそれ!? イジワルしないで教えてくださいよぉ〜(願)。

K男 それは次回のお楽しみ。

R子 ひどぉ〜い(泣)。


著者プロフィール

菅原亮(すがはら りょう)

所属:NTT OSSセンタ シニア・エキスパート

1973年生まれ。10歳の時にプログラミングに目覚める。

1994年にFM-TOWNS上でLinuxを使い始めて以来、仕事趣味問わずOSSシステムを構築するようになる。

2012年よりOSSシステムの構築自動化に取り組み始め、昔の苦労を懐かしみつつ自動化の普及促進に取り組んでいる。

個人ではNTSyslog日本語対応版など主にWindows用アプリを手掛ける。趣味は家庭菜園と料理の手動構築で愛車はシルビア。


著者プロフィール

岡本 隆史(おかもと たかし)

所属:NTT OSSセンタ シニア・エキスパート

「楽をすること」に興味があり、単純作業はスクリプト・マクロなどでできるだけ自動化するようにしている。しかしながら、楽をするためにツールを作成する苦労も伴い、苦労が実っているどうかは定かではない。

楽をする仕組みを共有することこそ、その本質だと気付き、環境構築の自動化ツールの社内外への展開を行っている。


前のページへ 1|2|3|4|5       

Copyright © ITmedia, Inc. All Rights Reserved.

編集部からのお知らせ

RSSについて

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

メールマガジン登録

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