chef-soloで使用するvirtualbox(vagrant)をveeweeを使用して作る


[入門ChefSolo-InfrastructureasCode-1.0.0](http://tatsu-zine.com/books/chef-solo)を買ってchefにハマっています。
[Vagrantbox.es](http://www.vagrantbox.es/)のvirtualboxですが外部にあるのでいつ変更されるかわからないとなるとせっかく作ったchefが思わぬところでエラーになるかもしれないのでveeweeを使ってカスタマイズして作ろうと思った時のメモ

## ゴール

centos6.4-x86-minimalをカスタマイズして自分用のcentos6.4のvboxを作成すること

## 写経時間

約30分

## 環境
* mac-osx

## 事前準備に必要なもの
* virtualbox
* ruby 1.9.3p327 (rbenv) ※1.9.3-p286でもいけた
* xcode 
※ commandLineToolが必要です。入れていない方は[Installing Command Line Tools on OS X Mountain Lion](http://d.hatena.ne.jp/agw/20120730/1343711730)を参考にインストールしておいてください。

* XQuartz ※入れていない方は[XQuartz](http://xquartz.macosforge.org/landing/)いってXQuartz-2.7.4.dmgをポチっと押してインスコしておいてください
* git

## 参考にしたサイト

* [Vagrantで再現可能な仮想マシン開発環境をMacに構築する](http://qiita.com/items/a2464c27008decbfb9dc)
* [Vagrantで簡単仮想マシン構築](http://www.ryuzee.com/contents/blog/4292)
* [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を使う為の箱の自動化処理部分を担ってくれる


## [veewee](https://github.com/jedi4ever/veewee)とは？

vagrantで使用するvboxを作成するために補助してくれるツール
veeweeのテンプレートを使用していろんなOSのvagrantを作成することができます。
chef-soloを使う為の箱の設定を細かく簡単に指定できるツール。

## vagrant(公式サイト)からのインストール

[vagrant](http://www.vagrantup.com/)からDownloadとこいってインストールしてきてください。
公式はinstallerを各OSに提供しています。
コマンドラインがお好きな方はマウントまでこれで

```shell
curl -o Vagrant.dmg http://files.vagrantup.com/packages/64e360814c3ad960d810456add977fd4c7d47ce6/Vagrant.dmg
hdiutil mount Vagrant.dmg
```

## bundlerを入れる

[Vagrantで再現可能な仮想マシン開発環境をMacに構築する](http://qiita.com/items/a2464c27008decbfb9dc)と一緒です

```shell
gem install bundler
```

## veeweeをgitでcloneする

[Vagrantで再現可能な仮想マシン開発環境をMacに構築する](http://qiita.com/items/a2464c27008decbfb9dc)と一緒です

```shell
git clone git://github.com/jedi4ever/veewee.git
cd veewee
bundle install
```

## veewee用のvagrantを入れる

### veeweeのGemfileを修正してbundleのvagrantを入れる

```shell:veewee/Gemfile
#修正前
group :test do
  gem "rake"
  #gem "vagrant" , "1.0.7" #コメントアウトになってるので
  #gem "chef"
  #gem "knife-windows"
end



#修正後
group :test do
  gem "rake"
  gem "vagrant" , "1.0.7" #コメントアウトを外す
  #gem "chef"
  #gem "knife-windows"
end
```

```shell
cd veewee
bundle update
bundle install
```

veewee用といってるのは[公式vagrant](http://www.vagrantup.com/)installerのvagrantではbasebox defineコマンドがないので入れられない為veewee用のvagrant (1.0.7)を入れる必要があるのです。

※ココらへんはruby知らないのでよくわからん。

## veeweeのテンプレートからcentos6.4-x86-minimalを自分用にコピーする

説明合ってるのかな？

```shell
bundle exec vagrant basebox define {任意の名前} CentOS-6.4-x86_64-minimal
```

このコマンドで```veewee/defintions```に{任意の名前}という名前のディレクトリが作成され設定ファイル郡ができます

defineの後の引数はvbox名にもなるのでお好きな名前でどうぞ

## 自分用に設定をカスタマイズする

自分が編集した部分は下記です

### veewee/definitions/centos6.4-x86/definition.rb

```shell:veewee/definitions/centos6.4-x86/definition.rb
  :disk_size => '25600', #Mバイト単位で指定してください。今回は25GBで設定しました
  :iso_src => "ftp://ftp.riken.jp/Linux/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-minimal.iso", #これ変更しないと時間かかる
```

veewee/definitions/centos6.4-x86/definition.rbでユーザーとかも変更出来ます。

### veewee/definitions/centos6.4-x86/ks.cfg

```shell:veewee/definitions/centos6.4-x86/ks.cfg
lang ja_JP.UTF-8 #日本語
timezone Asia/Tokyo #timezone
```

### veewee/definitions/centos6.4-x86/base.sh

vmを作成後に実行するものっぽい

```shell:veewee/definitions/centos6.4-x86/base.sh
yum -y install gcc make gcc-c++ kernel-devel-`uname -r` zlib-devel openssl-devel readline-devel sqlite-devel perl wget dkms nfs-utils rsync
#最後にrsync追加した
```

最後にrsyncを追加したのは[Vagrantbox.es](http://www.vagrantbox.es/)のcentos6.4-x86には最初rsyncが入ってなくchef soloを実行しようとするとエラーになったので最初に入れます。
（そもそもこれが原因でvboxをインストール後ワンライナーでchefでインストール出来ないじゃんって思ってイラッと来てveeweeに手を出した）
きっとchef solo自体がリモートのosにchefコマンドを実行するのにrsyncを使ってる為だと思います。（きっとそう）

## vboxをビルド（作成する）

iso落とす？って質問されますので「Yes」って答えた後はコーヒーでも飲んでじっくり待ちましょう（約10分くらい）

```shell:veewee/definitions/centos6.4-x86/base.sh
bundle exec vagrant basebox build centos6.4-x86
```

また最後に

```shell
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 7222 -l veewee 127.0.0.1
```

とコンソールで出力されるのでコピーして作成されたvboxにssh越しにログインできるか確認してください(パスワードはveewee/definitions/centos6.4-x86/definition.rbで設定したもの今回ならveewee)

## vboxファイルのエキスポート

[Vagrantで再現可能な仮想マシン開発環境をMacに構築する](http://qiita.com/items/a2464c27008decbfb9dc)と一緒です(助かりました)
これでインポート用のベースとなるvboxは作成完了です。
(veeweeの役目もここまで)

```shell
bundle exec vagrant basebox export {任意の名前}
#{任意の名前}.boxというvboxができます
```

## veeweeで作った{任意の名前}.boxを使用する

veeweeはあくまでosの雛形を作成するのが目的なのでveewee以外のディレクトリで作業したほうがいいと思います（別にそのままやっても問題無いです）

```shell
mkdir chef-soloでchefりたいディレクトリ
cd chef-soloでchefりたいディレクトリ
vagrant box add {任意の名前} veeweeで作成した.vboxのパス #vagrantにboxを追加
vagrant init {任意の名前} #設定ファイルVagrantfileを作成する
vagrant up #vboxを立ち上げる
```

以上でchef-soloまでの前準備は以上です。

[Vagrantで再現可能な仮想マシン開発環境をMacに構築する](http://qiita.com/items/a2464c27008decbfb9dc)には大変お世話になりました。

## vagrantでよく使うコマンド

| コマンド | 説明 |
|:-----------|------------:|
| vagrant init      | vboxの管理用設定ファイルを作成する(基本初回のみ) |
| vagrant up      | 作ったvboxの起動 |
| vagrant ssh      | sshでvboxにログイン |
| vagrant ssh-config      | vboxのssh設定を教えてくれる。（defaultのみ） |
| vagrant ssh-config --host host名    | vboxのssh設定をHost名を変更して出力する。出力内容をホストOSの~/.ssh/configに貼り付ければssh 任意名前とかでssh接続ができる |
| vagrant halt      | vboxの停止（電源ポチ） |
| vagrant reload      | vboxの再起動 |
| vagrant resume      | vboxのレジューム |
| vagrant package      | vboxのパッケージを作るコマンド詳細は割愛 |



## ハマリどころまとめ

### 何回も同じもの作ってるとエラーになる


そんな時はカレントユーザーにある
~/.vagrant.dをmvしましょう。
（正直中身は知りません）
大体のエラーの時に一回これをmvすると上手く行く
要は設定を新規にするのです。

### Vagrantfileがすでにあるよって怒られる

そんな時はカレントディレクトリにある
Vagrantfileをmvしましょう。
(vboxの設定項目です。)


### A VirtualBox machine with the name 'centos6.4-x86' already exists.って怒られる

vboxを削除するか

```shell
vagrant box add {任意の名前} --force veeweeで作成した.vboxのパス
```

--forceをつけましょう。(強制的に作り直します)

## 所感

ちなみにrubyは全く知りません。
classってどうやって作るの？レベルです。
でも少しやればできるレベルでした。（基本は設定いじるだけなのでrubyを書くことはない）
昔と現在で設定ファイルの書き方が若干変わってるみたいなのでそんな時は[vagrant公式のドキュメント](http://docs.vagrantup.com/v2/getting-started/index.html)を見てみましょう。[opscode(chefの開発元)](http://docs.opscode.com/)みたいに膨大なドキュメントとかないので英語でも見やすいです。

chefをやってみたい！！って方の手助けになればと思います。