VagrantにRuby/Rails開発環境を整えるChef+Berkshelf構築メモ


なんかいろんな方法があって、迷いまくった結果こんな感じで構築してみているメモです。Berkshelfでサードパーティなcookbookを使いつつ、オリジナルのも混ぜる感じで。このサードパーティを利用しつつ、自前で書きたいものの連携がなんかよく分からんかったです。

というわけで、できるまでの構築メモを書いてみました。

### 過程とかどうでもいいから、すぐ構築したい

構築できればよかろうなのだァァァァッ!!というカーズな人向けに、もろもろ揃ったものをGitHubにあげておきました。README通りにやればたぶん…いけるはず。

- https://github.com/zaru/vagrant-rails-chef

# 初期設定

## 環境

- CentOS 6.5
- Vagrant 1.6.3
- ruby 2.1.1（rbenv）

## vagrant-omnibusのインストール

仮想環境内にサクッとChefを入れるために、Vagrantのプラグインomnibusを使用したいので、入ってない場合はインストールします。

```
$ vagrant plugin install vagrant-omnibus
```

## Vagrant + Bundlerの初期化

これで、VagrantfileとGemfileが作成されます。とりあえずGemfileだけ修正します。

```
$ cd proj_dir
$ vagrant init
$ bundle init
```

```rb:Gemfile
# A sample Gemfile
source "https://rubygems.org"

ruby '2.1.1'

gem 'chef'
gem 'knife-solo', '~> 0.4.0'
gem 'berkshelf', '~> 3.0.0'
```

```
$ bundle install --path vendor/bundler
```

これで、`bundle exec berks`コマンドが打てるようになりました。

# オリジナルレシピ作成

今回は単純に`yum`でopenssl, openssl-devel, sqlite3, sqlite3-develをインストールするレシピを作ります。openssl-develがないと、rbenvでRubyビルドするときにエラーになるので。sqlite3-develは、railsで使うので入れておきます。

```
$ bundle exec berks cookbook yum-pkg
```

単純に使うなら、下記2ファイルのみいじればOK。

```yum-pkg/metadata.rb
# もし依存cookbookがあるなら dependsで指定する
# depends 'hoge'
```

```yum-pkg/recipes/default.rb
%w[openssl openssl-devel sqlite sqlite-devel].each do |pkg|
	package pkg do
		action :install
	end
end
```

# Berkshelfの設定

自前のレシピ＋サードパーティのを書き連ねる。

rbenvは、Berkshelfで配布されているものではなくて、GitHubに上がっている別のものを使用します。こっちのほうが良さげだったので。

```rb:Berkshelf
source 'https://api.berkshelf.com'

cookbook 'yum-pkg', path: 'yum-pkg'

cookbook 'git'
cookbook 'build-essential'
cookbook 'yum', '~> 3.2.4'
cookbook 'vim', '~> 1.1.2'
cookbook 'openssl', '~> 2.0.0'
cookbook 'nginx', '~> 2.7.4'
cookbook 'unicorn', '~> 2.0.0'
cookbook 'rbenv', :git => 'git://github.com/fnichol/chef-rbenv.git', :branch => 'v0.7.2'
cookbook 'ruby_build', '~> 0.8.0'
cookbook 'mongodb', '~> 0.16.1'
cookbook 'nodejs'
```

```
$ bundle exec berks vendor cookbooks
```

# Vagrantfileの修正

```rb:Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos65"

  # Chef最新版をインストール（omnibus）
  config.omnibus.chef_version = :latest

  config.vm.provision :chef_solo do |chef|


    chef.cookbooks_path = "./cookbooks"
    chef.run_list = [
      'recipe[yum-pkg]'
    ]
    chef.add_recipe 'yum'
    chef.add_recipe 'build-essential'
    chef.add_recipe 'ruby_build'
    chef.add_recipe 'rbenv::system'
    chef.add_recipe 'git'
    chef.add_recipe 'vim'
    chef.add_recipe 'nginx'
    chef.add_recipe 'unicorn'
    chef.add_recipe 'mongodb'
    chef.add_recipe 'nodejs'

    # Ruby2.1.2をインストール
    chef.json = {
      "rbenv" => {
        "global" => "2.1.2",
        "rubies" => [ "2.1.2" ],
        "gems" => {
          "2.1.2" => [
            { 'name' => 'bundler' }
          ]
        }
      }
    }
  end
end
```

```
$ vagrant up
```

かなり時間はかかるが、これでRubyもろもろの環境が整うはず…。

# Railsの準備

次は、Railsのプロジェクトを作ってみます。Vagrantの仮想環境内に入って作業をします。

```
$ vagrant ssh
```

以下、仮想環境内のコンソールです。

```
$ cd /vagrant
$ mkdir rails
$ cd rails
$ bundle init
$ vi Gemfile
```

```rb:Gemfile
# A sample Gemfile                                                                                 
source "https://rubygems.org"

gem "rails"
```

```
$ bundle install --path vendor/bundle
$ bundle exec rails new sample --skip-bundle
$ cd sample
$ bundle install --path vendor/bundle
```

試しにRailsサーバを立ち上げてみます。

```
$ bundle exec rails s
```

これで無事起動すればOKです。