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テンプレート書くのつらそう
- テンプレートはいろいろ公開されてるけど… (shiguredo/packer-templatesとか)