読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

Ubuntu 13.04にVagrantを入れてみる.

先日入れたUbuntu 12.10ですが, 2週間あまりでお役御免となって先日公開されたばかりのUbuntu 13.04を入れました.
今回はそのUbuntu 13.04にVagrantを入れてみようと思います!

Vagrantって?

Vagrantは, VirtualBoxという仮想マシンに対するフロントエンドを担うRuby製のツールです.
このツールを使うことで, コマンドラインから簡単にVMを作ったり, 壊したりすることができます.

Vagrantのインストール

ダウンロードページからv1.1.5を選択します.
現時点での最新版, v1.2.2を使用しないのは, Vagrantのプラグインのsaharaがv1.1.*までしか対応していないためです.

VirtualBoxのインストール

$ sudo apt-get install virtualbox

rubyのインストール

saharaを入れる為に, rbenvを使ってRubyをインストールします.

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(rbenv init -)"' >> ~/.zshrc

rubyをビルドする為に, ruby-buildを入れます.

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ sudo apt-get install libssl-dev
$ rbenv install 1.9.3-p392
$ rbenv global 1.9.3-p392
$ rbenv rehash

saharaのインストール

$ gem install bundler
$ rbenv rehash
$ git clone https://github.com/ryuzee/sahara.git sahara
$ cd sahara
$ bundle install
$ bundle exec rake build
$ vagrant plugin install pkg/sahara-0.0.14.gem

これで, Vagrantにsaharaが適用されます.

veeweeのインストール

ついでに, veeweeも入れておきます.
veeweeは, Vagrantで作るVMの素(box)を作る為のツールです.

# libxml2-dev, libxslt1-devを入れておかないと, nokogiriの導入に失敗し, エラーになってしまう.
$ sudo apt-get install libxml2-dev libxslt1-dev
$ git clone https://github.com/jedi4ever/veewee.git veewee
$ cd veewee
$ bundle install

これで,

$ cd veewee
$ bundle exec bin/veewee --version
Version : 0.3.7 - use at your own risk

みたいな感じで, veeweeが使えます.

いちいちveeweeディレクトリに移動するのが面倒
$ bundle install --binstubs

で入れるとよい... という記述を見つけたのですが, なぜかコケました.

$ ~/veewee/bin/veewee
/home/username/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/forwardable.rb:203: stack level too deep (SystemStackError)

なので, こんな感じのシェルスクリプトで対処しました.

#!/bin/sh
cd ~/veewee
bundle exec bin/veewee $@

バッドノウハウ感半端ないですね.

veeweeを使ってみる

こちらの記事がとても参考になりました.
以下の内容は上記記事を参考にして書いていますので, リンク先を読んだ方がいいと思います.

boxの作成とビルド
$ veewee vbox templates
..
veewee vbox define '<box_name>' 'CentOS-6.3-x86_64-minimal'
veewee vbox define '<box_name>' 'CentOS-6.3-x86_64-netboot'
veewee vbox define '<box_name>' 'CentOS-6.3-x86_64-reallyminimal'
veewee vbox define '<box_name>' 'CentOS-6.4-i386-minimal'
veewee vbox define '<box_name>' 'CentOS-6.4-i386-netboot'
veewee vbox define '<box_name>' 'CentOS-6.4-x86_64-minimal'
veewee vbox define '<box_name>' 'CentOS-6.4-x86_64-netboot'
..

'veewee vbox templates'で, 使用できるテンプレート(boxの素)を確認できます.
今回は, (参考にしたQiitaの記事にならって)'CentOS-6.3-x86_64-minimal'を使って, オリジナルのboxを作ってみようと思います.

$ veewee vbox define test 'CentOS-6.3-x86_64-minimal'

このコマンドで, veeweeがインストールされているディレクトリにdefinitionsディレクトリが現れ, 更にその中に'test'ディレクトリが生成されます.

$ ls definitions/test
base.sh  cleanup.sh     ks.cfg     ruby.sh     zerodisk.sh
chef.sh  definition.rb  puppet.sh  vagrant.sh  virtualbox.sh

これらのファイルを編集することで, boxの初期状態を変更することができます.

yum -y install gcc make gcc-c++ kernel-devel-`uname -r` zlib-devel openssl-devel readline-devel sqlite-devel perl wget dkms

'base.sh'にはこのような行があるので, 最初から導入しておきたいパッケージがあれば, ここに書いておくとよいでしょう.

では, このboxをビルドしてみましょう.

$ veewee vbox build test

必要なISOファイルのダウンロードなどが行われるので, それなりの時間が必要になります.
'The box veewee-test was build successfully!'という表示が出れば, 成功です.

boxのエクスポート

ビルドしたboxをエクスポートすることで, Vagrantで利用することができるようになります.

$ vagrant package --base test --output test.box

このコマンドで, カレントディレクトリにtest.boxというファイルができますので,

$ vagrant box add test test.box

とすることで, veeweeで作ったオリジナルの'test'というboxを, Vagrantで使うことができます.

Vagrantを使ってみる

では, さっそくveeweeで作ったboxをVagrantで動かしてみましょう.

$ vagrant init

このコマンドで, カレントディレクトリに'Vagrantfile'というファイルが生成されます.
このファイルはRubyのスクリプトになっていて, ここに設定を書き込むことで設定を変更することができます.

$ cat Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "test"
end

先ほど, 'vagrant box add'コマンドで追加した'test'というボックスを利用する場合, 'Vagrantfile'をこのように書き換えましょう.

ちなみに, 現在使えるboxの一覧は,

$ vagrant box list

で, 確認することができます.

$ vagrant up

このコマンドで, VMを立ち上げることができます.
最初は初期設定等で少し時間がかかりますが, 2回目以降はそれなりの速度で立ち上げることができます.

$ vagrant ssh

立ち上げたVMへは, このコマンドで接続できます.
ただし, 'Vagrantfile'があるディレクトリでしか使えないコマンドなので, それ以外のディレクトリでもVMへsshアクセスしたい場合は,

$ vagrant ssh-config --host vm-test
Host vm-test
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/home/username/.vagrant.d/insecure_private_key"
  IdentitiesOnly yes
  LogLevel FATAL

'ssh-config'コマンドでsshの設定を出力することができるので, これを'~/.ssh/config'に追記することで, 'ssh vm-test'で接続することができます.

$ vagrant halt    # VMの一時停止
$ vagrant destroy # VMの破壊

立ち上げたVMは'vagrant halt'で一時停止できます. 一時停止したVMは, 'vagrant up'することで一時停止した直前の状況で立ち上げることができます.
また, 'vagrant destroy'でVMを破壊することもできます.

saharaを使ってみる

saharaを使うと, VMの状態を記憶しておいて, その状態までロールバック(巻き戻し)できるsandboxモードを使うことができるようになります.

$ vagrant sandbox on

で, sandboxモードが有効になり, 'sandbox on'した状態までロールバックすることができるようになります.

もし, 途中で作業を間違えてロールバックしたい場合は,

$ vagrant sandbox rollback

で, ロールバックできます.

ロールバックするポイントを, 現時点のVMの状態に設定したい場合は,

$ vagrant sandbox commit

というコマンドを使います.
このコマンドによって, VMに対して行った操作が確定され, これ以降のロールバックするポイントがこのコマンドを入力した時点に変更されます.

$ vagrant sandbox status # sandboxモードの確認
$ vagrant sandbox off    # sandboxモードを解除

'vagrant sandbox status'コマンドでsandboxモードの状態を確認できます.
また, 'vagrant sandbox off'で, sandboxモードを解除できます.

まとめ

Vagrantとそのプラグインsahara, そしてVagrantで使えるboxを作成するツール, veeweeについて簡単にまとめてみました.

Vagrantを使えば, VMを驚くほど簡単に, コマンドライン上でお手軽に操作できるので, 開発環境や実験環境として使ってみるといいと思います.