vagrantの設定を色々調べて（試してみた）


[入門ChefSolo-InfrastructureasCode-1.0.0](http://tatsu-zine.com/books/chef-solo)を買ってvagrantにハマっています。
vagrantの設定について色々調べてみました。

## 環境
* mac-osx

## 事前準備に必要なもの
* virtualbox
* ruby 1.9.3p327 (rbenv) ※入っていないかたは[rbenvで複数バージョンのRubyを管理するmac os lion](http://d.hatena.ne.jp/itog/20120223/1329995531)を読んでいれてみてください
* vagrant(試したバージョンは1.1.5) ※入っていないかたは[vagrant](http://www.vagrantup.com/)からDownloadポチっと押してインストールしてきてください。

## 参考にしたサイト

* [VagrantをPluginで拡張する](http://www.ryuzee.com/contents/blog/4310)
* [vagrant公式](http://docs.vagrantup.com/v2/getting-started/index.html)

## [vagrant](http://www.ryuzee.com/contents/blog/4292)とは？

vm(virtualbox,vmware)をコマンドラインで作成、起動などができるもの
chef-soloやるだけなら特に必要はないが、chef-soloをやる場合に何回も壊しては作るを繰り返すことになるので合ったほうが便利
ちなみにvagrantでもなくてもvirtualboxのコマンドでも頑張れば同様なことはできる。
chef-soloを使う為の箱の自動化処理部分を担ってくれる


## Vagrantfileとは

Vagrantfileはvagrantの設定ファイルです
以下Vagrantfileの設定についての説明です。
またこれ以下の設定内容は全て下記のブロック内で設定してください。

```ruby:Vagtanrfile
Vagrant.configure("2") do |config|
.
.
#このブロック内で定義してください。
end
```


## config.vm.box

[Command-Line Interface Box](http://docs.vagrantup.com/v2/cli/box.html)

vagrant内部で持つvmの名前です。
これは

```shell
vagrant box add {任意のvm名称}
```

の{任意のvm名称}の部分にあたります。
設定は下記にような形になります

```ruby:Vagrantfile
config.vm.box = "{任意のvm名称}"
```

[公式](http://docs.vagrantup.com/v2/cli/box.html)より

> The name argument of this command is a logical name, meaning you can effectively choose whatever you want. This is the name that Vagrant searches for to match with the config.vm.box setting in Vagrantfiles.

ちょっと英語が読めませんがvagrant box add したものと同一でなければいけません（多分合ってる）。

また勘違いしやすいのですがこれとGUIの管理ツールから見えるbox名前は一致しません。
これは後で説明します。

## config.vm.provider

[Providers Configuration](http://docs.vagrantup.com/v2/providers/configuration.html)

provider (virtualbox,vmware等)の基本設定を変更することができます。

### boxの名称の変更

virtualboxのGUI上で見える名前を設定したい場合は

```ruby:Vagrantfile
  config.vm.provider :virtualbox do |vb|
    vb.name = "{任意の名前}"
  end
```

とすれば名前を変更できます。
vb.nameとvagrantで操作するbox名は一致しません。
あくまでvirtualbox上のGUIの名前になります。

### メモリの設定

仮想boxのメモリの割り当てを変更したい場合は

```ruby:Vagrantfile
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "変更したいメモリ(Mbyte単位)"]
  end
```

とすればメモリの割り当てを変更できます。


## config.vm.network

[Networking Basic Usage](http://docs.vagrantup.com/v2/networking/basic_usage.html)

vmのネットワーク設定です。
[vagrantbox.es](http://www.vagrantbox.es/)のcentos6.4だとデフォルトはNATのポートフォワーディングのみの設定なので
自分はHostOnlyAdapterの設定を追加しています。

```ruby:Vagrantfile
config.vm.network :private_network, ip: "ゲストOS側の割り当てたい任意のIPアドレス"
```

他にもportフォワーディングとかbrigeとか設定できるみたいですが試していないので割愛します。


## config.vm.provision

[Provisioning Basic Usage](http://docs.vagrantup.com/v2/provisioning/basic_usage.html)

vmの起動後に実行してくれる設定を持たすことができます。
起動後に前処理をしてくれるイメージで問題有りません。

#### :shell

前処理をshellで実行出来ます。
設定は下記のようになります。

```ruby:Vagrantfile
config.vm.provision :shell, :path => "{任意の名前}.sh"
```

この例ですとvmの起動後カレントの{任意の名前}.shを実行するという処理になります。(起動時毎回)

ちなみに自分は[vagrantbox.es](http://www.vagrantbox.es/)から取ってきたCentOS 6.4 x86_64 Minimal (VirtualBox Guest Additions 4.2.8, Chef 11.4.0, Puppet 3.1.0)のboxが最初rsyncが入ってなくて初回chef-soloを実行するとエラーになったので
{任意の名前}.shを下記にように書きました。

```shell:provisioning.sh
#!/usr/bin/env bash
#
# provisioning shell
# @see http://docs.vagrantup.com/v2/provisioning/shell.html
#

set -e

# rsyncパッケージがデフォルトで入っていない場合はインストールする
if ! yum list installed | grep rsync >/dev/null 2>&1; then
    yum -y install rsync
fi
```

また:inlineというものもあって.shでなく直接Vagrantfileに書いて実行できるようです。試していないので説明は公式に譲ります。

 
```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  # ... other configuration

  config.vm.provision :shell, :inline => "echo hello"
end
```


他にも

* chef-soloの設定
* puppetの設定
* chef-cliantの設定

ができるみたいですが試していなので割愛します。

## config.vm.synced_folder

共有フォルダの設定です。
デフォルトは

* ホスト側はVagrantfileがおいてあるカレントディレクトリ
* ゲスト側は/Vagrant

が共有フォルダとして設定されていますが上記内容を変更出来ます。

```ruby:Vagrantfile
  config.vm.synced_folder "ホスト側のディレクトリ", "ゲスト側のディレクトリ"
```

## [おまけ]vagrant pluginコマンドについて

vagrantはいろんなプラグインがgemで出まわってます。

http://rubygems.org/search?utf8=%E2%9C%93&query=vagrant

このpluginをvagrantに食わせる場合は

```shell
vagrant plugin install {gemの名称}
```

で入れられます。
有名どころだと[sahara](http://www.ryuzee.com/contents/blog/6555)とかもこれでinstallできます。

ちなみに[vagrantboxes](http://rubygems.org/gems/vagrantboxes)のpluginは自分の環境では上手く動作しませんでした。

### vagrant-vbguest plugin

Guest Additionsの自動更新をしてくれるもの

```
vagrant plugin install vagrant-vbguest
```

## [余談]作ったvagrantのVMについて

vagrantで作ったvmはGUI上で除去などすると
設定ファイルが残ったままになるので再度同じ名前のboxを作ろうするとエラーになります。
そんな時は~/.vagrant.dの削除をしてみてください。


今日はここまで調べたのでまた調べたらこの記事に追記していこうかと思ってます。