Windows上にVirtualBox+VagrantでCentOS環境構築

会社でHAProxyを試したい時、仕事中自分のMacを開いていると肩身が狭いのでばれないように仕事で使っているWindowsにVirtualBox+VagrantでCentOS環境を構築してHAProxyを試そうと言う意図で書かれたエントリです。
新しい案件もVagrant使うっぽいのでその点でもDockerを使わずに慣れようという点でVagrantを選択しています。
…(今後自分のMacを検証用に開いていもそのような思いをせずにいれる環境になることを願うばかりです。)



<h1>初めにVagrantとは何者か</h1>
触り始める前の印象はVirutualBoxに環境を立ち上げるための設定ファイルを書いてそれから同じ環境を作ることが出来ると思っています。
-> VirtualBoxのVM構築を楽にしてくれるツール
DockerはVirtualBox上にLinuxVMを作ってその上でDockerfileからイメージ作ったりイメージからコンテナ立てたりしているのでVM自体は何度も作り直さない、VagrantはVagrantfileから何度も同じ状態のVMを作る印象。


Wikipedia [Vagrant (ソフトウェア)](https://ja.wikipedia.org/wiki/Vagrant_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2) "Vagrant (ソフトウェア)")
>Vagrantを用いると、構成情報を記述した設定ファイルを元に、仮想環境の構築から設定までを自動的に行うことができる。当初はVirtualBoxをターゲットとしていたが、1.1以降のバージョンではVMwareなどの他の仮想化ソフトウェアやAmazon EC2のようなサーバー環境も対象とできるようになった。Vagrant自身はRubyで作成されているが、PHPやPython、Java、C#、JavaScriptといった、他のプログラミング言語の開発においても用いることができる。

とのことです。
VirtualBox以外の環境でも使えるんですね。

[Vagrantの基本](http://qiita.com/kidach1/items/e63c1607705178aa257c "Vagrantの基本")
>ミドルウェアの設定やインストールを行うツール
eg.シェルスクリプト、Chef（chef-solo, chef-client）、Puppetなど

Vagrantfile自体にはサーバーの環境情報だけ記述してサービスのインストールなどは他のソフトでやってね、ということでしょうか
Dockerfileにはミドルウェア含めイメージ作成出来るのでVagrantのここは少し面倒な気がします、実行するレイヤーが違うと言われたらしょうがないけれど。
とりあえずVagrantはAnsibleとかChefでうまくやってねということと覚えておけばいいでしょう。

あとVagrantは、CentOSなどを立ち上げてyumでなんやらかんやらインストールしたあとにCentOSをストップして再び立ち上げると、yumでインストールしたものが残っているらしいです。
完全にVagrantfileに記述している状態で起動したい場合は、VMを削除して再び立ち上げないといけないので気軽に試して気軽に捨てるということが少し難しそうです。
`--rm`欲しい…


では上で調べたことを検証していきたいので実際に始めてみましょう。



<h1>VirtualBoxインストール</h1>

こちらのURLの
https://www.virtualbox.org/wiki/Downloads
VirtualBox 5.0.14 for Windows hosts x86/amd64をクリックしてダウンロードしてぽちぽちすればインストール完了です。

![virtualbox.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/239c308d-9f0d-8e63-4fe4-cda37a73d452.png)



<h1>Vagrantのインストール</h1>
こちらのURLの
https://www.vagrantup.com/downloads.html
WINDOWSをクリックしてダウンロードします。踊って待ちましょう。
舞は大切です、エンジニアリングの観点から見てもダウンロード成功率を高めることが確認されています。
![vagrant.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/af273ee8-257f-5f98-b591-539e1a2e31cc.png)

ダウンロードしたmsiをダブルクリックしてインストールしましょう。
インストール後はWindowsの再起動が必要です。


<h1>VirtualBoxにCentOS boxファイルを登録する</h1>

`vagrant box add VM名 boxファイルURL`

今回はCentOS6.7を選択しています。
なので
`vagrant box add centos6-7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box`
というコマンドを実行します。
boxファイルのダウンロードはかなり時間のかかるので今回はコンソールを眺めて眉間にしわを寄せながらあたかも仕事している風を装いましょう、人生を無駄に出来ます。

※他のOSを選択したい場合はboxファイルをここから選択してください。
http://www.vagrantbox.es/

ダウンロードが完了したら次のコマンドで確認しましょう
`vagrant box list`
`centos6-7`と確認できたので良さそうです。


<h1>Vagrantfileの作成</h1>

`vagrant init box名`
で生成します

`vagrant init centos6-7`
カレントディレクトリにVagrantfileが作成されます。
僕の場合
`/d/various/vagrant/centos6-7/`にしました

生成したVagrantfileを編集します

``` 
// Windowsから見ることの出来るIPを指定
config.vm.network "private_network", ip: "192.168.33.10"

// GUIモードの設定をONにする
config.vm.provider "virtualbox" do |vb|
  # Display the VirtualBox GUI when booting the machine
  vb.gui = true
end
```



<h1>VM立ち上げ</h1>
設定が済んできたのでCentOSのVMを立ち上げてみましょう

立ち上げるコマンドは
`vagrant up`
で先ほど編集したVagrantfileがあるディレクトリ上で行わなければいけません

Dockerの場合buildは遅いですがコンテナ起動のrunは高速です
Vagrantのupの場合はVagrantfileから起動する初回起動に少し時間がかかります

![vm-run.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/bc769745-f3aa-9324-3a54-b0164ccd13a7.png)

起動したらlogin/passwordともにvagrantと入力すればログイン出来ます


GUIで開きましたが、このCentOSに他のコンソールからssh接続したい場合は
`vagrant up`したディレクトリから
`vagrant ssh`
と入力してログインするか
![vagrant-ssh.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/38733930-0571-a557-6e35-7a6080db343e.png)


`ssh vagrant@192.168.33.10`
でsshログイン出来ます
![vagrant-sshlogin.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/73f11ea8-2583-af56-bbf1-9cfbcb6d6c65.png)



<h1>HAProxyのインストール</h1>

現在はHAProxyがサービスとして認識されていません。
![vagrant-chkconfig.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/99dccdf8-118a-9218-dbea-04645e8d4e5a.png)


インストールしていきます
`sudo yum -y install haproxy`

haproxyがインストールされたことが確認できました
![vagrant-chkconfig2.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/9bfdad94-c27d-ed3d-a775-1f1344792964.png)

※今回はHAProxyの設定はしません


<h1>VM停止</h1>
最初疑問だったvagrantはVMが停止した後に状態を保持するのかが気になっていたのでここで検証してみます。

vagrantにVMを停止する方法は
`vagrant halt`
と
`vagrant destroy`
の2つあります

まずはhaltを試していきます。

upしたディレクトリで
`vagrant halt`

![vagrant-halt.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/b7ea3004-513f-ecc2-3b96-8d99c3d5873a.png)

これを実行するとGUIで立ち上がっていたコンソールも閉じられます。

そしてもう一回`vagrant up`でVMを起動してみましょう
`vagrant up`
２回目の起動も地味にかかる点…
![vagrant-reup.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/e0a1a26a-3c2e-c33c-a24f-a5d4203afe26.png)

chkconfigでhaproxyが保持されているか確認
![vagrant-chkconfig3.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/6fbad00d-ba4c-342a-67c8-e18a1a46ccd1.png)

haproxyがあるのが確認できます
>vagrantはVMが停止した後に状態を保持するのか

結論は保持される、でした


では`vagrant destroy`はどうでしょう

`vagrant destroy`

※destroyはVM停止中でも実行できます

![vagrant-destroy.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/32f4c1ad-829c-5c59-9414-eb7024882923.png)

destroyコマンドを打っても`y`を押さない限り消されることはありません、確認大事


再び
`vagrant up`

![vagrant-chkconfig4.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/fbcfa262-4979-06a3-5ca0-b9b5746543d9.png)
destroyはVMを削除するので予想通りhaproxyは存在しませんでした




<h1>番外編</h1>

個人的にGUIモードは必要ないのでVagrantfileのGUI設定を無効にして`vagrant up`すると
CentOSのウィンドウは現れませんでした


```
// GUIモードの設定をONにする
#config.vm.provider "virtualbox" do |vb|
#  # Display the VirtualBox GUI when booting the machine
#  vb.gui = true
#end
```

`vagrant status`で起動しているのか確認

![vagrant-status.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/ff52f81e-410a-297c-fb64-863dca3ebdf8.png)

立ち上がっていますね、sshログインも問題なく出来ました。






<h1>所感</h1>
vagrantを触ってみてdockerよりもシンプルに考えることが出来るツールだと思った
直接VMを立ち上げるのでそう感じるのかもしれない
dockerは覚えると高速に起動出来過ぎて素晴らしいが、最初概念を理解するのが少し難しい

今回はCentOSを立ち上げるだけで難しいことはやっていないので、次はChefやAnsibleなどを使って色々な環境を整える練習をしてみたいと思う


今回の参考資料はこちらです
[Windows上でVirtualBox+Vagrant+CentOSによる仮想環境構築](http://qiita.com/hiroyasu55/items/11a4c996b0c62450940f "Windows上でVirtualBox+Vagrant+CentOSによる仮想環境構築")


以上です








<h1>コマンドメモ</h1>

`vagrant box add box名 boxファイル`: ローカルにボックスファイルをダウンロードする
`vagrant box list`: box一覧確認
`vagrant init box名`: Vagrantfileの作成
`vagrant up`: VagrantfileからVMを起動する
`vagrant status`: 起動しているVM一覧確認
`vagrant halt`: VM停止
`vagrant destroy`: VM削除
`vagrant ssh`: 簡単にSSHログイン出来る