vagrantとchefとdockerによるRails開発環境構築(vagrantの環境構築)

#vagrantの環境構築
　dockerで環境を作成する前にvagrantで環境を作成します。その際にchefのレシピを使用するので、必要なものをインストールしておきます。今回利用するものは、「chef」と「knife-solo」と「berkshelf」を入れておきます。

##環境構築
###chefのインストール
```
$ gem install chef
```

###knife-soloのインストール
　knife-soloとはローカルで作成したクックブックをリモートで実行する流れを自動化してくるものです。

```
$ gem install knife-solo
```

###Berkshelfのインストール
　Berkshelfとは、誰かが作成したクックブックの依存性を管理してくれるツールです。

```
$ gem install berkshelf
```

##必要なgemをまとめる
　実際にchef等を利用する際には、純粋にgem installによってグローバルに割り当てることで、利用することはできます。しかし、バージョンによる動作の違いを解消するために、プロジェクト単位等でまとめて管理すると影響がすくなるので必要なgemは、budlerを用いて管理していきます。

###bundlerのインストール
　bundlerはrubyのライブラリである、gemを依存関係を管理し導入するためのものです。

```
$ gem install bundler
```

###Gemfileの作成
　Gemfileは、bundle installを実行した際に記述されているgemと依存関係にあるものをまとめてインストールしてくれます。また、Gemfile.lockというものが作成されますが、消さないようにしてください。Gemfile.lockはbundle installを行った際に参照するバージョンが記載されているからです。ただし、Gemfile.lockがない場合は、最新バージョンを参照にしにいきます。

```
###Gemfile

source 'https://rubygems.org'

gem 'chef'
gem 'knife-solo'
gem 'berkshelf'
```

###bundle installの実行
　作成したGemfileの内容を取り込みます。

```
$ bundle install
```

###bundle updateについて
　bundle updateを実行するさいには、注意が必要です。なぜなら、Gemfile.lockの内容に関係なく、最新版のgemを参照にしにいこうとすからです。なので、バージョンを固定したいものがあれば、Gemfileに記述します。

```
$ bundle update
```

```
###バージョンを固定する例
###Gemfile

#バージョンの指定なし
gem 'rails'

#バージョンの固定
gem 'rails', '4.1.0'

#4.0以降のバージョンに指定
gem 'rails', '>=4.0'

#4.1以降から5.0以前のバージョンに指定
gem 'rails', '~>4.1'

```

##クックブックとレシピ
　今後、クックブックとレシピという言葉を頻繁に出てきますので、簡単に説明します。

###レシピ
　レシピとは、chefの設定をまとめたものを言います。

###クックブック
　クックブックとは、レシピをまとめたもので、管理する単位のことを言います。

#nginx(エンジンエックス)の導入
　nginxとは、リバースプロキシ等の設定が簡単で、動作が軽いnginxを導入します。

##nginxのクックブック作成
```
$ bundle exec knife cookbook create nginx -o ./site-cookbooks
```

##nginxのレシピ作成
　クックブック作成時インポートされたファイルのdefault.rbを編集します。

```
###./site-cookbooks/nginx/recipes/default.rb

include_recipe 'yum-epel'

package 'nginx' do
  action :install
end

service 'nginx' do
  action [ :enable, :start ]
  supports :status => true, :restart => true, :reload => true
end

```

##Berksfileの作成

```
$ vim Berksfile
```

```
###Berksfile

###berkshelf2.x系の場合
site :opscode

###berkshelf3.x系の場合
source "https://api.berkshelf.com"

###共通
cookbook 'yum-epel'
cookbook 'nginx', path: './site-cookbooks/nginx'

```

###berks installの実行
```
###berkshelfが2.x系の場合
$ bundle exec berks install --path ./cookbooks

###berkshelfが3.x系の場合
$ bundle exec berks vendor ./cookbooks
```

###vagrant-omnibusのインストール
　これは、vagrantのbox内にchefやchef-soloが含まれていないため、それを自動でインストールしてくれるものです。

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

またしてもエラーが。。。

```
Installing the 'vagrant-omnibus' plugin. This can take a few minutes...
Building nokogiri using packaged libraries.
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:

An error occurred while installing nokogiri (1.6.3.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.3.1'` succeeds before bundling.
```

　いろいろと調べてみたら、原因はxcodeが足りなかったようでなので、コマンドを実行して、installしたら、成功するようになりました。

```
$ xcode-select --install
```

##Vagrantファイルの編集
　最初に作成したVagrantファイルを編集します。ファイルの変更内容は、vmのbox名とbox名のurlを記述して、vagrant box addを行わずに済むようにします。また、IPアドレスやvagrant-omnibusについても設定します。

#####vm.box
```
###変更前
config.vm.box = "centos"

###変更後
config.vm.box = "centos-6.5"
config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"
```

#####IPアドレス
```
###変更前
# config.vm.network "private_network", ip: "192.168.33.10"

###変更後
config.vm.network "private_network", ip: "192.168.33.10"
```

#####vagrant-omnibus
```
###変更前
  # config.vm.provision "chef_solo" do |chef|
  #   chef.cookbooks_path = "../my-recipes/cookbooks"
  #   chef.roles_path = "../my-recipes/roles"
  #   chef.data_bags_path = "../my-recipes/data_bags"
  #   chef.add_recipe "mysql"
  #   chef.add_role "web"
  #
  #   # You may also specify custom JSON attributes:
  #   chef.json = { mysql_password: "foo" }
  # end

###変更後
  config.omnibus.chef_version = :latest

  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
    chef.run_list = %w[
      recipe[yum-epel]
      recipe[nginx]
    ]
  end
```

##vagrantの起動とインストール確認
　nginxが導入されて、アクセス出来るか確認してみます。

###起動コマンド
```
$ vagrant up --provision
```

###アクセスURI(URLはURIに定義が変更されたようです)
```
http://192.168.33.10/
```

「Welcome to nginx on EPEL!」のタイトルページが表示されたら、成功です。