UbuntuのisoイメージからVagrant boxを作る方法


#背景
ネット上に公開されているboxではなく、最新のバージョンでのVagrantのboxが必要になった。

#目的
最新のisoイメージから最短で〜.boxファイルを生成してVagrantで利用できるようにします。

#動作確認環境
os x ver10.9.5


#必要なもの
* homebrew  

```Bash:terminal
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"```
```

* Vagrant 

```Bash:terminal
brew install vagrant
```

* Packer  

```Bash:terminal
brew tap homebrew/binary
brew install packer
````

* VirtualBox
[こちら](https://www.virtualbox.org/wiki/Downloads)からダウンロードしてください。
Macの場合は「for OS X hosts」。  

  
* boxにしたいUbuntuのisoイメージ
[Ubuntuのオフィシャルページ](http://www.ubuntu.com/download/server/)から取得してください。
  
  

#手順
## packerのテンプレートの取得
[Github上のテンプレート](https://github.com/hnakamur/my-packer-template-files)がとても便利なのでこちらを利用します。

```Bash:terminal
git clone https://github.com/hnakamur/my-packer-template-files.git
```

my-packer-template-filesというディレクトリができるのを確認します。


## template.jsonのカスタマイズ
先ほどgit coloneしたディレクトリの
my-packer-template-files/ubuntu12.04に中にtemplate.jsonがあります。
ubuntu12.04ディレクトリに移動して必要な部分を書き換えます。
※box化したいisoファイルのバージョンが12.04ではなくても問題無いです。

```JSON,template.json
(略)
      "type": "virtualbox-iso",
      "boot_command": [
        "<esc><esc><enter><wait>",
        "/install/vmlinuz noapic preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>",
        "debian-installer=en_US auto locale=en_US kbd-chooser/method=us <wait>",
        "hostname={{ .Name }} <wait>",
        "fb=false debconf/frontend=noninteractive <wait>",
        "keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA keyboard-configuration/variant=USA console-setup/ask_detect=false <wait>",
        "initrd=/install/initrd.gz -- <enter><wait>"
      ],
      "boot_wait": "4s",
      "disk_size": 10140,
      "guest_os_type": "Ubuntu_64",
      "http_directory": "http",
      "iso_checksum": "ca2531b8cd79ea5b778ede3a524779b9",
      "iso_checksum_type": "md5",
      "iso_url": "/Users/myaccount/iso/ubuntu-14.04.1-server-amd64.iso",
(略)
```

書き換える箇所は「 **"type": "virtualbox-iso"** 」配下の以下の項目

| 設定項目 | 設定値(例) | 説明 |
|:-----------|:------------|:------------:|
| iso_checksum | ca2531b8cd79ea5b778ede3a524779b9 | 対象のisoのmd5ハッシュ値(調べる必要あり) |
| iso_url | /Users/myaccount/iso/ubuntu-14.04.1-server-amd64.iso | isoファイルまでのフルパス |

* md5ハッシュ値を調べる
以下コマンドでmd5ハッシュ値が出力されます。

```Bash:terminal
md5 /Users/myaccount/iso/ubuntu-14.04.1-server-amd64.iso

出力
MD5 (/Users/myaccount/iso/ubuntu-14.04.1-server-amd64.iso) = ca2531b8cd79ea5b778ede3a524779b9
```
## scripts/postinstall.shを一部修正する
そのまま実行するとアップグレードされてしまうので、該当箇所をコメントアウトする。

```Bash:scripts/postinstall.sh
apt-get -y update
apt-get -y upgrade
   ↓
#apt-get -y update
#apt-get -y upgrade
```


## Packerを実行→boxファイル出力
Packerの以下のコマンドでboxを生成。

```Bash:terminal
packer build -only=virtualbox-iso template.json
```

マシンスペックによりますが、数十分くらいで自動で終了し
「packer_virtualbox-iso_virtualbox.box」が生成されます。
※Virtualboxやterminal内でいろいろとコマンドが自動で実行されますが触らず放置しておいてください。

## vangrant box addでboxファイルを登録
先ほど生成したboxファイルをvagrantコマンドで登録します。

```Bash:terminal
vagrant box add my-ubuntu14.04 packer_virtualbox-iso_virtualbox.box
```

「my-ubuntu14.04」の部分は任意で変更可能です。
適当にわかりやすい名前をつけてください。
数分待つと、boxが登録されます。以下のコマンドで確認出来ます。

```Bash:terminal
vagrant box list

出力
my-ubuntu14.04  (virtualbox, 0)
```

## Vagrantで登録したboxを利用する
適当なからのフォルダを作成し、そのフォルダの中に移動してから
以下のコマンドを実行します。

```Bash:terminal
vagrant init my-ubuntu14.04
```
実行すると「Vagrantfile」が生成されるので、最低限の設定をします。

```Vagrantfile
(略)
↓コメントを外して有効化し、適当なipアドレスを設定します。
config.vm.network "private_network", ip: "192.168.33.10"
(略)
```

設定したら早速起動させます。

```Bash:terminal
vagrant up
```

## 起動させたUbuntuの確認
vagrant upが正常に終了したら、sshで起動したUbuntuサーバにアクセスしてみます。

```Bash:terminal
ssh vagrant@192.168.33.10
※初期ID:PASSWDは共に「vagrant」です。
```

必要に応じて、sudoコマンドを利用してapt-getや設定をしてください。
またrootに切り替えたい場合は```sudo su```を利用してください。


# まとめ
Packerを利用してisoからUbuntuのvagrant boxを生成する方法を紹介しました。
git cloneさせてもらったmy-packer-template-files内にcentos版のものも
入っているので、CentOSのものが必要になったらそちらを利用すると
きっとサクッと作れると思います。

間違い等、ありましたらご指摘をお願いします。

# 参考サイト
以下のサイトを参考にさせていただきました。ありがとうございました。

VirtualBox - PackerでVagrant用のBoxを作成したときのメモ - Qiita
http://qiita.com/ryurock/items/28690f2b1553601d684d

OSXでpackerでCentOS6.4のVirtualBox VMを作成する - Qiita
http://qiita.com/hnakamur/items/da0ed14192a18405f704

PackerでVagrantで使うVirtualBox用のboxを生成する | Fusic Developers Weblog
http://blog.fusic.co.jp/archives/3796


# 追記 [2015/03/28]
利用させて頂いているpackerのテンプレートの中の「scripts/postinstall.sh」のアップグレードコマンドの部分を
そのままに利用すると意図したバージョンのboxが出来ないことに気づいたのでその対処を追記しました。