もふもふ技術部

Chef + VagrantでCentOS 6.5 + rbenv + Nginx + Passenger + Rails4 環境を構築する


自作cookbooksは最小限にしてなるべくcommunity cookbookを使う方針で。

けっこうハマりました。特にNginx + Passengerあたりがcommunity cookbookではうまくいかず(rbenvだからいけなかったか?)、仕方なく自前でソースコードをコンパイルするレシピを書いたりした。

環境はMac 10.9 marvericksで。

お料理するよ!

Vagrant, Chef, knife-solo, Berkshelfなどのインストールは過去にやっているので参照されたし。

Vagrant
Vagrantで簡単にUbuntu 12.04を動かしてみるところまで。

Chef, knife-solo
CentOS 6.4でchef soloとknife soloを使ってphp実行環境を構築

berkshelfとpluginのインストール

$ gem install berkshelf
$ vagrant plugin install vagrant-omnibus

vagrant-berkshelfはvagrantのエコシステムから外れてしまったらしく将来的にどうなるかわからないので使わずに行きます。

作業用ディレクトリを作成。

$ mkdir rails_chef
$ cd rails_chef

Berksfileを準備します。

Vagrantfileを作成します。

ちなみに CentOS-6.5-x86_64-minimal という名前でbox addされている必要があります。boxは自由に変えていただければと思います。

berkshelfを使ってcommunity cookbookをダウンロードしておく。パスを指定しなければカレントディレクトリのberks-cookbooksにダウンロードされます。

$ berks vendor

以前はberks install –path /path/to/cookbooks だったんですが、新しいバージョンではエラーが出るようになってました。

あと、berks vendorで落としてきた場合、再度 berks vendor すると「既にディレクトリがあるよ!」って怒られるので、めんどうなんですが rm -rf berks-cookbooks してから berks vendor してました。こうじゃない感があるのですが正しいやり方が見つけられなかった。

自作のcookbookを作成するためにknifeでcookbook一式を生成します。自作cookbookはsite-cookbooks下に置くのが一般的。

$  knife cookbook create rails_chef -o site-cookbooks

iptables設定のためのテンプレートファイルと、自作レシピを書いて行きます。

site-cookbooks/rails-chef/recipes/default.rb

site-cookbooks/rails-chef/templates/default/http.erb

-A FWR -p tcp -m tcp --dport 80 -j ACCEPT

site-cookbooks/rails-chef/templates/default/ssh.erb

-A FWR -p tcp -m tcp --dport 443 -j ACCEPT

続いて、nginxとpassenger用のレシピ。こちらを参考にさせていただいた!
https://gist.github.com/philwo/3051666

site-cookbooks/rails-chef/recipes/nginx_passenger.rb

設定ファイル類はあらかじめfilesに用意しておく。今回は決めうちでやってしまったが、この辺は汎用性を高めた方がよい気がする。

nginx共通設定ファイル
site-cookbooks/rails-chef/files/default/nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    passenger_root /usr/local/rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/passenger-4.0.42;
    passenger_ruby /usr/local/rbenv/versions/2.1.1/bin/ruby;

    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

railsアプリケーションの設定ファイル
site-cookbooks/rails-chef/files/default/sample_rails.conf

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/sample_rails/public;
        index  index.html index.htm;
        passenger_enabled on;
    }
}

nginxの起動スクリプト
site-cookbooks/rails-chef/files/default/nginx

起動スクリプトはこちらを参考にさせていただいた。
http://www.happytrap.jp/blogs/2012/02/23/8243/

ソースコード取得はcapistranoでやる予定なので、今回は手作業でやってしまえ。ごめんなさい。

$ sudo mkdir /var/www
$ cd /var/www
$ git clone GIT_REPOSITORY_URL

git cloneするとき、githubなどを使う場合は公開鍵認証が必要になるので、ssh-agentに鍵登録して、Vagrantfileで config.ssh.forward_agent = true の設定をしておくと楽。ゲストOS側で鍵の設定がいらないです。

あとは gem install bundler, bundle installなどなどRailsに関わる操作を行いますが、そこらへんは割愛しちゃいますね。

最後に

自作cookbookにcommity cookbookに依存するレシピを書いてしまっていたり、アプリケーション個別のレシピがnginx_passengerのレシピに入っていたり、ちょっと保守性アレでイケてないのでのちのち改善していきたい。

今回のブログを書くために書いたものはGithubにアップしてます。十分に検証出来てませんが、少しでも参考になれば幸い。
https://github.com/harada4atsushi/rails_chef

The following two tabs change content below.
原田 敦

原田 敦

日本CAWのエンジニア。もふもふ部の部長。得意分野はRuby on Railsを使った小規模WEBアプリケーションを高速で開発すること。週末の楽しみは一人お菓子パーティー。三度の飯より小動物をもふもふするのが好きです。