こしごぇ(B)

旧:http://d.hatena.ne.jp/koshigoeb/

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で大量の記事が見つかりますね)。

※ rbenvはGCCgcc-*というパターンで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で何が行われるかについて、手を抜いて簡単に説明します。

  1. defineの実行によってdefinitions/fftt/以下に3つのファイルが作成される
    • definition.rb
    • ks.cfg
    • postinstall.sh
  2. definition.rbの内容に従ってVirtual Boxの仮想マシンを作成する
  3. definition.rbがキックスタートする設定になっているため、ks.cfgに従って処理が進められる
  4. インストールが終わり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

最後にパッケージングをする必要がありますが、それはまた後日。

まとめ

仮想マシン作成って、非常に簡単に自動できるんですね。

以下、積み残し課題のメモ。

  • パッケージング(.boxを作る)
  • VBoxManage
  • キックスタート
  • Chef, Puppet

追記:2012/02/01

.boxファイルの作成は以下で実行できます。

$ bundle exec vagrant basebox export fftt

.boxファイルを作る前にvalidateコマンドで検証すると良いのかもしれませんが、validateの内容を把握できていません。

$ bundle exec vagrant basebox validate fftt