VagrantでBase Boxを作成するところまでやってみた(社内勉強会発表候補ネタ)
結構前に存在を知ってから全然触っていませんでしたが、少々触ってみたのでその記録をつけておきます。詳しい話は本家のドキュメントか、他所で書かれている記事などを参照すると良いと思います。
今回行ったことは、Vagrantで仮想マシンの種を使って環境を作成するための前段階。種作りです。Vagrantは仮想マシンを利用しますが、仮想マシン自体の構築は行いません。事前に作られているBase Boxと呼ぶ仮想マシンのひな形を利用します。
以下のサイトでたくさんのBase Boxが公開されていますが、インストール厨としてはインストールを飛ばしてしまっては旨みがが無くなってしまうので、Base Boxを作るところから手をつけようと考えた次第です。
実行環境を準備する
VagrantはRubyで書かれており、gemで配布されています。なので、Vagrantはgem install vagrantでインストール出来ます。
付録: Vagrantを実行するためのRuby環境を構築する(OSX)
$ mkdir vagrant $ cd vagrant $ brew install rbenv $ brew install ruby-build $ rbenv install 1.9.2-p290 $ rbenv local 1.9.2-p290 $ rbenv rehash $ gem install bundler $ bundle install --path vendor/bundler
Gemfileは適当に。rbenv-gemsetを使ってみようか悩みつつ結局Bundler。
source :rubygems gem 'vagrant' gem 'veewee'
Virtual Boxが必要なのでダウンロードページからバイナリをダウンロードしてインストールしておきます。
※ こっそりveeweeというgemをインストールしていますが、このgemを利用して仮想マシンの作成を行います。開発用gemと思わしき依存gemが普通にインストールされて驚きましたがスルーしておきます。
付録: 新調したMac(Lion)でRubyをコンパイル出来ない場合
XCode4.2以降ではGCCを含まないため別途GCCをインストールする必要があるので、適当な方法でGCCを使える様にする必要があるのは皆様ご存じの通りです(Googleで大量の記事が見つかりますね)。
- インストーラ: https://github.com/kennethreitz/osx-gcc-installer
- Homebrew: https://github.com/adamv/homebrew-alt/blob/master/duplicates/apple-gcc42.rb
- Homebrew: https://github.com/adamv/homebrew-alt/blob/master/duplicates/gcc.rb
※ rbenvはGCCがgcc-*というパターンでPATHにあれば環境変数CCにセットしてコンパイルする仕組みになっています。
Base Boxを自作する
それでは、本題のBase Box作りの工程となります。
VeeWeeを使って作る
以下のコマンドを実行すると、利用できるテンプレートの一覧を表示させることが出来ます。表示されたテンプレートから、好みのテンプレートを選択します。
$ bundle exec vagrant basebox templates
利用するテンプレートが決まったら、新しいBase Boxを定義します。
$ bundle exec vagrant basebox define fftt CentOS-6.0-x86_64-netboot
準備が整ったら以下のコマンドを実行して仮想マシンを作成し、OSのインストール、サーバの設定を行います。
$ bundle exec vagrant basebox build fftt
実はdefineとbuildの間に作業が必要です。少なくとも、2012/01/28時点のCentOS-6.0-x86_64-netbootを使うと途中で止まってしまいます。なぜ止まるかという話をする前に、buildで何が行われるかについて、手を抜いて簡単に説明します。
- defineの実行によってdefinitions/fftt/以下に3つのファイルが作成される
- definition.rb
- ks.cfg
- postinstall.sh
- definition.rbの内容に従ってVirtual Boxの仮想マシンを作成する
- definition.rbがキックスタートする設定になっているため、ks.cfgに従って処理が進められる
- インストールが終わりssh接続できる様になった後、postinstall.shが実行される
CentOS-6.0-x86_64-netbootを使ったbuildが途中で止まる原因ですが、URLとRAMサイズの指定が適切で無いというものでした。以下に修正内容を記載しておきます。
diff -NBaur -r definitions/fftt.orig/definition.rb definitions/fftt/definition.rb --- definitions/fftt.orig/definition.rb 2012-01-28 03:45:58.000000000 +0900 +++ definitions/fftt/definition.rb 2012-01-28 03:46:07.000000000 +0900 @@ -1,9 +1,9 @@ Veewee::Session.declare({ - :cpu_count => '1', :memory_size=> '392', + :cpu_count => '1', :memory_size=> '512', :disk_size => '10140', :disk_format => 'VDI', :hostiocache => 'off', :ioapic => 'on', :pae => 'on', :os_type_id => 'RedHat_64', :iso_file => "CentOS-6.0-x86_64-netinstall.iso", - :iso_src => "http://be.mirror.eurid.eu/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-netinstall.iso", + :iso_src => "http://ftp.jaist.ac.jp/pub/Linux/CentOS/6/isos/x86_64/CentOS-6.2-x86_64-netinstall.iso", :iso_md5 => "d13da95c29e585ee15cf403b89468243", :iso_download_timeout => 1000, :boot_wait => "15", :boot_cmd_sequence => [ '<Tab> text ks=http://%IP%:%PORT%/ks.cfg<Enter>' ], diff -NBaur -r definitions/fftt.orig/ks.cfg definitions/fftt/ks.cfg --- definitions/fftt.orig/ks.cfg 2012-01-28 03:45:58.000000000 +0900 +++ definitions/fftt/ks.cfg 2012-01-28 03:58:54.000000000 +0900 @@ -1,5 +1,5 @@ install -url --url=http://be.mirror.eurid.eu/centos/6.0/os/x86_64/ +url --url=http://ftp.jaist.ac.jp/pub/Linux/CentOS/6/os/x86_64/ lang en_US.UTF-8 keyboard us network --bootproto dhcp diff -NBaur -r definitions/fftt.orig/postinstall.sh definitions/fftt/postinstall.sh --- definitions/fftt.orig/postinstall.sh 2012-01-28 03:45:58.000000000 +0900 +++ definitions/fftt/postinstall.sh 2012-01-28 04:23:56.000000000 +0900 @@ -2,7 +2,7 @@ date > /etc/vagrant_box_build_time -yum -y erase wireless-tools gtk2 libX11 hicolor-icon-theme avahi freetype bitstream-vera-fonts +# yum -y erase wireless-tools gtk2 libX11 hicolor-icon-theme avahi freetype bitstream-vera-fonts yum -y clean all gem install --no-ri --no-rdoc chef
最後にパッケージングをする必要がありますが、それはまた後日。
追記:2012/02/01
.boxファイルの作成は以下で実行できます。
$ bundle exec vagrant basebox export fftt
.boxファイルを作る前にvalidateコマンドで検証すると良いのかもしれませんが、validateの内容を把握できていません。
$ bundle exec vagrant basebox validate fftt