Vagrantの使い方


## 1. はじめに

ここではVagrantの使い方についてまとめてみました。
Vagrantを使って快適な開発・検証・試験環境を構築したいという場合に読んでみてください。

## 2. Vagrantとは

まず、Vagrantとは何者と思う方もいるかと思いますので簡単に紹介します。

Vagrantとは、「開発・検証・試験時に使用する仮想マシンをコマンドや定義ファイルを使って簡単に構築することができるツール」です。

VagrantはVirtualBoxやVMWareといったハイパーバイザー上に仮想マシンを構築します。

また、VagrantではChefやPuppetといったツールを組み合わせて使うことができるので、環境構築を自動化することができます。

## 3. 前提条件

今回は、以下の環境を前提として話を進めていきます。


|ソフトウェア|バージョン|
|:----:|:----:|
|OS|MacOSX 10.8.4|
|VirtualBox|4.2.16 r86992|
|Vagrant|1.2.7|
|Ruby|1.9.3-p385|
|RubyGem|1.8.23|
|Chef|11.6.0|

なお、今回はチュートリアルでChefを使うのでChefのインストールもしておいてください。
→ ここではRubyGemを使ってChefをインストールしています。

```
$ gem install chef knife-solo
```

## 4. Vagrantのインストール

Vagrantのバージョンが1.0.xまではRubyGemを使ってインストールしていました。
1.1以降では、Vagrantのダウンロードサイトからインストーラをダウンロードしてインストールを行います。
*) 今回はMacOSXを使っていますのでdmgファイルをダウンロードします。

ダウンロードサイト：http://downloads.vagrantup.com/

インストールは簡単で、インストーラを起動した後はインストーラの指示に従うだけで完了します。

## 5. Vagrantを使ってみる

インストールが完了したら、まずはVagrantの使い方に関して感触をつかんでみましょう。
ターミナルを起動して、以下のコマンドを実行してください。
VirtualBox上にUbuntu 12.04 LTS 32-bitの仮想マシンが作成され、起動します。

```
$ vagrant init precise32 http://files.vagrantup.com/precise32.box
$ vagrant up
```

## 6. Vagrantが提供するコマンド

Vagrantでは以下のコマンドを提供しています。

### (1) Boxをインストールする
Boxとは、仮想マシンを作成する際に必要なOSのディスクイメージファイル等が入ったファイルの集まりで、仮想マシンのテンプレートみたいなものです。
仮想マシン作成時にネットワーク上で配布されているBoxを使用する場合はこのコマンドを使う必要はありません。
しかし、ネットワークに繋がっていない状況で仮想マシンを作成したい場合はVagrantがインストールされたマシン上にBoxをインストールしておく必要があります。この時に使用するのが以下のコマンドです。

(コマンド)

```
$ vagrant box add [box-name] [box-url]
```
* box-name - Box名 (名前は何でもよいです。)
* box-url - Boxの配置先URL

(例)

```
$ vagrant box add precise32 http://files.vagrantup.com/precise32.box
```

### (2) 仮想マシンに関する定義ファイルを作成する

(コマンド)

```
$ vagrant init [box-name] [box-url]
```
* box-name - Box名 (ローカルマシン上のBoxを使う場合は、使いたいBoxの名前を指定します。ネットワーク上のBoxを使う場合は名前は何でもよいです。)
* box-url - Boxの配置先URL (ネットワーク上のBoxを使う場合に指定する)

*) ローカルマシン上に登録されているBoxを確認する場合は、以下のコマンドを実行します。

```
$ vagrant box list
```

(例1) ネットワーク上のBoxを使って定義ファイルを作成する

```
$ vagrant init precise32 http://files.vagrantup.com/precise32.box
```

(例2) ローカルマシン上のBoxを使って定義ファイルを作成する

```
$ vagrant init precise32 # ローカルマシン上に「precise32」というBoxがインストールされていることが前提
```

### (3) 仮想マシンを起動する

仮想マシンを起動する場合、以下のコマンドを実行します。

(コマンド)

```
$ vagrant up
```

### (4) 仮想マシンにSSH接続する

稼働中の仮想マシンにSSH接続する場合、以下のコマンドを実行します。

```
$ vagrant ssh
```

### (5) 仮想マシンを一時中断する

稼働中の仮想マシンを一時中断する場合、以下のコマンドを実行します。

(コマンド)

```
$ vagrant suspend
```

*) 一時中断した仮想マシンを再開する場合、以下のコマンドを実行します。

```
$ vagrant up
```

### (6) 仮想マシンをシャットダウンする

稼働中の仮想マシンをシャットダウン場合、以下のコマンドを実行します。

(コマンド)

```
$ vagrant halt
```

### (7) 仮想マシンを再起動する

稼働中の仮想マシンを再起動する場合、以下のコマンドを実行します。

(コマンド)

```
$ vagrant reload
```

### (8) 仮想マシンを廃棄する

使わなくなった仮想マシンを廃棄する場合、以下のコマンドを実行します。

(コマンド)

```
$ vagrant destroy
```

なお、稼働中の仮想マシンに対してこのコマンドを実行した場合、以下の処理が行われます。

1. 仮想マシンのシャットダウン
2. 仮想マシンの廃棄

*) 仮想マシンを廃棄しても、仮想マシンの構築・起動に使用する定義ファイル(Vagrantfile)は削除されません。

### (9) 仮想マシンの状態を確認する

(コマンド)

仮想マシンの状態を確認する場合、以下のコマンドを実行します。

```
$ vagrant status
```

### (10) 仮想マシンのSSH情報を表示する

仮想マシンのSSH情報を確認する場合、以下のコマンドを実行します。

(コマンド)

```
$ vagrant ssh-config
```

## 7.チュートリアル

ここでは、Vagrantを使って以下の作業を行ってみたいと思います。

* 仮想マシンの作成・起動 (CentOS 6.3の仮想マシンを作成します)
* Chefを使ってApache、PHP、MySQLをインストールする


### (1) 仮想マシンの作成・起動

まず、ターミナルを開きます。
ターミナルを開いたら、以下のコマンドを実行します。

```
$ mkdir -p ~/VagrantSample/centos63 && cd ~/VagrantSample/centos63
```

その後、仮想マシンの定義ファイルを作成するために以下のコマンドを実行します。

```
$ vagrant init centos63 https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
```

Vagrantfileを以下のとおりに修正します。

```ruby
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network :private_network, ip: "192.168.33.10" # コメントアウトされているのでコメントアウトを解除する
```

Vagrantで仮想マシンを起動します。

```
$ vagrant up
```

仮想マシンをsymfonyでSSH接続できるように以下のコマンドを実行します。

```
$ vagrant ssh-config --host symfony >> ~/.ssh/config
```

### (2) Chefを使ってApache、PHP、MySQLをインストールする

作業ディレクトリに移動します。

```
$ cd ~/VagrantSample/centos63
```

Chefのリポジトリを作成します。

```
$ knife solo init chef-repo && cd chef-repo
```

Chefを遠隔から実行できるようにするために、以下のコマンドを実行します。

```
$ knife solo prepare symfony
```

Cookbookを作成します。

```
$ knife cookbook create lamp -o site-cookbooks
```

Recipeを以下のとおりに修正します。

[~/VagrantSample/centos63/chef-repo/site-cookbooks/lamp/recipes/default.rb]

```ruby
#
# Cookbook Name:: lamp
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

# stop iptables
service "iptables" do
  action [:stop, :disable]
end

# install apache
%w{httpd httpd-devel}.each do |pkg|
  package pkg do
    action :install
  end
end

# install php
%w{php php-common php-devel php-mbstring php-xml php-pear php-mysql}.each do |pkg|
  package pkg do
    action :install
  end
end

# install mysql
%w{mysql-server mysql-devel}.each do |pkg|
  package pkg do
    action :install
  end
end

# service configuration

service "httpd" do
  supports :status => true, :restart => true, :reload => true
  action [:enable, :start]
end

service "mysqld" do
  action [:enable, :start]
end

```

chef-repo/nodes/symfony.jsonを以下のとおりに修正します。

```
{
	"run_list":[
		"lamp"
	]
}
```


Vagrantfileの内容を以下のとおりに修正します。

[~/VagrantSample/centos63/Vagrantfile]

```ruby
# Enable provisioning with chef solo, specifying a cookbooks path, roles
# path, and data_bags path (all relative to this Vagrantfile), and adding
# some recipes and/or roles.
#
config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = "chef-repo/site-cookbooks"
  chef.roles_path = "chef-repo/roles"
  chef.data_bags_path = "chef-repo/data_bags"
  chef.add_recipe = "lamp"
  
  # You may also specify custom JSON attributes:
  chef.json = {}
end
```

Vagrantで仮想マシンを再起動します。

```
$ cd ~/VagrantSample/ && vagrant reload
```

## 8.その他

VagrantのBoxを配布しているサイトがあります。
Boxの作り方については後日書く予定です。現時点はこちらのサイトからBoxを取得してみてください。

URL: http://www.vagrantbox.es/

## 9. 参考サイト

* http://www.vagrantup.com
* http://www.atmarkit.co.jp/ait/articles/1307/22/news076.html
* http://dotinstall.com/lessons/basic_vagrant