新人向け開発環境知識（Vagrant編）

記事執筆時点で、プログラマ歴３週間の雑魚プログラマが記事を書いています。
間違っている可能性がございますので、参考までに御覧ください。
OS X El Capitan‎とWindows7の実行環境にて動作確認済み。

## Vagrantとは
Vagrantは、開発環境の構築と共有を簡単に行うためのツール。
実際にサービスを作る時、チームで開発する時など皆が同じ開発環境を構築できるように、仮想環境を立てるときに役立ちます。
Vagrantは同じ環境を再現できるように仮想マシン環境の管理する機能＋共有する仕組みを提供してくれます。

[[参照したサイト:開発環境の構築・共有を簡単にするVagrant入門]](https://thinkit.co.jp/story/2015/03/19/5740)
全くvagrantについて知らない人は、[ドットインストール](http://dotinstall.com/lessons/basic_vagrant)でも見てね。
新人の場合、プロジェクトに加入した時（またはPCをもらった時）に最初に行う環境構築作業になるかと思います。この記事で、新人の仲間の役に少しでも立てればと思います。

## 準備(Vagrant&VirtualBox)
1. こちらからVagrantをダウンロード：[Vagrantサイト](https://www.vagrantup.com/)
2. 上記サイトからダウンロードできたら、dmgファイルを開いて手順通りにインストール
3. こちらからVirtualBoxをダウンロード：[Oracle VM VirtualBox](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html)
4. 上記サイトからダウンロードできたら、dmgファイルを開いて手順通りにインストール

## 導入
* Vagrantに複数のVMを立てることを想定し、適当に作業ディレクトリを作りましょう。  
作業ディレクトリ名はボックス名に合わせると良いかと思います。
（今回はubuntu14.04を使用するので'ubuntu_1404'と命名します）

```
 mkdir ubuntu_1404
 cd ubuntu_1404
```

* boxのダウンロードは[こちら](http://www.vagrantbox.es/)  
boxの追加方法は、コマンドを叩くか直接ダウンロードするか２通りある。  

>* コマンドを叩いてダウンロードする場合。  
   1. [上記のサイト](http://www.vagrantbox.es/)から入れたいboxを探し、URLをCOPYする
   2. ```vagrant box add {title} {url}```  
    上記コマンドを打つ。{title}は何でも良いが、入れるbox＆バージョン名にしておくと管理しやすい。（例：ubuntu1404など）
    
>* ソースを直接ダウンロードする場合。
   1. [上記のサイト](http://www.vagrantbox.es/)から入れたいboxを探し、Nameの欄にリンクの貼ってあるboxを選び直接ダウンロードしてくる。
   2. 先ほど作成した作業ディレクトリ配下に、ダウンロードしてきたboxを移動する
   3. ```vagrant box add {title} {path}```  
    上記コマンドを打つ。{title}は何でも良いが、入れるbox＆バージョン名にしておくと管理しやすい。（例：ubuntu1404など）
 
* boxを追加できているか確認する

```
vagrant box list
```  
* 確認が取れたら、Vagrantfileを生成する。

```
vagrant init {title}
```
{title}はboxを追加した時に命名した{title}です（上記例だと'ubuntu1404'）

## Vagrantfileの設定
####box周りの設定

```Vagrantfile
config.vm.box = "ubuntu1404" # boxをaddした時の'title'で使用するboxを指定
config.vm.box_url ="boxを参照するurl" # urlからboxを取得(localに無ければ)
config.vm.box_check_update = false # boxのアップデート
```
####ネットワーク周りの設定
「ポートフォワーディングとは、ローカルコンピュータの特定のポートに送られてきたデータを、別に用意した通信経路を用いてリモートコンピュータの特定ポートに送信すること」らしいです。[(参照)](http://e-words.jp/w/%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.html) 

ホスト・ゲスト間でのファイル共有／同期するディレクトリの指定に関しては、
詳細に書かれた記事がございますので、以下を参照して下さい。
[[Vagrant]ホスト/ゲスト間のファイルの共有/同期機能（SYNCED FOLDERS）について](http://to-developer.com/blog/?p=1834)

```Vagrantfile
# ポートフォワーディングの設定
config.vm.network "forwarded_port", guest: 80, host: 8080

# プライベートネットワークでのIPアドレス指定
config.vm.network "private_network", ip: "127.0.0.1"

# ホスト・ゲスト間でのファイル共有／同期するディレクトリを指定
config.vm.synced_folder "../data", "/vagrant_data"
```

####VMの設定

```Vagrantfile
vb.gui = true # 仮想ウインドウをGUIモードで起動
vb.memory = "1024" # 起動するVBに割くメモリの大きさ
```

####複数vm起動

```Vagrantfile
  config.vm.define :node01 do |cfg|
    cfg.vm.box = "このvm起動用box(重複可)"
    cfg.vm.network :hostonly, "このvm起動用IP(重複不可)"
    cfg.vm.host_name = "node01"
  end

  config.vm.define :node02 do |cfg|
    cfg.vm.box = "このvm起動用box(重複可)"
    cfg.vm.network :hostonly, "このvm起動用IP(重複不可)"
    cfg.vm.host_name = "node02"
  end

  config.vm.define :node03 do |cfg|
    cfg.vm.box = "このvm起動用box(重複可)"
    cfg.vm.network :hostonly, "このvm起動用IP(重複不可)"
    cfg.vm.host_name = "node03"
  end
```

基本的なところはこんなところでしょうか。 
その他にVagrant起動時にDockerコンテナ起動するように構成したりなどもできます。 
興味があれば、色々あるんで調べて下さい。

## 補足
windowsユーザーは、Linux環境構築にあたり[TeraTerm](https://osdn.jp/projects/ttssh2/)をインストールすることをオススメします。 
macユーザーは[iterm2](https://www.iterm2.com/)を入れているかと思いますので、iterm2を使っていればOKです。 

TeraTermのインストールは[こちら](https://osdn.jp/projects/ttssh2/)から 
VagrantとTeraTermの連携は以下を参照。

* [vagrant ssh で TeraTerm を起動する](http://qiita.com/kumazo@github/items/026ebbc646505681e61f) - Qiita
* [VagrantにTeratermマクロで接続する](http://qiita.com/tiibun/items/61c64c6b261887d455ee) - Qiita
* [vagrant teraterm が便利すぎてしょうがない件](http://blog.pg1x.com/entry/2015/10/31/233246)


## Vagrantコマンド（よく使うやつ）

|操作|コマンド|
|:---|:---:|
|仮想マシン起動|vagrant up|
|仮想マシン停止|vagrant halt|
|仮想マシン再起動|vagrant reload|
|仮想マシン削除（boxをaddして、initする前の状態に戻す。）|vagrant destroy|
|仮想マシン接続|vagrant ssh|
|仮想マシン接続状況表示|vagrant ssh-config|

上記のコマンド以外は、バージョン確認(`vagrant -v`)とインストール時に利用したboxコマンドぐらい。 
boxコマンドは普段あまり使わないので、都度ググれば良いかな？

## 追記：VagrantのゲストOSへの簡単proxy設定

会社とか研究室だとproxy周りの設定もしなければ、いけないことがあるかと思います。
そんな時に役立つ設定方法を紹介してくれている記事があります。 
新人だとproxy周りでハマることが多いと思うので、参考までにどうぞ。 
[vagrant-proxyconf で行う ゲストOSへのかんたんProxy設定](http://weblabo.oscasierra.net/vagrant-proxyconf/)

ちなみにproxyに関しては、「環境変数の設定」「各ブラウザでのプロキシ設定」は忘れないようにしましょう。