いまさらVagrantに入門した

いまさら Vagrant に入門しました．


## Vagrant って？

Virtual Box 等の仮想化ソフトのラッパーツールです．
通常は Virtual Box で仮想マシン(以下 VM)作って，OSインストールして，Guest Addition入れて，...って使えるようにするまで色々手順を踏む必要があると思いますが，Vagrant を使うとそんなオペレーションから開放されます．

## どう使うの？

ざっくり説明するとこんな感じです．

- ディレクトリを用意します．
- 作成したディレクトリに Vagrantfile を用意します．
- 作成したディレクトリで vagrant up を実行します．

すると VM ができちゃいます．



## Vagrant をはじめるには？

まず，仮想化ソフトが必要です．
私は Virtual Box を使っています．
あと Vagrant が必要です．

## Vagrant を使えるようにする

VitrualBox については https://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp からインストーラーを取得して実行してください．
Vagrant については https://www.vagrantup.com/downloads.html からインストーラーを取得して実行してください．

## Vagrant の動作確認

まずはバージョンを表示してみます．

```powershell
> vagrant --version
Vagrant 2.2.4
```

## プラグインを導入する

すぐ Vagrant で VM を作りたくなるところですが，Guest Addition を入れたり，Proxy 設定したりと色々設定があるので便利なプラグインたちをまず導入します．


### Proxy関係

※ Proxy に苦しめられていないかたは読み飛ばしてください．

私は Proxy に阻まれているので社外につなぐためには Proxy 設定が必須です．
そんなときはホストに vagrant-proxyconf プラグインをインストールします．
このプラグインによってゲストの Proxy 設定を自動でおこなってくれます．

```powershell
> vagrant plugin install vagrant-proxyconf
```

Vagrantfile で proxy を設定する例です．

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  # proxy 設定
  config.proxy.enabled  = true
  config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
end
```

### Guest Additions

ホストとゲストでファイルを共有するために必要です．
ホストに vagrant-vbguest プラグインをインストールするとゲストに自動でGuest Additions をインストールしてくれます．
Vagrantfile で特に設定は不要です．

```powershell
> vagrant plugin install vagrant-vbguest
```

### hosts

vagrant-hosts プラグインをインストールすると VM のホスト名を解決できるようになります．

```powershell
> vagrant plugin install vagrant-hosts
```

Vagrantfile でホスト名解決を可能にする設定例です．
プロビジョニングで hosts の設定を有効にしています(プロビジョニングは vagrant up を実行する際にシェルを実行したりVMの設定をしたりする機能のことです)．

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  config.vm.define :vm1 do |vm1|
    vm1.vm.hostname = "vm1"
    vm1.vm.network "private_network", ip: "192.168.33.10"
    vm1.vm.provision :hosts, :sync_hosts => true
  end

  config.vm.define :vm2 do |vm2|
    vm1.vm.hostname = "vm2"
    vm2.vm.network "private_network", ip: "192.168.33.11"
    vm2.vm.provision :hosts, :sync_hosts => true
  end
end
```

### vagrant-disksize

```powershell
> vagrant plugin install vagrant-disksize
```

```ruby
Vagrant.configure('2') do |config|
  config.vm.box = 'centos/7'
  config.disksize.size = '100GB'
end
```

## Vagrant を使って CentOS7 の VM を作成する

プラグインを入れていよいよ準備が整いました．
まず任意のディレクトリを用意してそこに移動します．

```powershell
> mkdir D:\vargrant\centos7
> mkdir D:\vagrant\centos7\shared
> cd D:\vagrant\centos7
```

続いて Vagrantfile を作成します．

```powershell
> vagrant init -m
```

Vagrantfile を以下のように編集します．

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./shared", "/home/vagrant/shared", owner: "vagrant", group: "vagrant"

  config.proxy.enabled  = true
  config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
end
```

構成はこのようになりました．

```text
D:\vagrant\centos7
┣Vagrantfile
┗shared
```

最後に vargant up すれば VM が起動します．

```powershell
> vagrant up
```

## Vagrant に SSH 接続する

Vagrantfile を置いたディレクトリで vagrant ssh すれば VM に接続できます．

```powershell
> pwd
D:\vagrant\centos7
> vagrant ssh
Last login: Mon Jun 10 00:19:01 2019 from 10.0.2.2
[vagrant@centos7 ~]$ pwd
/home/vagrant
```


## VM 作成時にシェルスクリプトを実行する

Vagrantfile を作成したディレクトリに start.sh を作成します．


```bash
yum update
```

Vagrantfile に シェルを実行するように設定します．

```ruby
Vagrant.configure("2") do |config|
  ...
  config.vm.provision :shell, path: "./start.sh"
  ...
end
```

構成はこのようになりました．

```text
D:\vagrant\centos7
┣Vagrantfile
┗start.sh
```

あとは vagrant up すればシェルが実行されます．

```powershell
> vagrant up
```


## Guest Addition インストール済みの CentOS7 の box を作る

毎回新しく VM を作成する際に Guest Addition をインストールしていると時間がかかるので Guest Addition インストール済みの box を作ってみます．

```text
D:\vagrant\centos7ga
┗Vagrantfile
```

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.proxy.enabled  = true
  config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
  config.vm.provision "shell", inline: <<-SHELL
    yum update
  SHELL
end
```

まずは VM を作成して停止します．

```powershell
> cd D:\vagrant\centos7ga
> vagrant up
> vagrant halt
```

box を作成します．
--output で box 名を指定します．

```powershell
> vagrant package default --output centos7ga.box
```

作成した box を使用するには box を登録する必要があります．

```powershell
> vagrant box add centos7ga centos7ga.box
```

これ以降 Vagrantfile で以下のように作成した box を使うことができます．

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "centos7ga"
end
```

## スナップショット

### スナップショットを作成する

```powershell
> vagrant halt
> vagrant snapshot save vm_created
> vagrant snapshot list
vm_created
```

### スナップショットを復元する

```powershell
> vagrant snapshot restore vm_created
```

### スナップショットを削除する

```powershell
> vagrant snapshot delete vm_created
```