レシピの作成を通してChefの具体的な使用イメージをつかもう

2013年12月20日(金)
喜納 健

(3)実行

これで準備完了です。chef-soloを実行してみましょう。

$ sudo chef-solo -c solo.rb -j node.json

chef-soloの実行が完了致しましたら、ブラウザからWebページを閲覧してみましょう。

http://ノードホスト名またはIPアドレス/sample/sample.html

図2:サンプルページ閲覧画面(クリックで拡大)

/etc/httpd/conf/httpd.confも配布した内容になっていることを確認してみて下さい。

紹介したリソースの他にもファイルの中身をテンプレート化して、ノードに応じて変数部分に値を代入して配布する“template”リソースやユーザーの状態を定義する“user”リソース等があります。是非試してみて下さい。

レシピ作成の予備知識

レシピを作成する際に知っておくと便利なことを3点ご紹介します。

(1)状況に応じたリソースの適用

“DBの初期化が未実施の場合に初期化を行う”など、環境に応じてリソースを適用するかどうか判定する場合もあります。その様な時は、ガード(Guard)と呼ばれる機能を使用することで、OSの種類やファイルの有無などノードの状態に応じてリソース適用の是非を指定できます。

具体的には、“not_if/only_if”文を使用して、レシピで定義したリソースを適用する条件を指定します。

Guard 説明
not_if 戻り値が true の時、リソースを適用しない。
(リソースの適用をスキップさせたい時に使用する)
only_if 戻り値が true の時のみ、リソースを適用する。

“not_if/only_if”文の後に、ShellコマンドまたはRubyのブロックを指定します。指定した判定文の戻り値から定義した状態を適用するか判定します。Shellコマンドの場合はリターンコードが0、Rubyブロックの場合は“true”であるかどうかで戻り値を判定します。

例えば、PostgreSQLインストール直後のDB初期化で使用する際に、初期化で作成されるpostgresql.confファイルの有無から、初期化を行うかどうかをガードで判定します。postgresql.confファイルが存在しない場合、初期化が行われます。

execute "initiallze database" do
  command "service postgresql initdb"
  action :run
  not_if "test -f /var/lib/pgsql/data/postgresql.conf"
end

(2)柔軟にレシピを活用する

上記で紹介したWebサーバのクックブックでは、default.rbファイルに全てのリソースを定義しましたが、レシピ名.rb を作成し1つのクックブックに複数のレシピを作成することができます。実際にレシピを使用していく場合は、共通して適用する部分と構築・運用する環境に応じて個別に適用する部分とで分けておいた方が流用しやすいです。
例えば、SELinuxという名前のクックブックを作成した場合、enforcing・permissive・disabledそれぞれのレシピを用意しておけば、SELinuxの設定に頼らず同じクックブックを使用できます。

作成したクックブックから1つのレシピを実行する場合は、ランリストに以下の様に設定します。

node.json

{
  "run_list": [
      "recipe[ selinux::enforcing ]"
   ]
}

レシピの中で他のクックブックにあるレシピを呼び出すよう定義することでもできます。
例えば、yumクックブックから、apache用のリポジトリを登録するapache_repoレシピを呼び出す場合は、レシピの中で以下の様に定義します。

include_recipe "yum::apache_repo"

package "httpd" do
  action :install
end

・・・省略・・・

その他レシピの書き方については、下記のページが参考になります。
Recipe DSL

(3)コミュニティで公開されているクックブックを利用する

Opscode Community Siteでは、Chefユーザー間でクックブックが共有されています。「Databases」や「Web Servers」など、カテゴリ別にクックブックが整理されており、クックブックを作成する時に参考になると思います。作者によってレシピの中身も異なり、それぞれライセンスが設定されていますのでよく確認して利用しましょう。

図3:Opscode Community Site(クリックで拡大)

Opscode Community Site

公開されているクックブックをみると気づかれると思いますが、レシピはRubyで柔軟に作成できます。Rubyの知識がある方はリソースの開発もできます。

ちなみに、Opscode社のWebサイトでChefを使用する上で知っておくと良いRuby の知識がまとめて紹介されています。こちらも参考になります。

Just Enough Ruby for Chef

第2回は、chef-soloを使用してレシピの作成から適用までの流れを紹介しました。
第3回は、Chef Serverを紹介します。Chef Serverはレシピやノード情報(JSONファイルも含む)を管理する機能を備えており、多数のノードを効率よく管理できます。第3回をお楽しみに!

※記載の会社名、製品名は、それぞれの会社の商標もしくは登録商標です。

株式会社 日立ソリューションズ

(株)日立ソリューションズ、オープンソース技術開発センタにてクラウド関連技術の調査に従事。Hadoop関連のプロジェクトで大規模クラスタの構築を担当したことを機に、システム構築・運用自動化について調査を行っている。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています