veeweeを使ってVagrantのBoxを自作してみた

/

veewee

veeweeはRubyによって作られたVagrantのBoxを作成するツールです。
テンプレートを利用してISOファイルからBoxを作る事が出来ます。
veewee/github

インストール

vagrant

veeweeはVagrantのBox作成ツールなので実行環境にVagrantがインストールされている必要があります。
Vagrant(&VirtualBox)で作る仮想開発環境/Koltatt

veeweeのインストール

veeweeは直接Rubygemsからインストールする事も出来ますが、今回はbundlerを使っていきます。

mkdir ~/veewee
cd ~/veewee
#Gemfileの作成
$ bundle init
#Gemfileにveeweeのダウンロードを指定
gem “veewee”
#bundlerでgemのインストール
$ bundle install --path vendor/bundle

bundlerによるgemのバージョン管理/Koltatt

bundlerでnokogiriがインストール出来ないトラブル

bundlerでveeweeをインストールしようとしたところ、nokogiriがインストールされていないというエラーが出たので以下のサイトを参考にしてシステムからnokogiriを使うように設定しました。

$ sudo apt-get update 
#必要なライブラリを追加
$ sudo apt-get install libxml2-dev libxslt-dev
#nokogiriをシステムからビルドするように設定
$  bundle config build.nokogiri --use-system-libraries
#再度bundlerでインストール
$ bundle install --path vendor/bundle

設定を変更して無事veeweeのインストールが出来ました。

このbundlerでnokogiriが読み込めないというのは他のgemの場合でも結構頻繁に起きるトラブルのようです。

参照

Error installing nokogiri in ubuntu 14.0.4 (Ruby 1.8.7)/StackOverflow
bundle install で nokogiri をインストールしろと言われる解決方法/qiita

テンプレートを使ってBoxを定義する

veeweeがインストール出来たので実際に試していきますが、Boxをビルドする前にテンプレートの設定をしていきます。

veeweeのコマンドの基本的な使い方

veeweeではコマンドを使用する際に仮想マシン作成ソフトをプロバイダーとして指定します。
今回はVirtualBoxを使うのでプロバイダーはvboxになります

$ veewee <provider> [command][options]

使えるテンプレートの一覧を表示する

templatesコマンドを使うと利用できるテンプレートの一覧を表示出来ます。
今回はubuntuのサーバーを使用したいのでubuntuに絞って検索を実行します。

#使えるテンプレートを表示
veewee vbox templates
#テンプレートの中からubuntuを検索
veewee vbox templates | grep -i ubuntu

使用するテンプレートを見つけたら新しいBoxを定義していきます。

$ veewee vbox define [Box name][template]
#テンプレートから新しいBoxを定義する
$ veewee vbox define 'veewee-test' 'ubuntu-14.04-server-amd64'

Boxの設定

Box作成時の設定はdefinitionsディレクトリ内のdefinition.rbによって行います。

$ vi definitions/veewee-test/definition.rb
#ISOファイルのインストール先を設定
:iso_src => "http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/14.04/ubuntu-14.04.4-server-amd64.iso",

ISOファイルのダウンロード先が国外で距離がある場合には時間がかかってしまうことがあるため距離の近いリポジトリを設定しました。

$ vi definitions/veewee-test/preseed.cfg
#ローカルを日本に設定
d-i debian-installer/locale string ja_JP.utf8
#タイムゾーンを東京に設定
d-i time/zone string Asia/Tokyo

Boxのビルド

設定ファイルの編集が済んだらbuildコマンドを実行します。

cd ~/veewee
$ veewee vbox build veewee-test

scp/net読み込めないエラー

BoxをビルドしようとしたらRubyがnet/scpが読み込めないと言われてしまったのでGemfileに追加します。

gem "net-scp"
gem "veewee"
$ bundle install

buildを再度実行

gemの追加が出来たので再びbuildコマンドを実行します。
なお今回のように仮想マシンの作成が中断された後に再びコマンドを実行するには-f(forceオプション)が必要になります。

$ veewee vbox build -f veewee-test

Boxのビルドが始まるとISOファイルのダウンロードの実行を訊かれるのでyesと入力します。
またこの時VirtualBoxが起動します。
設定などに問題が無ければ特に操作する必要はないですが、エラーの際にはVirtualBoxの画面にセットアップの途中経過が表示されるので参考にする事が出来ます。

Boxの作成が無事に終わるとターミナルに成功の文字が表示されます。

The box veewee-test was built successfully!

確認のために一度仮想マシンに接続します。

#パスワードを聞かれますがユーザー名がvagrantとなっているので同じくvagrantと入力します。
veewee vbox ssh veewee-test

接続の確認が出来たらBoxを作成するために一度仮想マシンをシャットダウンします。

$ sudo shutdown -h now

シャットダウンを実行したらこの仮想マシンを元にBoxを作成します。

veewee vbox export veewee-test

処理が完了するとveeweeを実行したディレクトリ内にBoxが作られるので、このBoxをVagrantに追加します。

$ vagrant box add mybox/veewee-test veewee-test.box
#box一覧の確認
$ vagrant box list

bento/centos-7.2   (virtualbox, 2.2.5)
laravel/homestead  (virtualbox, 0.4.4)
mybox/veewee-test  (virtualbox, 0)

Boxの一覧から他のBoxと同じようにVagrantに追加されているのが確認出来ます。

作成したBoxは他のサイトからダウンロードしたBoxなどと同様にVagrantの仮想マシンの作成が実行出来ます。

#vargantfileの作成
$ vangrant init mybox/veewee-test

#仮想マシンの立ち上げ
$ vagrant up

#仮想マシンの起動の確認
$ vagrant status
default                   running (virtualbox)

#仮想マシンに接続
$vagrant ssh

#veeweeで設定したスクリプトによってRubyがインストールされている事が確認出来る。
ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]

あとがき

最初はveeweeでVagrantのBoxを簡単に…と思ったのですが、正直結構手間取りました。
またテンプレートが古いバージョンのものしかなかったり多少融通の効かない部分もありましたが、初めて自分でBoxを作ったので設定ファイルの書き方などは参考になりました。
テンプレートの変更も色々出来るので、今回は使いませんでしたがchefなんかのプロビジョニングツールと合わせて色々カスタムして使うと便利だと思います。