初心者によるchef-solo,vagrant,berkshelf等で作るrails+mysqlの環境 その２

## はじめに
[前回](http://qiita.com/syou007/items/04e1f8a4439a69b6dbb2)はvagrantに付属しているchefの機能で環境を構築しました。

しかし、この方法では実際のサーバーにセットアップすることができないので今回は実際のサーバーに設定するイメージでvagrantを使って環境構築をしていきます。

[前回](http://qiita.com/syou007/items/04e1f8a4439a69b6dbb2)と重複するところもありますが、このページだけで完結させたいため重複内容もそのまま残しておきます。

## Macに必要なものを入れる。
今回参考にさせていただいたページはこちらです。（というか、参考サイトを理解できる人は僕の記事を読む必要は無いです・・・）

[ChefでRails環境を構築(Ruby+Nginx+Unicorn+PostgreSQL+Redis+Fluentd)](http://ruby-rails.hatenadiary.com/entry/20150721/1437404524)

### Vagrant
まずはこちらからVagrantをインストールする。
[https://www.vagrantup.com/downloads.html](https://www.vagrantup.com/downloads.html)

### VirtualBox
こちらも同様にインストールする。
[https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads)

### vagrant-omnibusのインストール
今回は使用しません。

### chefとknife-soloを入れる。
今回メインで使用するchefを入れます。
その際に`knife-solo`も一緒に入れておきます。

```sh
$ gem install chef
$ gem install knife-solo
```

以下のコマンドで設定ファイルを作成する。

```sh
$ knife configure
```

※全てエンターでOK。ってか、これがどのように使われているのだろうか・・・？

### berkshelfを入れる。
berkshelfはクックブックの管理ツール。

```sh
$ gem install berkshelf
```

## 実際に実行してみる
ここまでが前段階です。
次からは実際に構築していきます。

### chefリポジトリを作成
まずは`chefリポジトリ`を作成します。

```sh
$ mkdir chef-rep-test
$ cd chef-rep-test
$ knife solo init .
```

### 使用するクックブックを取得します。
[前回](http://qiita.com/syou007/items/04e1f8a4439a69b6dbb2)と同じ手順でクックブックを取得します。

```sh
$ vi Berksfile
```

ファイルに以下の記述を行います。

```ruby
source "https://supermarket.chef.io"

cookbook 'git', '~>4.1.0'
cookbook 'rvm', '~>0.9.2'
cookbook 'mysql', "~> 5.3.6"
```

実際にクックブックを取得します。

```sh
$ berks vendor cookbooks
```

※berksは無くなるとか・・・。

### Vagrantを立ち上げます。
今回は`centos`を使ってみます。
上記の`chef-rep-test`とは別のディレクトリに立てます。

```sh
$ mkdir centos65
$ cd centos65
$ vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
$ vagrant init centos65
```

設定ファイルに以下のように設定します。

```sh
$ vi Vagrant
```

```ruby
Vagrant.configure(2) do |config|
  config.vm.box = "centos65"
  config.vm.network "private_network", ip: "192.168.33.11"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
end
```

とりあえず、最低限の設定だけ記載します。

```sh
$ vagrant up
```

Vagrantを立ち上げて`ssh`でアクセスできるようにします。

```sh
$ vagrant ssh-config --host centos65 >> ~/.ssh/config
```

このコマンドを実行すると`~/.ssh/config`に`ssh`で接続できる情報が書き込まれます。
もし、`~/.ssh/config`がない場合は先に作成しておいてください。

実際にアクセスしてみます。

```sh
$ ssh centos65
```

まだ`ruby`などが入っていないことを確認します。

```sh
$ ruby -v
-bash: ruby: command not found
```

### クックブックを適用します。
先ほどの`chefリポジトリ`に移動します。

```sh
$ cd chef-rep-test/
```

落としてきたクックブックを適用するための設定ファイルを作成する。
ファイル名は先ほど`vagrant ssh-config --host centos65 >> ~/.ssh/config`でつけた`centos65`で作成する。
（リモートに行う場合は`ipアドレス`や`ホスト名`になる。）

```sh
$ vi nodes/centos65.json
```

内容は[前回](http://qiita.com/syou007/items/04e1f8a4439a69b6dbb2)と同じです。

```json:nodes/centos65.json
{
    "run_list":[
      "recipe[git]",
      "recipe[mysql::server]",
      "recipe[mysql::client]",
      "recipe[rvm::system]"
    ],
    "rvm": {
      "user": "vagrant",
      "default_ruby": "ruby-2.2",
      "rubies": ["ruby-2.2"]
    },
    "mysql": {
      "service_name": "default",
      "version": "5.5",
      "server_root_password": "root"
    }
}
```

前回と同じ・・・つもりだったのですが以下の設定はcentosでは不要でした。
vagrantに組み込んだchefではうまく動作したのですが`knife solo`で流し込んだ場合はうまく動作しませんでした。
調べてみると、こちらは`debian`で使用するパッケージのようでcentosでは使いませんでした。（はまった・・・）

```
      "recipe[build-essential]"
```

実際に実行する前に`chef-solo`を対象サーバーにインストールします。
（一度だけでOK）

```sh
$ knife solo prepare centos65
Bootstrapping Chef...
...
Thank you for installing Chef!
```

しばらく待つとインストールされます。
その後に実際のレシピをインストールします。

```sh
$ knife solo cook centos65
```

#### 注意点
`nodes/centos65.json`や`knife solo prepare centos65`、`knife solo cook centos65`などの`centos65`と書かれている部分は`ssh centos65`とマッチしてます。
なので、`ssh 192.168.1.1`の場合はそれぞれが`nodes/192.168.1.1.json`などになります。
また、鍵などの指定は`~/.ssh/config`に記載しておく必要があります。

とりあえず、これでインストールは完了です。

が・・・

本当にこの方法でいいのだろうか・・・・？