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

前回はファイアウォールの設定が必要だというところで終わりましたが、ファイアウォールであるiptablesの操作を行うcookbookも提供されています。これも、cookbooksディレクトリにダウンロード展開します。


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

このcookbookは/etc/iptables.dに設定用のファイルをコピーし、その後そのファイルを使ってiptablesを設定します。

既定では確立済みのセッションを許可するall_established.erbというテンプレートと、ICMPプロトコルを許可するall_icmp.erbだけが設定されます。HTTPを許可するためには下記のファイルを用意します。

cookbooks/main/templates/default/http.erb


# Port 80 for http
-A FWR -p tcp -m tcp --dport 80 -j ACCEPT

ただ、これではSSHによる接続もできなくなるので、これを許可するテンプレートも用意します。

cookbooks/main/templates/default/ssh.erb


# Port 22 for ssh
-A FWR -p tcp -m tcp --dport 22 -j ACCEPT

つぎに、cookbooks/main/recipes/default.rbに、iptablesのレシピと、上記の2つのファイルを設定するためのメソッド呼び出しを追加します。

cookbooks/main/recipes/default.rb


include_recipe "selinux::permissive"
include_recipe "apache2"
include_recipe "iptables"
iptables_rule "ssh"
iptables_rule "http"

これでrsyncとsshによるchef-solo実行を行えば、http://192.168.1.1/でApacheのでファオルトページが表示されるはずです。

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