Rubyでサーバ設定を自動化! Chef Soloを試そう!第1回

前回の第0回でCentOS 6.2にRuby 1.9.3をソースコンパイルでインストールしました。今回はいよいよChefのインストールです。gemコマンド一発でインストールは完了です。

[root@localhost ~]# gem install chef ruby-shadow --no-ri --no-rdoc

ruby-shadowはlinuxのパスワードファイルの操作を行う場合に必要となるライブラリです。また、インストールしたマシンは開発用のマシンではありませんのでgemのリファレンスの生成を抑止するため、–no-ri –no-rdoc というスイッチをつけています。

せっかくChefをインストールしたので、早速試してみましょう。今回使用しているマシンにはApacheがインストールされていません。これをChefを使ってインストールしてみます。

Chefでは一連のサービスあるいは機能の設定に必要な操作の定義をcookbook(料理本)と呼びます。cookbookの中には複数のrecipe(レシピ)が含まれます。今回はサーバーを必要としないChef Soloを使うので、設定ファイルは設定をしようとするマシンのローカルディスクにある必要があります。まず、/var ディレクトリの下に、chef-soloの実行に必要な定義ファイルを収納するためのディレクトリを作成します。

[root@localhost ~]# mkdir /var/chef
[root@localhost ~]# cd /var/chef

さらに、cookbookとrecipeを保管するディレクトリ構造を用意します。今回はとりあえずmainというcookbookを定義する事にしましょう。

[root@localhost chef]# mkdir -p cookbooks/main/recipes

このrecipesディレクトリにdefault.rbと言うファイル名で最初のレシピを作成します。ファイルの内容は下記の通りです。

package "httpd"

この指定によりOSのパッケージマネージャーを使って指定した名称のパッケージがインストールされます。CentOSの場合にはyumですね。cookbookは複数のOSやディストリビューションに対応させる事もできます。ただ、Apacheのようにディストリビューションでパッケージ名が異なる場合には工夫が必要になりますが、それは後の機会に紹介します。

さて、レシピファイルを書いただけでは実行はできません。ローカル版のchef-soloの場合には、cookbookの場所を教えてあげる必要があります。ここでは/var/chefの直下にsolo.rbの名前で下記の内容のファイルを作成しました。

cookbook_path File.expand_path("../cookbooks", __FILE__)

ちなみにFile.expand_pathメソッドは、第1引数で与えられた相対パスを絶対パスに変換します。第2引数は基準となるディレクトリです。__FILE__はスクリプトファイル自体のパスを表します。

さて、それではchef-soloを実行してみましょう。設定ファイルを表す—cスイッチを使って先ほどのsolo.rbを指定します。

[root@localhost chef]# chef-solo -c solo.rb

実行すると下記のような表示がなされるはずです。

[root@localhost chef]# chef-solo -c solo.rb
[2012-07-21T09:36:47+09:00] INFO: *** Chef 10.12.0 ***
[2012-07-21T09:36:48+09:00] INFO: Run List is []
[2012-07-21T09:36:48+09:00] INFO: Run List expands to []
[2012-07-21T09:36:48+09:00] INFO: Starting Chef Run for localhost
[2012-07-21T09:36:48+09:00] INFO: Running start handlers
[2012-07-21T09:36:48+09:00] INFO: Start handlers complete.
[2012-07-21T09:36:48+09:00] INFO: Chef Run complete in 0.003487679 seconds
[2012-07-21T09:36:48+09:00] INFO: Running report handlers
[2012-07-21T09:36:48+09:00] INFO: Report handlers complete
[root@localhost chef]#

エラーにはなりませんが、何もインストールされた形跡がありませんね。実はchef-soloの実行にはRun Listとよばれる実行項目のリストに登録が必要なのです。Run Listの指定はjson形式のファイルを用いて行います。ここではnode.json(ちなみにnode.jsとは全く無関係です)という名で下記のファイルを作ります。

{
"run_list":["recipe[main]"]
}

今度はこのファイルも-jスイッチで指定して実行してみます。

[root@localhost chef]# chef-solo -c solo.rb -j node.json
[2012-07-21T09:46:28+09:00] INFO: *** Chef 10.12.0 ***
[2012-07-21T09:46:29+09:00] INFO: Setting the run_list to ["recipe[main]"] from JSON
[2012-07-21T09:46:29+09:00] INFO: Run List is [recipe[main]]
[2012-07-21T09:46:29+09:00] INFO: Run List expands to [main]
[2012-07-21T09:46:29+09:00] INFO: Starting Chef Run for localhost
[2012-07-21T09:46:29+09:00] INFO: Running start handlers
[2012-07-21T09:46:29+09:00] INFO: Start handlers complete.
[2012-07-21T09:46:29+09:00] INFO: Processing package[httpd] action install (main::default line 9)
[2012-07-21T09:46:38+09:00] INFO: package[httpd] installing httpd-2.2.15-15.el6.centos.1 from base repository
[2012-07-21T09:46:53+09:00] INFO: package[httpd] installed version 2.2.15-15.el6.centos.1
[2012-07-21T09:46:53+09:00] INFO: Chef Run complete in 23.932614002 seconds
[2012-07-21T09:46:53+09:00] INFO: Running report handlers
[2012-07-21T09:46:53+09:00] INFO: Report handlers complete
[root@localhost chef]#

今度はちゃんとインストールされたようです。ちなみに同じコマンドをもう一度実行しても、2度インストールが走る事はありません。