vagrantでvmをサクッと作る

vagrantとBerkshelfでvmを作ってみた際の手順をまとめておきます。

##準備
### VirtualBoxのインストール
以下のサイトからインストーラをダウンロードしてインストールします。
https://www.virtualbox.org/wiki/Downloads

### vagrantのインストール
`Vagrant is no longer distributed as a RubyGem`だそうですので本家サイトからダウンロードして、インストールします。
http://www.vagrantup.com/downloads.html

### vagrantのプラグインインストール
vagrantでberkshelfを使う場合にはプラグインが必要ですので、このタイミングで入れておきます。

```
vagrant plugin install vagrant-berkshelf --plugin-version 2.0.1
```
```
vagrant plugin install vagrant-omnibus
```

### berkshelfのインストール
こちらはgemでいれます。

```
gem install berkshelf
```


##vm作成
###cookbookの作成
berksコマンドでcookbookを作ります。これをやると一通りのひな形ができるので、後は作られたファイルをいじっていく事になります。

```
% berks cookbook sandbox
      create  sandbox/files/default
      create  sandbox/templates/default
      create  sandbox/attributes
      create  sandbox/libraries
      create  sandbox/providers
      create  sandbox/recipes
      create  sandbox/resources
      create  sandbox/recipes/default.rb
      create  sandbox/metadata.rb
      create  sandbox/LICENSE
      create  sandbox/README.md
      create  sandbox/CHANGELOG.md
      create  sandbox/Berksfile
      create  sandbox/Thorfile
      create  sandbox/chefignore
      create  sandbox/.gitignore
         run  git init from "./sandbox"
      create  sandbox/Gemfile
      create  sandbox/Vagrantfile
```

bundlerが入ってないと

```
By default, this cookbook was generated to support bundler, however, bundler is
not installed.
To skip support for bundler, use --no-bundler
To install bundler: gem install bundler
```
とかいわれますので、気になる場合は`gem install bundler`で入れておきましょう。

###Vagrantfileをいじる
ひな形のVagrantfileはこんな感じ.(コメントは消してあります。

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

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.require_version ">= 1.5.0"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.hostname = "sandbox-berkshelf"
  config.omnibus.chef_version = :latest
  config.vm.box = "opscode_ubuntu-12.04_provisionerless"
  config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box"
  config.vm.network :private_network, type: "dhcp"
  config.berkshelf.enabled = true
  config.vm.provision :chef_solo do |chef|
    chef.json = {
      mysql: {
        server_root_password: 'rootpass',
        server_debian_password: 'debpass',
        server_repl_password: 'replpass'
      }
    }

    chef.run_list = [
        "recipe[sandbox::default]"
    ]
  end
end
```

なにも替えなければubuntu-12.04が入ります。今回は個人的に普段使う事が多いcentosを入れることにしました。あとvmのipも指定しています。

```diff
   config.omnibus.chef_version = :latest

   # Every Vagrant virtual environment requires a box to build off of.
-  config.vm.box = "opscode_ubuntu-12.04_provisionerless"
+  config.vm.box = "opscode_centos-6.5_chef-provisionerless"

   # The url from where the 'config.vm.box' box will be fetched if it
   # doesn't already exist on the user's system.
-  config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box"
+  config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"

   # network interface) by any external networks.
-  config.vm.network :private_network, type: "dhcp"
+  config.vm.network "private_network", ip: "192.168.50.4"
```

### vagrant up
準備が整いましたのでvmを作ります。Vagrantfileがあるディレクトリで以下を実行します。

```
vagrant up
```
このコマンド一発でvmを作ってchefのrecipeを実行してくれます。


今回はここまで。
次にやる気があったらrecipeを書いてrailsが動く所くらいまでまとめたいと思います。
しかし、最近はどんどん便利になりますね。はー。よい。