Vagrant | version 1.6 新規フィーチャー #vagrant

# Vagrant | version 1.6 新規フィーチャー #vagrant
## 概要
Vagrant の version 1.6 で新規追加されたフィーチャーについて
## Major Features
### Global Status and Control
[Global Status and Control](https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-global-status.html)

#### Global Status
vagrant で起動中のすべてのインスタンスを確認できます。
2つの VM を `vagrant up` した状態で確認してみます。
※古いバージョンで作成した VM は表示されない。

~~~bash
# confirm global status
$ vagrant global-status
id       name    provider   state   directory
--------------------------------------------------------------------------
e5a9a74  default virtualbox running /path/to/your/dir/vagrant_1_6_test1
31d33b8  default virtualbox running /path/to/your/dir/vagrant_1_6_test2

# halt vagrant_1_6_test2
$ vagrant halt
==> default: Attempting graceful shutdown of VM...

# confirm global status
$ vagrant global-status
id       name    provider   state    directory
---------------------------------------------------------------------------
e5a9a74  default virtualbox running  /path/to/your/dir/vagrant_1_6_test1
31d33b8  default virtualbox poweroff /path/to/your/dir/vagrant_1_6_test2

# destroy vagrant_1_6_test2
$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Destroying VM and associated drives...

# confirm global status
$ vagrant global-status
id       name    provider   state   directory
--------------------------------------------------------------------------
e5a9a74  default virtualbox running /path/to/your/dir/vagrant_1_6_test1
~~~

#### Global Control
version 1.5 までは vagrant コマンドの各種操作の多くは
Vagrantfile のあるディレクトリにいることを前提としていました。
Global Control が追加されたことで、 `vagrant global-status` で確認した id で
操作対象を選び、どのディレクトリにいても `vagrant` コマンドによる操作が可能となりました。

~~~bash
# confirm global status
$ vagrant global-status
id       name    provider   state   directory
--------------------------------------------------------------------------
7e0909e  default virtualbox running /path/to/your/dir/vagrant_1_6_test1

# halt vagrant_1_6_test1 by unique id
# vagrant global status で確認した id で削除する場合、 Vagrantfile のあるディレクトリに移動する必要がない
$ vagrant halt 7e0909e
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...

# confirm global status
$ vagrant global-status
~~~

### Windows Guests
[Windows Guests](https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-windows.html)

Vagrant 内への Windows 環境をサポート。
※ Windows 環境での Vagrant 使用は前から出来ていたので間違いなく（by Official）

作成した Windows の仮想環境は SSH or WinRM のどちらでも接続可能。

#### 試行
Windows XP + IE6 の box を利用してみます。

~~~bash
$ vagrant box add xpie6 http://aka.ms/vagrant-xp-ie6
$ vagrant box list | grep xp
xpie6                       (virtualbox, 0)
$ vagrant init
$ vi Vagrantfile
~~~

* Vagrantfile

~~~ruby
Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 3389, host: 3389
  config.vm.provider :virtualbox do |vb|
    vb.name = "xp-ie6"
    vb.cpus = 1
    vb.gui = true
    vb.customize ["modifyvm", :id, "--memory", 1024]
  end

  config.vm.box = "xpie6"
  config.vm.communicator = "winrm"
end
~~~

* 起動

~~~bash
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'xpie6'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: xp-ie6
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 5985 => 55985 (adapter 1)
    default: 22 => 2200 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
# 略
~~~

* 動作確認

![win_vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/43480/4fbd5d41-6c7a-771f-3dcf-f21c064f3411.png)

![xp_ie6.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3813d01e-bfd9-2baa-effb-9d65a4a4fa1f.png)

`vagrant rdp`, `vagrant ssh` の疎通確認とれず
`vagrant up` 後に Virtual Box から直接触ることはできた。
とりあえず、新規フィーチャーの確認がしたかっただけなので問題解決は先送り。

### Docker-Based Development Environments
[Docker-Based Development Environments](https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-docker-dev-environments.html)
[DOCKER PROVIDER](https://docs.vagrantup.com/v2/docker/index.html)

Vagrant 1.6 で built-in provider に Docker が加わった。

## Other Features
### version command
`-v` option とは異なる `version` command の導入

~~~
$ vagrant version
Installed Version: 1.6.5
Latest Version: 1.6.5

You're running an up-to-date version of Vagrant!
$ vagrant -v
Vagrant 1.6.5
~~~

### Provisioners can now run 'once' or 'always'
Vagrant 1.6 の Provisioners は `vagrant up` の初回実行時のみ実行される。

#### Vagrantfile
~~~ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
$script = <<SCRIPT
sudo apt-get update -y
sudo apt-get install tree
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.provider :virtualbox do |vb|
    vb.name = "first_provision"
  end
  config.vm.box = "precise64"
  config.vm.provision "shell", inline: $script
end
~~~

#### vagrant up

~~~bash
$ vagrant up --provider=virtualbox
vagrant@precise64:~$ which tree
/usr/bin/tree
vagrant@precise64:~$ tree --version
tree v1.5.3 (c) 1996 - 2009 by Steve Baker, Thomas Moore, Francesc Rocher, Kyosuke Tokoro
vagrant@precise64:~$ exit
logout
Connection to 127.0.0.1 closed.
~~~

#### Vagrantfile 修正

~~~ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
$script = <<SCRIPT
sudo apt-get update -y
sudo apt-get install tree -y
sudo apt-get install git -y
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.provider :virtualbox do |vb|
    vb.name = "first_provision"
  end
  config.vm.box = "precise64"
  config.vm.provision "shell", inline: $script
end
~~~

#### vagrant up
Vagrantfile に git のインストールを追加して `vagrant up` したが、
初回のみ実行されるので git はインストールされていない

~~~bash
$ vagrant halt
$ vagrant up --provider=virtualbox
$ vagrant ssh
vagrant@precise64:~$ which git
vagrant@precise64:~$ git --version
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
vagrant@precise64:~$ exit
logout
Connection to 127.0.0.1 closed.
~~~

#### Vagrantfile に `run: "always"` option を追加する

~~~ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
$script = <<SCRIPT
sudo apt-get update -y
sudo apt-get install tree -y
sudo apt-get install git -y
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.provider :virtualbox do |vb|
    vb.name = "first_provision"
  end
  config.vm.box = "precise64"
  config.vm.provision "shell", inline: $script,
    run: "always"
end
~~~

#### vagrant up
`run: "always"` option を設定した Vagrantfile で再実行。
git がインストールされました。

~~~bash
$ vagrant halt
$ vagrant up --provider=virtualbox
$ vagrant ssh
vagrant@precise64:~$ which git
/usr/bin/git
vagrant@precise64:~$ git --version
git version 1.7.9.5
vagrant@precise64:~$ exit
logout
Connection to 127.0.0.1 closed.
~~~

### Vagrantfiles can contain a post-up message

#### Vagrantfile に post_up_message を設定

~~~ruby
Vagrant.configure("2") do |config|
  # 略
  config.vm.post_up_message = "起動しましたよ"
  # 略
end
~~~

#### vagrant up

~~~bash
$ vagrant up
# 略
==> default: Machine 'default' has a post `vagrant up` message. This is a message
==> default: from the creator of the Vagrantfile, and not from Vagrant itself:
==> default:
==> default: 起動しましたよ
~~~

### Boxes can now be compressed with LZMA
BOX を圧縮率の高い [LZMA](http://ja.wikipedia.org/wiki/LZMA) で圧縮可能になった。

## 補足
Windows 環境 + Vagrant 1.6 系で box add 時にエラーが出る場合はパスを修正する.

~~~bash
PATH=%PATH%;C:\HashiCorp\Vagrant\embedded\mingw\bin
~~~

※参考資料
[vagrantをwindowsで使う時のコマンドパス](http://qiita.com/tsuyoshi_cho/items/0c397de032faeb3e0beb)
## 参照
[Vagrant blog](https://www.vagrantup.com/blog/vagrant-1-6.html)
[vagrantbox.es](http://www.vagrantbox.es/)
[Windows Guests](https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-windows.html)
[Global Status and Control](https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-global-status.html)
[Docker-Based Development Environments](https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-docker-dev-environments.html)