Chef-Solo + Berkshelf  で Rails 4 の開発環境を構築

# はじめに
## 今までの流れ
この記事は以下の2つの記事の内容の続きです。

* [Vagrant で Ruby on Rails 4 の環境構築](http://qiita.com/Salinger/items/20f466ffe7cc0c04b010)
* [Chef-Solo + Berkshelf による自動環境構築](http://qiita.com/Salinger/items/3e9e4614f2187c1d7c01)

## 今回やること
[Chef-Solo + Berkshelf による自動環境構築](http://qiita.com/Salinger/items/3e9e4614f2187c1d7c01) で
自動環境構築の Hello, World! 的なことをやったので、
今度はもう少し実用的なものをインストールしてみる。

具体的には [Vagrant で Ruby on Rails 4 の環境構築](http://qiita.com/Salinger/items/20f466ffe7cc0c04b010) で作った環境を
Chef-Solo + Berkshelf を使って構築してみる。

## インストール先 (Node)
[Chef-Solo + Berkshelf による自動環境構築](http://qiita.com/Salinger/items/3e9e4614f2187c1d7c01) で Emacs をインストールした環境をそのまま流用する。

# 各種設定
## 仮想環境の設定
[Chef-Solo + Berkshelf による自動環境構築](http://qiita.com/Salinger/items/3e9e4614f2187c1d7c01) の Vagrantfile の内容に、
` config.vm.network :"forwarded_port", guest: 3000, host: 3000`
を追記。Rails で使用するポートにローカルからアクセスできるようにする。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos6.5"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"
  config.vm.network :"forwarded_port", guest: 3000, host: 3000
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "4096"]
  end
end
```

上記設定で新規作成 or 既存の仮想マシンを起動。

```
$ cd ~/vagrant/hoge_machine # 仮想マシンの設定保存先
$ vagrant up
```

既に仮想マシンが起動中の場合は以下のコマンドをで設定ファイルを再読み込み。

```
$ cd ~/vagrant/hoge_machine # 仮想マシンの設定保存先
$ vagrant reload
```

## Berkshelf の設定
Berksfile を下記のように書き換える。

```ruby:chef_repo/Berksfile
source "https://api.berkshelf.com"

cookbook 'emacs'
cookbook 'rvm', '~> 0.9.2'
cookbook 'sqlite', '~> 1.1.0'
cookbook 'mysql', '~> 5.3.6'
cookbook 'git'
cookbook 'build-essential'
cookbook 'nginx', '~> 2.7.4'
cookbook 'openssl', '~> 2.0.0'
```

これで以下のCookbookを取得できる。

* Ruby 関係
  * RVM
* DB 関係
  * SQLite
  * MySQL
* Webサーバー関係
  * Nginx
  * build-essential
  * openssl
* その他開発関係
  * Git
  * Emacs

※ CentOS 6.5 の場合、mysql の部分に '~> 5.3.6' と指定してやらないと、インストール時にコケた。

# Node の json ファイル設定
下記のように使用する Cookbook を指定する。

また、RVM と MySQL の初期設定も記述する。
これで Ruby 2.1.x がデフォルトのRubyとしてインストールされ、
MySQL 5.6 がポート 3306、root パスワードが vagrant の設定でインストールされる。

```json:chef_repo/nodes/192.168.33.10.json
{
  "run_list": [
    "recipe[emacs]",
    "recipe[rvm::system]",
    "recipe[sqlite]",
    "recipe[mysql::server]",
    "recipe[mysql::client]",
    "recipe[git]",
    "recipe[build-essential]",
    "recipe[openssl]",
    "recipe[nginx]"
  ],
  "automatic": {
    "ipaddress": "192.168.33.10"
  },
  "rvm": {
    "user": "root",
    "default_ruby": "ruby-2.1",
    "user_default_ruby": "ruby-2.1",
    "rubies": ["ruby-2.1"]
  },
  "mysql":{
    "version":"5.6",
    "port":"3306",
    "server_root_password":"vagrant",
    "remove_anonymous_users":true
    }
}
```

# 設定反映
下記のコマンドを実行。

```
$ bundle exec berks vendor cookbooks
$ bundle exec knife solo prepare vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_key
$ bundle exec knife solo cook vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_key
```

# 確認
試しに Rails のプロジェクトを作ってみる。
仮想環境に `vagrant ssh` でログイン後に下記コマンドを実行。

```
$ mkdir ~/projects
$ mkdir ~/projects/sample_rails_project
$ cd ~/projects/sample_rails_project
$ bundle init
```

作成された Gemfile を以下のように編集。

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

gem "rails"
```

下記コマンドを実行。

```
$ bundle install --path vendor/bundle
$ bundle exec rails new .
...
conflict  Gemfile
Overwrite /home/vagrant/projects/sample_rails_project/Gemfile? (enter "h" for help) [Ynaqdh] Y
...
```

上書きされたGemfileを開き、下記行のコメントアウトを解除。

```ruby:Gemfile
gem 'therubyracer', platforms: :ruby
```

その後下記コマンドを実行

```
$ bundle install --path vendor/bundle
$ bundle exec rails server -b 0.0.0.0
```

ローカルマシンのブラウザから [http://192.168.33.10:3000](http://192.168.33.10:3000) にアクセス。

以下のような画面が見えれば成功。

![50bd0f15-797f-d591-29a4-bde835968abf.png](https://qiita-image-store.s3.amazonaws.com/0/58390/a4fc4cc8-f563-bddb-bff4-00d631752671.png)

# おわりに

* Berkshelf のおかげで自分で Cookbook を書くことなく楽に環境構築できた。
* ポートフォワーディングの設定をしたが、ローカルから [http://192.168.33.10:3000](http://192.168.33.10:3000) でアクセスするならVagrantfileのこの部分の設定いらなかったかも。
* 実験用環境作る際には、 Chef-Solo + Berkshelf + Vagrant で構築手順作っといて、Github 等に必要なファイル一式上げとくと、将来的楽できそう。