VirtualBox+VagrantでCentOS7環境構築

# はじめに
CentOS7環境をVirtualBox+Vagrantで環境構築する手順を記します。

# 構築手順
CentOS7の環境構築は、Ubuntuとほぼ構築手順は同じですが、そのままの同じ手順で行うとエラーが発生するケースがあるので回避する手順が追加されます。

Ubuntu環境構築手順についてはこちらを参照
http://qiita.com/mikoski01/items/366cb9a90b7381a03db0


## 1. VirtualBoxのインストール
VitualBoxを既にインストールしている場合は読み飛ばしてください。
[VitualBox本家サイト](https://www.virtualbox.org/wiki/Downloads)からWindows版をダウンロードしインストールします。

## 2. Vagrantのインストール
Vagrantを既にインストールしている場合は読み飛ばしてください。
[Vagrant本家サイト](https://www.vagrantup.com/downloads.html)からWindows版をダウンロードしインストールします。

## 3. Vagrantのプロキシの設定
プロキシを介してVagrantを使う場合はシステム環境変数に下記を追加します。
OSの環境変数に下記のように設定してください。

| 変数名     |値   |
|:-----|:----------------|
| HTTP_PROXY |http://<プロキシサーバ名>:<ポート番号>|
| HTTPS_PROXY |http://<プロキシサーバ名>:<ポート番号>|

【例】ホスト:proxy.mytest.co.jp、ポート:8080の場合
![proxy_env.png](https://qiita-image-store.s3.amazonaws.com/0/61752/be8045cd-bc86-48c9-2faa-c8cec847a156.png)


## 4. Vagrantのプラグインをインストール

### 4-1. vagrant-vbguestをインストール
仮想マシンのカーネルを新しくする度に Guest Additions を手動で再インストールする必要がありますが、vagrant-vbguestプラグインをインストールすることでその煩わしさを取り払ってくれます。便利プラグインなのでインストールすることをお勧めします。

 下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant plugin install vagrant-vbguest
```

※詳細について知りたい方はこちらを参照
http://blog.amedama.jp/entry/2015/08/19/204044
https://github.com/dotless-de/vagrant-vbguest

### 4-2. vagrant-proxyconfをインストール
プロキシを介している場合はインストールしてださい。
このvagrant-proxyconfプラグインを利用すると、ゲストOSの以下の機能に対して Proxy の設定を自動的に行ってくれます。

- 多くのプログラムがサポートしているhttp_proxyなどの環境変数
- Chef provisioners
- Apt
- Docker
- Git
- npm
- PEAR
- Yum
- Subversion

 下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant plugin install vagrant-proxyconf
```

※詳細について知りたい方はこちらを参照
http://weblabo.oscasierra.net/vagrant-proxyconf/
https://github.com/tmatilai/vagrant-proxyconf

## 5. Vagrantfileの作成

```bat:コマンドプロンプト
cd <適当な作業フォルダ>
vagrant init
```

作業フォルダ直下に「Vagrantfile」が作成されているはず。

## 6. Vagrantfileの修正
前回の手順で生成した「Vagrantfile」ファイルを修正します。

### 6-1. proxyとvbguestの設定
「Vagrant.configure("2") do |config|」の直後に設定を追記してください。

- プロキシを介している場合、下記のようにプロキシ情報を設定。
プロキシを介していない場合、「config.proxy.enabled  = false」に設定するか、「if Vagrant.has_plugin?("vagrant-proxyconf") ～ end」を記載しなければ正常に稼働します。
- vbguestを下記のように設定。


```text:Vagrantfile
  ...
Vagrant.configure("2") do |config|

  if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.enabled  = true  # => true; all applications enabled, false; all applications disabled
    config.proxy.http     = "http://<プロキシホスト名>:<プロキシポート>"
    config.proxy.https    = "http://<プロキシホスト名>:<プロキシポート>"
    config.proxy.no_proxy = "localhost,127.0.0.1"
  end

  if Vagrant.has_plugin?("vagrant-vbguest")
    # set auto_update to false, if you do NOT want to check the correct
    config.vbguest.auto_update = true
  end

  # The most common configuration options are documented and commented below.
  ...
```

### 6-2. boxの設定
対象のCentOS7のboxを設定します。
今回はCentOS公式のboxを使用します。

まず、下記にアクセスします。
https://www.vagrantup.com/
![vagrant_top.png](https://qiita-image-store.s3.amazonaws.com/0/61752/6da79cd4-1508-18e9-be1a-1a354f0af2f3.png)


「Boxes」押下

![vagrant_box.png](https://qiita-image-store.s3.amazonaws.com/0/61752/de36360a-2b12-5d11-81e1-a2da56378706.png)


検索項目に「centos」を入力して検索
「centos/7」が表示されていると思うので、この書式（文字列）をコピーしてVagrantfile内の「config.vm.box」項目に設定します。


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

### 6-3. 同期フォルダの設定
ubuntuの時とは異なり、この設定を入れておかないとエラーとなります。
![sync_follder_error.png](https://qiita-image-store.s3.amazonaws.com/0/61752/f494aa19-fb3b-aa96-acf4-c1f8ddfbf752.png)



下記のように設定してください。
※「**type:"virtualbox"**」を明示的に指定してください。

```text:Vagrantfile
  ...
Vagrant.configure("2") do |config|
　...
  # config.vm.synced_folder "../data", "/vagrant_data"
  config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
  ...
```



共有は下記表のように設定されます。

| 環境       |       共有フォルダ |備考|
|:-----------------:|:------------------:|:---|
|ゲストOS(CentOS7)| /vagrant| CentOS7にフォルダが用意されているため変更しないで！| 
|ホスト(Windows)| .（作業フォルダ）| 環境に合わせて変更可能|




### 6-4. IPの設定
IPアドレスを変更したい場合は想定する環境に合わせて設定してください。

```text:Vagrantfile
  ...
Vagrant.configure("2") do |config|
　...
  config.vm.network "private_network", ip: "192.168.33.10"
  ...
```


### 6-5. ポートフォワードの設定
ポートフォワードを設定したい場合は想定する環境に合わせて設定してください。

```text:Vagrantfile
  ...
Vagrant.configure("2") do |config|
　...
  config.vm.network "forwarded_port", guest: 80, host: 8080
  ...
```

※ポートフォワードの説明については下記を参照
[vagrantのネットワークについて - ポートフォワーディング]
(http://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11#%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)


## 7. ゲストOS起動
Vagrantfileの配置されているフォルダで下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant up
```

### ゲストOS起動時にエラーが発生した場合

![error.png](https://qiita-image-store.s3.amazonaws.com/0/61752/0d05ccc6-0b18-3833-d4c7-8928d9186055.png)

上図のようなエラーが発生するケースがあります。
エラーが発生した場合は下記コマンドを実行して対応しましょう。


1.ゲストOSにアクセスします。

```bat:コマンドプロンプト
vagrant ssh
```

2.カーネルのアップデートを行います。

```bat:コマンドプロンプト(ゲストOSログイン中)
sudo yum -y update kernel

sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++

exit
```

3.再起動します。

```bat:コマンドプロンプト
vagrant halt
vagrant up
```

エラーの原因はカーネルのアップデートまわりだと思われます。
「vagrant-vbguest」プラグインが発動する前にファイル共有処理が実行されるため、カーネルのアップデートが行われません。そのため、初回のみ手動でアップデートを行う必要があります。

※エラーについてこちら参照
 http://blog.a-way-out.net/blog/2016/03/11/vagrant-failed-to-mount-folders-in-linux-guest/




## 8. ゲストOSへログイン
### 8-1. コマンドプロンプトからそのままログインする場合
Vagrantfileの配置されているフォルダで下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant ssh
```

### 8-2. ターミナル(TeraTerm、PuTTY等)を使う場合
Vagrantfileで設定したIP（デフォルト: 192.168.33.10）へSSHでログインできます。
Ubuntuとは異なり、鍵を用いてアクセスします。鍵は下記パスを指定してください。
　　**<作業フォルダ>\.vagrant\machines\default\virtualbox\private_key**

※ ID / PW : vagrant / なし(鍵を指定)
TeraTermの例
![ssh.png](https://qiita-image-store.s3.amazonaws.com/0/61752/3515b59f-d66d-d3da-0383-332366e0a5ea.png)


## 9. ゲストOS停止
Vagrantfileの配置されているフォルダで下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant halt
```

以上。