Berkshelfベースにvagrant, chef(knife-solo)環境を簡単に構築する方法

## 前提
### 必要なファイルをインストール

今回の環境は以下のとおりです。（MacOSX）
VirtualBox 4.2.18 r88780
Vagrant 1.3.4
Ruby 2.0.0p247
Bundler 1.3.5 (Ruby Gems)

* VirtualBox => https://www.virtualbox.org/wiki/Downloads
* Vagrant => http://downloads.vagrantup.com/
* Ruby =>  rbenvやrvmなんでもいいので1.9以上を入れるといいと思います
* bundler(Ruby Gems) => 「gem install bundler」としてbundlerを入れる

### 初期ディレクトリ

/tmp以下を今回の作業環境とする。以下のディレクトリ構成を作る。

```shell-session
/tmp
└── vagrant-test
    └── chef-repo
```

********

## BundlerによるBerkshelfを使ってVagrantのセットアップ

```shell-session:bundleのinitまで
% cd /tmp/vagrant-test/chef-repo
% bundle init
```

```shell-session:bundle_initで生成されたGemfileを編集
% vi Gemfile
source "https://rubygems.org"
gem "knife-solo", "~> 0.3.0"
gem "foodcritic"
gem "berkshelf"
gem "serverspec"
gem "awesome_print"
```

```shell-session:bundleを実行
% bundle install --path vendor/bundle --binstubs vendor/bin
```

```shell-session:berkshelfのイニシャライズ(途中でGemfileのコンフリクトでどうするか求められるが、「n」でスキップして進める)
% bundle exec berks init
      create  Berksfile
      create  Thorfile
      create  .gitignore
         run  git init from "."
    conflict  Gemfile
Overwrite /private/tmp/vagrant-test/chef-repo/Gemfile? (enter "h" for help) [Ynaqdh] n
          skip  Gemfile
      create  Vagrantfile
Successfully initialized
```

```shell-session:berk_initで生成された不要なファイルを削除
% rm Thorfile  <= とりあえずthorは使うことがないので削除
```

```shell-session:「Vagrantfile」は以下のとおりにする。（Centosのバージョンなどは適宜合わせて下さい）
% vi Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.hostname = "chef-repo-berkshelf"
  config.vm.box = "centos6.5-x86_64-minimal_20131205"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box"
  config.vm.network :private_network, ip: "192.168.33.100"
  config.vm.boot_timeout = 120
end
```
その他、Vagrantfileの設定でデフォルトで有効になっている箇所はvagrant-berkshelfプラグインの設定やvagrantのprovisioningの設定なので、ここでは使用しないため無効化している。適宜必要があれば有効化して下さい。


```shell-session:vagrant起動
vagrant upすると「config.vm.box」に指定したBoxをダウンロードしてVMを起動してくれる
% vagrant up
…
simply run `vagrant up`.   <= 起動完了
```

```shell-session:vagrant接続確認
vagrantのボックスが追加されていることを確認
% vagrant box list
Berkshelf-CentOS-6.4-x86_64-minimal (virtualbox)

VMのステータスを確認
% vagrant status
Current machine states:

default                   running (virtualbox)

vagrantコマンドでSSH接続
% vagrant ssh

ssh接続用のコンフィグファイルを作成して、sshコマンドでログインしてみる
% vagrant ssh-config --host myapp-test  >> ./myapp_sshconfig
% ssh -F ./myapp_sshconfig myapp-test
```

以上、SSHコマンドでの接続確認ができれば、Berkshelf init から Vagrantの設定まで完了です。

******

## Chef(knife-solo)のセットアップ

```shell-session:先ほど立ち上げたvagrantのVMをホストにknife-soloのセットアップ
% cd /tmp/vagrant-test/chef-repo/

必要があれば実行する( knife-soloの共通設定「~/.chef/knife.rb」 を作るためのコマンド。すでにファイルがある場合はこの手順はスキップする)
% bundle exec knife solo conifigure

ディレクトリ構成を初期化
% bundle exec knife solo init .

VMホストにchefの設定を初期化する
% bundle exec knife solo prepare -F ./myapp_sshconfig myapp-test
```

```shell-session:berkshelfでサードパーティのyumクックブックを定義する
% vi Berksfile
site :opscode
cookbook "yum"

サードパーティのクックブックをインストール
% bundle exec berks install --path cookbooks

yum クックブックがダウンロードできていることを確認
% ls -ls ./cookbooks/
```

以上でknife-soloのセットアップ完了


******

## knife-soloでクックブックを実行する

ここでは先ほどberkshelfでインストールしたyumのサードパーティクックブックの中のepelを入れようと思います。

```shell-session:jsonファイルにyum::epelクックブックを指定する
% cd /tmp/vagrant-test/chef-repo/
% vi ./node/myapp-test.json
{"run_list":[
    "recipe[yum::epel]"
  ]
}
```

```shell-session:knife_soloを実行する
% bundle exec knife solo cook -F ./myapp_sshconfig myapp-test 
```

以上でepelのyumリポジトリがVMのホストにインストールされていると思います。
残りはberkshelfでその他サードパーティのクックブックを入れたり、site-cookbooks以下に独自のクックブックを作ったりしてよしなにvagrantのVMを使い倒せます！