Vagrant のベースBOX を更新する

自分で作成した Debian 6.0 (squeeze) のベースBOX を作成したのだが、

  • Debian パッケージの更新
  • VirtualBox Guest Addition の更新
  • Chef の更新

を度々手動で行うのが面倒くさくなった。自動実行したいので、lucid64.box 内の postinstall.sh スクリプトを参考に自分で作ってみた。それを

  1. vagrant up で更新
  2. vagrant package で BOX 作成
  3. vagrant box add で新規 BOX を追加

の流れができればしめたもの。

bin/provision.sh

#!/bin/sh

#Updating the box
apt-get -y update
apt-get --force-yes -y upgrade
apt-get -y install linux-headers-$(uname -r) build-essential
apt-get clean

gem update chef --no-ri --no-rdoc
gem clean

#Installing the virtualbox guest additions
VBOX_VERSION=$1 #=4.1.8
VBOX_ISO=VBoxGuestAdditions_$VBOX_VERSION.iso
cd /tmp
wget http://download.virtualbox.org/virtualbox/$VBOX_VERSION/$VBOX_ISO
mount -o loop $VBOX_ISO /mnt
sh /mnt/VBoxLinuxAdditions.run
umount /mnt

rm $VBOX_ISO

apt-get -y remove linux-headers-$(uname -r) build-essential
apt-get -y autoremove

# Zero free space to aid VM compression
dd if=/dev/zero of=/EMPTY bs=1M
rm -f /EMPTY

# Removing leftover leases and persistent rules
rm /var/lib/dhcp/*

Vagrantfile で、対象の VirtualBox のバージョンをコマンドラインオプションとして指定している。

Vagrant::Config.run do |config|
  config.vm.box = "squeeze"
  config.vm.provision :shell, :inline => 
    'sh /vagrant/bin/provision.sh 4.1.8'
end

あとは、vagrant コマンドで

 vagrant up
 vagrant halt
 vagrant package --output squeeze.box
 vagrant box rm squeeze
 vagrant box add squeeze squeeze.box

を自動実行するなどすればいいのかな。

Windows 上の場合、vagrant up を実行中、grub-pc パッケージを更新しようとしてダイアログが出た後操作できなくなった。Linux ではインストール完了しているように見えるが、ダイアログそのものが表示されず何とも頼りない。

更新スクリプト(provision.sh)の実行は、vagrant から実行するのではなくて、ssh などでログイン後に手動で実行したほうがいいかも。vagrant 0.9 系は、以下のように ssh で -c オプションを指定するとコマンドを実行できる。

 vagrant ssh -c 'sudo sh /vagrant/bin/provision.sh 4.1.8'

そもそも、veewee が使えれば便利なのだが、いかんせん、サードパーティ製のツールなので、
最新の Vagrant では動作してくれないため、このような仕組みを用意しようと考えた。
逆に、veewee が使えるバージョンまで落としてしまえば、良いわけなんだけどね。