Create a Vagrant Box from an existing Virtualbox image

概要

packer を使って既存のVirtualboxのイメージからVagrantのboxを作ってみますよ

※ 最初からvagrant使っている場合はvagrant packageコマンドでbox作成出来るます

まずboxの元になるvirtualboxイメージをova形式でエクスポートする

packerでvirtualboxのイメージをビルド元のタイプに指定したい場合、イメージの拡張子はovfかovaである必要があるのでまずはこれを用意します

virtualboxのエクスポート機能を使います

このときovfのバージョンは2.0を選ぶこと

When exporting from VirtualBox make sure to choose OVF Version 2, since Version 1 is not compatible and will generate errors like this: ...

拡張子がova, ovfと選べます
違いはwikipediaより

OVFファイルは XML で記述されており、仮想機械に関するさまざまな属性情報が記載されている。 一般には、このOVFファイルと、各種イメージ (Xen, KVM, VMware) などをTAR形式で1つのファイルにまとめた OVA (Open Virtualization Format Archive) ファイル形式で提供される。

特にこだわりがなければovaで良いと思います
エクスポート先はデフォルトだと~/Documents/以下でした

packerのテンプレートファイルを作成する

この辺見ながら作成します
いろいろオプションがありますがまずは最低限で…(๑˃̵ᴗ˂̵)و

my_box.json

{
  "builders": [
    {
      "type": "virtualbox-ovf",
      "source_path": "my_box.ova",
      "ssh_username": "vagrant",
      "ssh_password": "vagrant",
      "shutdown_command": "echo 'vagrant' | sudo -S /sbin/shutdown -h now"
    }
  ],
  "post-processors": [
    {
      "type": "vagrant",
      "output": "my_box.box"
    }
  ]
}

buildersの設定は見ての通り、ビルドに使うイメージのタイプを指定したり、ovaファイルのpathを指定したり、sshするユーザーの定義を書いています

shutdown_commandは、ビルドの際一度vmが起動して、諸々の設定をした後にシャットダウンしてイメージを保存、という流れなのでそのシャットダウンの際に使うコマンドを指定しています
何も指定しないと5分後に強制シャットダウンだった気が…

post-processorsでは、イメージをビルドした後に行われる処理を書くことが出来るみたいです

今回vagrantのbox形式に出力するようにタイプを設定しています

あと、デフォルトだとpacker_virtualbox-ovf_virtualbox.boxのような名前でビルドされるので、outputの設定でmy_box.boxとなるように設定しています

設定の確認

以下のようにシンタックスチェックできます

$ packer validate my_box.json
Template validated successfully.  

ビルド実行

いよいよビルドします

$ packer build my_box.json

途中でvmが立ち上がりますが見守りましょう ව̐ ˒̫̮ ව̐

無事終わると実行したディレクトリにmy_box.boxが作成されます

Vagrantで使用する

いよいよVagrantで使ってみます

といってもVagrantfileで作成したboxのpathを指定するだけ

注意点

vagrant upしても、鍵がないと起動が終わらないので、ビルドする前に予め使いたい鍵の設定しておく必要がある!
.vagrant/machines/default/virtualbox/private_key仕込んだりとか(設定でいい感じにできるのかな?あんまり調べてない)

感想

  • イメージという塊でインフラ管理することをらくちんに&自動化できる。USE CASES
  • 手元のvagrantで作ったものをawsやdigitaloceanに移すことができそう(まだ試してない)
  • packerテンプレート書くのつらそう