vagrant/veeweeで自分好みのubuntu1204.boxを作ってみた

vagrantに新しいインスタンスを追加するたびにapt-getして環境構築してると時間がかかってもったいないので自分用のboxを作ってみました

環境はMacOSX Mountain Lion、rbenv、ruby 1.9.3p327、vagrantはインストール済みを想定しています

veeweeのインストール

jedi4ever/veewee · GitHub https://github.com/jedi4ever/veewee

gem install veeweeしようとすると怒られました、なのでbundlerで解決しました

Gemfile

source "http://rubygems.org"

gem 'vagrant'
gem 'veewee'

bundle install

gem install bundler
bundle install

baseboxを作る

templateから欲しいテンプレートを選んでdefineします

vagrant basebox template
vagrant basebox define 'ubuntu1204' 'ubuntu-12.04.1-server-amd64'

definitionsディレクトリが作成されます、これらのファイルを編集してboxのカスタマイズを行います

-> % tree definitions
definitions
└── ubuntu1204
    ├── definition.rb
    ├── postinstall.sh
    └── preseed.cfg

definitions配下のファイルたち

definition.rb

CPU、メモリー、ディスクのサイズ指定や:boot_cmd_sequenceでOSインストーラ起動後のキー入力、preseed、ssh、postinstallの起動設定が含まれています

Veewee::Session.declare({
  :cpu_count => '1',
  :memory_size=> '2048',
  :disk_size => '10140',
  :disk_format => 'VDI',
  :hostiocache => 'off',
  :os_type_id => 'Ubuntu_64',
  :iso_file => "ubuntu-12.04.2-server-amd64.iso",
  :iso_src => "http://releases.ubuntu.com/12.04/ubuntu-12.04.2-server-amd64.iso",
  :iso_md5 => 'af5f788aee1b32c4b2634734309cc9e9',
  (snip)

postinstall.sh

apt-get -y updateやruby、chef、puppet、nfsのインストール、vagrantユーザのpubkeyの配置などを行なっています

# postinstall.sh created from Mitchell's official lucid32/64 baseboxes

date > /etc/vagrant_box_build_time


# Apt-install various things necessary for Ruby, guest additions,
# etc., and remove optional things to trim down the machine.
apt-get -y update
apt-get -y upgrade
apt-get -y install linux-headers-$(uname -r) build-essential
apt-get -y install zlib1g-dev libssl-dev libreadline-gplv2-dev
apt-get -y install vim
apt-get clean

# Installing the virtualbox guest additions
apt-get -y install dkms
VBOX_VERSION=$(cat /home/vagrant/.vbox_version)
cd /tmp
wget http://download.virtualbox.org/virtualbox/$VBOX_VERSION/VBoxGuestAdditions_$VBOX_VERSION.iso
mount -o loop VBoxGuestAdditions_$VBOX_VERSION.iso /mnt
sh /mnt/VBoxLinuxAdditions.run
umount /mnt
(snip)

このファイルの末尾に以下を追記しておきました、これは私個人で利用している環境構築スクリプトです

wget --no-check-certificate https://raw.github.com/kanetann/dotfiles/master/setup/setup.rb
/opt/ruby/bin/ruby setup.rb

preseed.cfg

debianディストリビューションの事前設定ファイルです、redhat系だとkickstart(ks.cfg)が利用されます

## Options to set on the command line
d-i debian-installer/locale string en_US.utf8
d-i console-setup/ask_detect boolean false
d-i console-setup/layout string USA

#d-i netcfg/get_hostname string dummy
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain

# Continue without a default route
# Not working , specify a dummy in the DHCP
#d-i netcfg/no_default_route boolean

d-i time/zone string UTC
d-i clock-setup/utc-auto boolean true
d-i clock-setup/utc boolean true
(snip)

baseboxをビルドする

buildします

vagrant basebox build ubuntu1204 --force --debug

Download? (Yes/No)ではYesと入力します、404エラーになる場合はdefinitions/ubuntu1204/definition.rbを開き

:iso_file => "ubuntu-12.04.1-server-amd64.iso",
:iso_src => "http://releases.ubuntu.com/12.04/ubuntu-12.04.1-server-amd64.iso",
:iso_md5 => 'a8c667e871f48f3a662f3fbf1c3ddb17',

:iso_file => "ubuntu-12.04.2-server-amd64.iso",
:iso_src => "http://releases.ubuntu.com/12.04/ubuntu-12.04.2-server-amd64.iso",
:iso_md5 => 'af5f788aee1b32c4b2634734309cc9e9',

に修正して再度buildします

virtualboxGUIが起動し、OSの自動インストールが開始されます

ISOダウンロード中にタイムアウトエラーになる場合は、definition.rbの:iso_download_timeoutを伸ばすと改善するかもしれません

baseboxをエクスポートする

自動インストールが終わり、

[ubuntu1204] The box ubuntu1204 was build successfully!

が表示されたら、boxをエクスポートしてみます

vagrant basebox export ubuntu1204

ubuntu1204.boxがエクスポートされます、このboxをvagrant box addすれば使えます

-> % vagrant basebox export ubuntu1204
[ubuntu1204] Vagrant requires the box to be shutdown, before it can export
[ubuntu1204] Sudo also needs to work for user vagrant
(snip)
[ubuntu1204] To import it into vagrant type:
[ubuntu1204] vagrant box add 'ubuntu1204' 'ubuntu1204.box'
[ubuntu1204]
[ubuntu1204] To use it:
[ubuntu1204] vagrant init 'ubuntu1204'
[ubuntu1204] vagrant up
[ubuntu1204] vagrant ssh

export時の出力結果にインポート方法と使い方が書いてあります

vagrant init 'ubuntu1204'

と指定すると、Vagrantfileのconfig.vm.boxを直接指定できるというのを初めて知りました

config.vm.box = "ubuntu1204" # 未指定だとbaseが指定されます

まとめ

これで環境構築の時間を節約できそうです

boxファイルをdropbox、definitionsディレクトリをgithubにあげておくと何かと便利そうです

kanetann/veewee_ubuntu1204 · GitHub https://github.com/kanetann/veewee_ubuntu1204