Vagrant 便利ですね。Web システム構築ではサーバ構築、設定を何度となく繰り返すので、こういった「作って、壊して、元に戻せる」環境が自分の PC にあるというのはとても重宝します。
ここでは Vagrant1.0 を使って、Mac OS X 上に CentOS サーバを構築します。また触ってみて便利だった機能もいくつかご紹介します。
- 1. VirtualBox のインストール
- 2. Vagrant1.0 のインストール
- 3. box ファイルのインストール
- 4. Vagrantfile の作成
- 5. 仮想サーバを起動
- 6. 仮想サーバを停止
- 7. 仮想サーバを削除
- 8. 仮想サーバでhttpdサーバを構築
- 9. sahara プラグインで、作って、壊して、元に戻せる環境を構築
- 10. 複数の仮想サーバを起動
- 11. 仮想サーバのエクスポート
- Q. OS X, ruby, gem のバージョン
Vagrant とは
きちんとして説明は本家サイトを見るのが良いのですが、端的にいうと PC にインストールできる仮想PCを便利に使うツールです。
1.0 では仮想PCとして VirtualBox に対応しています。(1.1 からは VMWare や EC2 などにも対応しています。)
1. VirtualBox のインストール
まず VirtualBox をインストールします。VirtualBox は下記サイトから無料でダウンロードすることができます。
https://www.virtualbox.org/wiki/Downloads
2. Vagrant1.0 のインストール
次に Vagrant をインストールします。最新版は1.1なのですが、まだリリースされたばかりで、後述する便利なプラグインなどが対応していないので、ここでは1.0をインストールします。
Vagrant1.0は公式サイトからパッケージをダウンロードするか、 gem でインストールします。
gem でインストールする場合は以下になります。(追記: gem でインストールした場合、sahara プラグインが動作しない場合があるので、こだわりが無ければ上記パッケージでのインストールをお勧めします。)
$ sudo gem install vagrant
インストールができたら vagrant コマンドが使えるか確認しておきます。
$ vagrant -v Vagrant version 1.0.7
3. box ファイルのインストール
Vagrant で仮想サーバを作成するには box ファイルというイメージファイルが必要になります。box ファイルは自分で作成することもできるのですが、主要な Linux については公開されているファイルがあるので、これをインストールします。
Vagrantbox.es では各OSごとのboxファイルダウンロードURLが一覧として公開されています。CentOS もいくつか種類があるので、その中から CentOS6.4_x86_64 の box ファイル(CentOS 6.4 x86_64 Minimal (VirtualBox Guest Additions 4.2.8, Chef 11.4.0, Puppet 3.1.0))をインストールします。
下記が box ファイルのインストール例です。
vagrant box add までがコマンドで、centos64_64 の部分が box ファイルの名称です。これは任意に付けることができるので、自分が分かりやすい名前を付けます。その後に box ファイルの URL を指定します。
$ vagrant box add centos64_64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box [vagrant] Downloading with Vagrant::Downloaders::HTTP... [vagrant] Downloading box: http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box [vagrant] Extracting box... [vagrant] Verifying box... [vagrant] Cleaning up downloaded box...
インストールが完了したら、vagrant box list コマンドで確認します。
% vagrant box list centos64_64
4. Vagrantfile の作成
次に vagrant の設定ファイルである Vagrantfile を作成します。作成する仮想サーバの設定はこのファイルに記述していきます。
Vagrantfile の作成するには vagrant init コマンドを使います。
% mkdir vagrant % cd vagrant % vagrant init ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant. % ls Vagrantfile
では Vagrantfile を編集してみましょう。
デフォルトのサンプルの設定がコメントで書かていますが、一旦削除して必要な設定だけ記述しています。
config.vm.box にはベースとなる box 名を指定します。ここでは先程ダウンロードした centos64_64 という box 名を指定しています。
これだけで仮想サーバを起動できるのですが、動作が分かりやすいように config.vm.boot_mode に :gui を指定しています。
% vim Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant::Config.run do |config| config.vm.box = "centos64_64" config.vm.boot_mode = :gui end
5. 仮想サーバを起動
では実際に仮想サーバを起動してみましょう。
仮想サーバを起動するには、vagrant up コマンドを使います。
% vagrant up [default] Importing base box 'centos64_64'... [default] Matching MAC address for NAT networking... [default] Clearing any previously set forwarded ports... [default] Forwarding ports... [default] -- 22 => 2222 (adapter 1) [default] Creating shared folders metadata... [default] Clearing any previously set network interfaces... [default] Booting VM... [default] Waiting for VM to boot. This can take a few minutes. [default] VM booted and ready for use! [default] Mounting shared folders... [default] -- v-root: /vagrant
コマンドを実行すると VirtualBox が起動します。
起動が完了すると VirtualBox のウィンドウにログインプロンプトが表示されます。
ウィンドウをクリックして、login に vagrant 、password に vagrant を入力するとログインすることができます。
Virtualbox ウィンドウから抜ける時は、ウィンドウ右下に書いてあるとおり、左のコマンドキーを1回押します。(Mac OS X の場合)
vagrant ssh コマンドを使うと、ssh で仮想サーバにログインすることができます。
% vagrant ssh Last login: Thu Mar 21 06:46:13 2013 Welcome to your Vagrant-built virtual machine. [vagrant@localhost ~]$
vagrant status コマンドを使うと、現在の仮想サーバの状態が確認できます。下記では、起動中なので ruuning と表示されています。
% vagrant status Current VM states: default running
6. 仮想サーバを停止
仮想サーバを停止する場合、VirtualBox ウィンドウでログインした状態で、/sbin/shutdown などを実行する方法と vagrant halt コマンドで仮想サーバを停止する方法があります。
下記では vagrant halt コマンドで仮想サーバを停止しています。
% vagrant halt
vagrant status コマンドを実行すると停止していることが分かります。
% vagrant status Current VM states: web1 poweroff
7. 仮想サーバを削除
仮想サーバを削除する場合、vagrant destroy コマンドを使います。
% vagrant destory Are you sure you want to destroy the 'default' VM? [Y/N] y [default] Destroying VM and associated drives...
vagrant status コマンドを実行すると削除されていることが分かります。
% vagrant status Current VM states: default not created
8. 仮想サーバでhttpdサーバを構築
では仮想サーバにhttpdをインストールしてみましょう。
まず Vgrantfile を編集して、仮想サーバの設定を追加します。
Mac 上ですでに各種デーモンが起動しているため、ポートの競合などを避けるために仮想サーバにIPアドレス、ホスト名を付与しています。また、VirtualBox のウィンドウを隠すために config.vm.boot_mode をコメントアウトしています。
% vim Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant::Config.run do |config| config.vm.box = "centos64_64" #config.vm.boot_mode = :gui config.vm.define :web do |web| web.vm.host_name = "web" web.vm.network :hostonly, "192.168.33.10" end end
では仮想サーバを起動しましょう。
% vagrand up
SSH で仮想サーバにログインします。vagrant ssh コマンドでも可能ですし、IP アドレスを指定して、ssh コマンドでもログインできます。
% vagrand ssh
% ssh [email protected] ※パスワードは vagrant
次に httpd をインストールして、起動します。
[vagrant@web ~]$ sudo yum -y install httpd (snip) [vagrant@web ~]$ sudo /sbin/service httpd start
この仮想サーバでは iptables が設定されていて、外部からの通信を遮断してしまいます。VirtualBox を実行している PC から通信できるように全てのフィルタリングルールを削除しておきます。
[vagrant@web ~]$ sudo /sbin/iptables -F [vagrant@web ~]$ sudo /etc/init.d/iptables save
ブラウザから仮想サーバの httpd にアクセスしてみましょう。http://192.168.33.10/ にアクセスするとおなじみのテストページが表示されます。
9. sahara プラグインで、作って、壊して、元に戻せる環境を構築
Vagrant にはプラグインで機能を拡張することができます。いくつかあるプラグインの中から、個人的にこれがあるから Vagrant が使いたくなるというプラグインをご紹介しましょう。
それは sahara プラグインです。sahara プラグインを使うと、データベースのトランザクションにおける rollback のように、サーバへ反映した作業をある時点まで簡単に戻すことができます。
では sahara プラグインをインストールして、気軽に元に戻せる機能を試してみましょう。
9–1. sahara プラグインをインストール
sahara プラグインをインストールするいは、vagrant gem install コマンドを使います。
% vagrant gem install sahara Fetching: Platform-0.4.0.gem (100%) Fetching: open4-1.3.0.gem (100%) Fetching: popen4-0.1.2.gem (100%) Fetching: thor-0.17.0.gem (100%) Fetching: sahara-0.0.13.gem (100%) Successfully installed Platform-0.4.0 Successfully installed open4-1.3.0 Successfully installed popen4-0.1.2 Successfully installed thor-0.17.0 Successfully installed sahara-0.0.13 5 gems installed Installing ri documentation for Platform-0.4.0... Installing ri documentation for open4-1.3.0... Installing ri documentation for popen4-0.1.2... Installing ri documentation for thor-0.17.0... Installing ri documentation for sahara-0.0.13... Installing RDoc documentation for Platform-0.4.0... Installing RDoc documentation for open4-1.3.0... Installing RDoc documentation for popen4-0.1.2... Installing RDoc documentation for thor-0.17.0... Installing RDoc documentation for sahara-0.0.13...
インストールが完了すると、vagrant で利用できるサブコマンドに sandbox が追加されます。
% vagrant [/Users/shin/vagrant]% vagrant (snip) Available subcommands: box destroy gem halt init package provision reload resume sandbox <---- 追加 ssh ssh-config status suspend up For help on any individual command run `vagrant COMMAND -h`
9–2. sahara プラグインを試す
実際に sahara プラグインを試してみましょう。
まず vagrant sandbox on コマンドで、snapshot mode を開始します。これは RDBMS の BEGIN にあたり、rollback した場合にこの時点まで仮想サーバを戻すことができます。
% vagrant sandbox on [web] - Enabling sandbox 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
vagrant sandbox status コマンドを実行すると snapshot mode 中であることが分かります。
% vagrant sandbox status [web] - snapshot mode is on
仮想サーバにログインして、php をインストールします。php コマンドが実行できることが確認できたらログアウトします。
% vagrant ssh Last login: Thu Mar 21 07:10:35 2013 from 192.168.33.1 Welcome to your Vagrant-built virtual machine. [vagrant@web ~]$ sudo yum -y install php [vagrant@web ~]$ php -v PHP 5.3.3 (cli) (built: Feb 22 2013 02:51:11) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies [vagrant@web ~]$ exit
php のインストールを取り消すために、vagrant sandbox rollback コマンドで vagrant sandbox on を実行した時点に戻します。
% vagrant sandbox rollback [web] - powering off machine 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% [web] - roll back machine 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% [web] - starting the machine again
これは仮想サーバが元に戻りました。再度 vagrant ssh でログインしてみると、さきほどインストールした php が存在しません。
[vagrant@web ~]$ php -bash: php: コマンドが見つかりません
rollback を実行した後も snapshot mode が有効なままとなっています。(これは DBMS とは異なります)
% vagrant sandbox status [web] - snapshot mode is on
では、つづけて、sudo rm -rf /bin を実行してみましょう。(必ず仮想サーバで実行して下さい!)
[vagrant@web ~]$ sudo rm -rf /bin (snip) [vagrant@web ~]$ ls -bash: /bin/ls: No such file or directory
こりゃ大変!でも大丈夫。サーバをログアウトして、vagrant sandbox rollback を実行すれば元通り。
% vagrant sandbox rollback [web] - powering off machine 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% [web] - roll back machine 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% [web] - starting the machine again % vagrant ssh [vagrant@web ~]$ ls
snapshot mode を終了する場合は vagrant sandbox off コマンドを実行します。vagrant sandbox off コマンドを実行すると現在の状態をそのまま保存して、snapshot mode が終了します。
% vagrant sandbox off [web] - switching sandbox off 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
vagrant sandbox status で確認すると snapshot mode が終了していることが分かります。
% vagrant sandbox status [web] - snapshot mode is off
10. 複数の仮想サーバを起動
Web システムでは複数台のサーバで構成することが多いのですが、その検証として複数の仮想サーバを起動してみましょう。
Vagrantfile で、config.vm.define を追加して、それぞれの仮想サーバの設定を記述します。以下の設定では、web サーバ 2 台と db サーバ 1 台を起動しています。
config.vm.define の第一引数が仮想サーバの名前となります。db サーバでは、db.vm.cusomise でメモリを 1GB に変更しています。(デフォルトは 512 MB)
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant::Config.run do |config| config.vm.box = "centos64_64" #config.vm.boot_mode = :gui config.vm.define :web1 do |web1| web1.vm.host_name = "web1" web1.vm.network :hostonly, "192.168.33.10" end config.vm.define :web2 do |web2| web2.vm.host_name = "web2" web2.vm.network :hostonly, "192.168.33.11" end config.vm.define :db do |db| db.vm.host_name = "db" db.vm.network :hostonly, "192.168.33.12" db.vm.customize ["modifyvm", :id, "--memory", 1024] end end
vagrant up コマンドを実行すると 3 台が順番に起動します。
% vagrant up [web1] ... [web2] ... [db] ... % vagrant status Current VM states: web1 running web2 running db running ...
それぞれのコマンドは、仮想サーバ名を指定すると、対象の仮想サーバに対して実行できます。下記では db サーバを起動して、ssh ログインしています。
% vagrant up db % vagrant ssh db
仮想サーバ間の通信は IP アドレスで可能なので、複数サーバ構成を構築することができます。
11. 仮想サーバのエクスポート
構築した仮想サーバを box ファイルにエクスポートすることができます。エクスポートした box ファイルは別の PC でインストールすることができるので、同じ開発環境をチームで共有したり、ベースとなるサーバ環境を用意しておいてプロジェクト毎に差分を変更していくなどが可能となります。
仮想サーバを box ファイルへエクスポートするには、vagrant package コマンドを実行します。
% vagrant package [web1] Attempting graceful shutdown of VM... [web1] Clearing any previously set forwarded ports... [web1] Creating temporary directory for export... [web1] Exporting VM... [web1] Compressing package to: /Users/shin/vagrant/package.box
vagrant package コマンドが完了すると、package.box という box ファイルが作成されています。
% ls package.box package.box
このファイルを vagrant box add コマンドでインストールすれば、この仮想サーバをベースに新たな仮想サーバを作成することができます。
まとめ
Vagrant は Chef や puppet などで自動構築する機能があるので、これらと組み合わせることでより真価を発揮します。
ただ、それらを使わずとも、手軽に触れるサーバ、壊せるサーバ、開発環境としても十二分に便利なツールです。
業務はもちろんですが、ハンズオンなどで参加者に同じ環境を配布したい時にも使えそうなので、活用していきたいですね。
参考
Q. OS X, ruby, gem のバージョン(追記)
ykitade
現行のsaharaはパッチを当てないと使えなくね?OSXとrubyのバージョンが知りたい。
http://b.hatena.ne.jp/ykitade/20130323#bookmark-137571070
OS X は「10.8.3」です。
Vagrant は公式サイトの dmg ファイルからインストールしています。これなら ruby や gem をパッケージに内包しているので問題無く動作しました。バージョンは以下です。
% /Applications/Vagrant/embedded/bin/ruby -v ruby 1.9.3p327 (2012-11-10 revision 37606) [universal.x86_64-darwin12.2.1] % /Applications/Vagrant/embedded/bin/gem -v 1.8.23
- Newer: FireMobileSimulator でタブ毎に端末選択を有効にする
- Older: CentOS 6.x で ipv6 を無効化する