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

さて、これまですべて自作でApacheのインストールと起動設定を行いましたが、実はたくさんの方が使っている製品の場合、他の方が既にCookbookやレシピを公開している事が多いのです。たとえばChefの主要開発元であるOpscodeのコミュニティページには、主要なオープンソースプロダクトのCookbookが列挙されています。

http://community.opscode.com/cookbooks

Apacheについてもapache2の名前で各種のLinuxディストリビューションやAmazon EC2、FreeBSDに対応したCookbookが登録されています。

CentOSなどRedHat系OSの場合、Apacheの設定ファイルはhttp.confの大きなファイルが使われていますが、このファイルを編集して使用するのは自動化にとっては頭の痛い問題です。そこで、apache2のCookbookではDebianスタイルの設定ファイルを採用しています。つまり、サイトやモジュールごとに設定ファイルを分け、シンボリックリンクを使ってロードする方式です。

apache2のCookbookをダウンロードし、ローカルのcookbooksディレクトリに展開します。gitが使える場合には下記のコマンドでダウンロードと展開ができます。

cookbooks$git clone git://github.com/opscode-cookbooks/apache2.git

main/recipes/default.rbはこのapache2のレシピを呼び出すことになるので、下記のように書き換えます。

include_recipe "apache2"

編集後に

client$ rsync -r . root@192.168.1.1:/var/chef
client$ ssh root@192.168.1.1 "chef-solo -c /var/chef/solo.rb"

を実行すると、下記のようなエラーが発生しました。


[apache2] (apache2::default line 219) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of /sbin/service httpd start ----
STDOUT: httpd を起動中: [失敗]
STDERR: httpd: Could not open configuration file /etc/httpd/conf/httpd.conf: Permission denied
---- End output of /sbin/service httpd start ----

/etc/httpd/conf/httpd.confの読み取り権限がないというメッセージですが、パーミッションは0644となっており読み取りできるはずということで調べてみると、centOSでデフォルトで有効になっているselinuxが原因のようです。

自分で解除してもよいのですが、opscode-cookbooks/selinuxが用意されているので、これも使うことにします。

cookbooks$git clone git://github.com/opscode-cookbooks/selinux.git

main/recipes/default.rbに呼び出しを書き加えます。

include_recipe "selinux::permissive"
include_recipe "apache2"

更新後chef-soloを実行すると、今度はエラーは出なくなり、httpdが無事起動されました。

ただ、http://192.168.1.1/を参照してみると接続出来ませんね。調べてみるとデフォルトでファイアウォールが有効になっているためブロックされているようです。
ファイアウォールの設定も自動化したいところですが、それは次回ということで。