ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

vagrantのVMをpackageを使ってBox化する

はじめに

基本的にvagrantで作ったVMは、使い終われば消す。使うときにまた作る。それがリソース面での大きな利点なので。
初期設定はprovisionでシェルに書いてしまうので、途中の状態でBox化する必要はない。(別にyumのインストールの時間も気にならない)
ただ、前回の記事のように初期設定にGUI操作があって完全自動化したい場合はそれでは困るので、設定完了後の状態からBox化しようと思う。

方法

vagrant packageコマンドを使用する。

ネットワークデバイス情報削除、VM停止

[root@phpipam vagrant]# sudo rm /etc/udev/rules.d/70-persistent-net.rules
# 抜ける
MacBook-Air:techstudy take$ vagrant halt phpipam
==> phpipam: Attempting graceful shutdown of VM...
==> phpipam: Removing hosts
Password:

packageコマンド実行

MacBook-Air:techstudy take$ vagrant package phpipam
==> phpipam: Clearing any previously set forwarded ports...
==> phpipam: Exporting VM...
==> phpipam: Compressing package to: /Users/take/vagrant/techstudy/package.box

boxに追加

MacBook-Air:techstudy take$ vagrant box add phpipam package.box 
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'phpipam' (v0) for provider: 
    box: Unpacking necessary files from: file:///Users/take/vagrant/techstudy/package.box
==> box: Successfully added box 'phpipam' (v0) for 'virtualbox'!

追加を確認

MacBook-Air:techstudy take$ vagrant box list
CentOS66   (virtualbox, 0)
CentOS7    (virtualbox, 0)
phpipam    (virtualbox, 0)
ubuntu1404 (virtualbox, 0)

作ったboxからVMを作成する

新規に別のディレクトリを作成する。Vagrantfileは以下のように作成して、vagrant upすると既にデータベースがインストールされた状態で作成された。

Vagrantfile

Vagrant.configure(2) do |config|

  config.vm.box = "phpipam"
  config.vm.define :phpipam do | phpipam |
    phpipam.vm.hostname = "phpipam"
    phpipam.vm.network :private_network, ip: "192.168.33.16"#, virtualbox__intnet: "intnet"
  end

end

provissionした状態でBox化したるのでprovisionは不要。networkは作成する必要はあるけど、ipは指定しなくてもいいかもしれない。

おわりに

provissionが全自動できない場合や、時間がかかる場合は設定完了後に再Box化(package)すると良いですね。

調べ途中、Boxをバージョン管理できるみたいなので次回はその方法を試して、インストール段階ごとにバージョン化してみたいです。