ローカル環境でのサーバ構築自動化（VirtualBox+Vagrant）

# 背景
Windows端末のローカル環境で色々試す際に、サーバ構築を効率化したいために導入
調べると、VirtualBox＋Vagrantの組み合わせで自動化しているケースがあったため、導入をしてみる。

# 今回の範囲
VirtualBox＋Vagrantを組み合わせてコマンドラインにてVMを作成できることを確認するまでを実施。そのため、ネットワークIFが2つで、共有ディスクがあってなどの細かい？設定は気にせず、対象のOSでVMが立ったまでを見ます。

# Vagrantとは
コマンドラインで、VirtualBoxやVMwareを操作することが可能なツール
Vagrantfileに構成情報を記載して、コードを実行することで、仮想マシンの構築が可能

簡単な流れは以下のイメージ。。これだけ書くと簡単に見える。。。

1. vagrantBoxファイル（イメージファイル）の取得
1. vagrantfileに構成情報の作成
1. vagrantコマンドで仮想マシン起動

また、VMに対してシェルスクリプトを記載し実行できるため、MWインストールも可能。

# 環境
環境構築時のソフトウェアのバージョンは下記の通り

- windows 10
- VirtualBox 6.0.20
- Vagrant 2.2.7


# インストール
VirtualBox：[こちら](https://www.oracle.com/virtualization/technologies/vm/downloads/virtualbox-downloads.html)からDLしてインストール
Vagrant：[こちら](https://www.vagrantup.com/downloads.html)からDLしてインストール

# 環境
（とても雑ですが）環境のイメージは以下の通り。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626355/562db7da-3ea0-bf71-4125-9450b98231ba.png" width="500">

# VagrantでのVM構築
## vagrantBoxファイル（イメージファイル）の取得
Boxファイル自体は、vagrantfileの記載の仕方から、

- 構築時にインターネット上からBoxファイルを取得
- 事前にローカルのVagrantに登録し取得しておいたBoxファイルを利用

することが可能だが、今回は、構築時にBoxファイルのDLが発生して待機時間が発生するのが嫌なので事前にDLしておく。

なお、構築時にインターネット上から取得する場合は（DL時間が発生するが、）初回の場合はローカルのVagrantBoxに登録も行うため、2回目以降は再度取得することはない。
また、別のVMの構築でも、ローカルのVargrantBoxに登録したBox名である場合は、ローカルのBoxを使用するため、DL時間は発生しない。
vagrantfileを他の環境でも使いまわすことも考えるなら、前者の方が良いのだろうと思う。

Boxファイルはインターネット上で公開されており、例えば、下記サイトから対象のイメージを検索することが可能
Vargrant Cloud：[こちら](https://app.vagrantup.com/boxes/search)で検索
Vagrantbox.es：[こちら](http://www.vagrantbox.es/)で検索

BoxファイルのURLパスを確認し、下記コマンドを実行することでBoxファイルを登録することが可能

```cmd:コマンドプロンプト
> vagrant box add {VM名} {BoxファイルのURL}
```

なお、Vargrant CloudからBoxを取得する場合は、以下のような書き方でも取得できる。
VM名の部分は、Vargrant Cloudのサイトで対象のBoxイメージを確認すると記載してある。
例えば、2020/4時点でCentOS7の最新版"7.6.1811"を取得する場合は下記コマンドで可能。

```cmd:コマンドプロンプト
> vagrant box add centos/7
```

また、旧バージョンを取得したい場合、例えば、今回はCentOS7.4を取得してみたが、その場合は下記の記載で取得可能。
box-versionオプションでバージョンを指定することで、OSのマイナーバージョンを指定することが可能。

```cmd:コマンドプロンプト
> vagrant box add centos/7 --box-version 1803.01
```

つまり、Boxは、Box名とバージョンの組み合わせで一意になれば、どのようにでも登録可能となる。
ちなみに、上記のコマンドだとCentOS7.xのどのバージョン？となったので、今回は以下のコマンドでBoxを登録した。

```cmd:コマンドプロンプト
> vagrant box add centos7.4.1708 https://vagrantcloud.com/centos/boxes/7/versions/1803.01/providers/virtualbox.box
```

URLの部分は、「vagrant box add centos/7 --box-version 1803.01」を実行した際に、実行時の標準出力で出てきたので、そちらを使用した。「1803.01」を変えれば他のCentOSのバージョンも取得できる。


ローカルにあるBoxファイルを登録したい場合は下記コマンドで可能。

```cmd:コマンドプロンプト
> vagrant box add {VM名} {パス}
```



## vagrantコマンド
|command|内容|
|:------|:---|
|vagrant box add {VM名} {BoxファイルのURL}|ローカルのBoxへ追加|
|vagrant box list|ローカルのBox一覧取得|
|vagrant box remove {box名}|ローカルのBoxからの削除|
|vagrant init|vagrant初期化（Vagrantfile作成）|
|vagrant up|vagrantからVM起動|
|vagrant ssh|VMへのログイン|
|vagrant halt|VM停止|
|vagrant reload|VM再起動|
|vagrant destroy|VM破棄|

なお、今回はVertualBoxであるが、例えばVmwareで使いたい場合は、vagrantのコマンドに「--provider=●●●」をつけることで、操作が可能となる。（デフォルトはVertualBoxなので、このオプションは要らない。）

## vagrantfileに構成情報の作成
vagrantfileを作成するにあたって、Vagrant用のフォルダを作成

```cmd:コマンドプロンプト
> mkdir Vagrant & cd Vagrant
```

各仮想マシン用にフォルダを作成

```cmd:コマンドプロンプト
> mkdir centos74 & centos74
```

下記コマンドにて、vagrant初期化して、vagrantfileのひな型を生成させる。

```cmd:コマンドプロンプト
> vagrant init [vagrantbox名]
```
なお、vargrantbox名は、後でvagrantfileに追記できるため、コマンドにて指定する必要はない。

生成されたvagrantfileを参考に、必要な情報を記載。
今回は、最低限の構成情報で記載した内容で実行する。パラメータ等は次回に確認することとする。

```vim:vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos7.4.1708"
  config.vm.box_version = "0"
  config.vm.network "private_network", ip: "192.168.33.10"
end
```

config.vm.box：Box名
config.vm.box_version：Boxのバージョン指定（今回はBox名だけで一意になるので、記載しなくても問題ない）
config.vm.network：VMのネットワークIF設定

なお、バージョンを確認したい場合は、下記コマンドでBoxリストを出力し確認が可能

```cmd:コマンドプロンプト
> vagrant box list
centos/7       (virtualbox, 1803.01)
centos7.4.1708 (virtualbox, 0)
```

### vagrantコマンドで仮想マシン起動
vagrantfileの編集を終えたら、vagrantfileと同じフォルダで、下記コマンドを実行

```cmd:コマンドプロンプト
> vagrant up
```

あとは待つだけ、、、と思ったら、下記エラーが発生し起動しない。

```cmd:コマンドプロンプト
 VBoxManage.exe: error: Implementation of the USB 2.0 controller not found!
```
VirtualBoxの拡張機能が足らないことが原因らしいので、「Oracle VM VirtualBox Extension Pack」を導入
[ここから](https://www.virtualbox.org/wiki/Download_Old_Builds_6_0)DLして、VirtualBoxの
　ファイル＞環境設定＞機能拡張
で、DL資材を指定して、インストール完了させた後、再度、「vagrat up」を実行！

エラーがなく完了したら、ssh接続を行い、ログインを試みる。

```cmd:コマンドプロンプト
> vagrant ssh
```
問題なければ、ログインができる。

環境のイメージとしてはこんな感じかなと。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626355/16ad2e9a-9938-c490-8346-373fe6e9a27b.png" width="500">


## 後片付け
今回、確認したいことは一通り確認できたので、作成したVMを削除する。

まずは、下記コマンドでVMの停止

```cmd:コマンドプロンプト
> vagrant halt
```
停止が完了したら、VMを下記コマンドで破棄する。

```cmd:コマンドプロンプト
> vagrant destroy
```

VirtualBoxのGUI画面を確認すると消えていることが分かる。

さて、「vagrant destroy」コマンドでVMを破棄しても、vagrantfileとBoxファイルは残っているため、１コマンドで再作成が可能であり、すぐ復旧できるので、（VM作成後にOS上で作業した内容は当然消えているけど）便利ですね～。


今回は、ここまで。

vagrantfileの内容やvargrantコマンドについては次回見てみます。