Vagrant参考ページまとめ＋超入門＋メモ

##はじめに
たくさんのPCの環境構築とかをする機会があり，これを機に，この辺を勉強することになったので，勉強しがてら，メモとして記録しています．参考ページは，入門しやすい順に並べたつもり.

##結論
Ubuntuで環境構築はしようとしてましたが，なかなかうまく行かなくて，途中からMac使ってました．
Ubuntu環境でもできたら追記していきます．

###参考ページ
[「Vagrant」って何ぞ？（・o・）](http://www.atmarkit.co.jp/ait/articles/1307/22/news076.html)
[Vagrant入門](http://weblabo.oscasierra.net/vagrant/)
[Vagrantの基本](http://qiita.com/kidachi_/items/e63c1607705178aa257c)
[Vagrantドキュメント](http://lab.raqda.com/vagrant/index.html)
[Mac OS X 版Vagrantを利用して仮想マシーンを操作してみよう](http://weblabo.oscasierra.net/macosx-vagrant-1/)
[今すぐVagrantを始めよう](http://www.symmetric.co.jp/blog/archives/533)
[ドットインストールVagrant入門](http://dotinstall.com/lessons/basic_vagrant)
[仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する](http://knowledge.sakura.ad.jp/tech/1552/2/)
[VirtualBoxやVagrantを用いたRails開発環境の構築方法（前編）](http://thinkit.co.jp/story/2014/06/25/5072)
[VagrantでBox追加してvagrant upしてdestroyしてまたvagrant upするとか](http://masayuki5160.hatenablog.com/entry/2013/05/12/230327)
[VirtualBoxとVagrantで開発環境を構築](http://www.webcyou.com/?p=4632)


##導入メモ【OS X】
まずは，VirtualBoxとvagrantのインストール．
公式サイトから落としてきて，ポチポチするだけです．
[VirtualBox](https://www.virtualbox.org/)
[vagrant](https://www.vagrantup.com/)

###使い方とか
vagrantはそれ自体が仮想環境というわけではなく，VirtualBoxなどの仮想環境を簡単に使う為のツールという感じです．また，普通にLinuxのディストリをisoで落としてきたのを使って…みたいな事もいろいろ手間をかければできるようですが，boxと呼ばれるOSがインストールされたイメージファイルを使って環境構築を行うようです．既にいろいろな種類のboxが公開されていますので，それを使用して環境を構築します．[ここ](http://www.vagrantbox.es/)でいろいろ公開されています．boxを自作する事も可能なようです．VirtualBoxとvagrantは入ってる前提で
まずはboxのインストール．ちなみに，この時，僕は上のリンクの中のboxの「CentOS7.0 x86_64 minimal (VirtualBoxGuestAddtions 4.3.14)」を選択しました．

```zsh
$ vagrant add hogehoge（インストールするやつのURL）
$ mkdir hogehoge
$ cd hogehoge
$ vagrant init hogehoge
$ vagrant up
```
ただ，ここでエラーが.起動はするんだけど，vagrantの共有ファイル機能がなんか使えない問題が発生してる．

```zsh
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

```

なんかマウントできていないよう．これは以下のプラグインで対応可能
バージョンはいくつか分からんので，自分の環境で適当に数字変えてください．

```zsh
$ vagrant plugin install vagrant-vbguest
$ vagrant up
$ vagrant ssh
$ sudo ln -s /opt/VBoxGuestAddition-4.X.XX/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions
$ exit
$ vagrant reload 
```

参考までに→[vagrant 共有フォルダをマウントできない時の対処](http://qiita.com/zakkied/items/f00b1575eee445f87c27)

さて，これで環境構築完了．他のOSとかやりたければ，最初のvagrant addで新しいのをやればOKなので
簡単です．boxを消したい時には(もうそのOSの環境は使わないなーって時とか?)

```zsh
$ vagrant box remove hogehoge
```
環境を初期化したいなーみたいな時には

```zsh
$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...
```
で簡単に初期化．destroyではboxは消えないです．
また，新しいのを作る時には最初と同じく

```zsh
$ vagrant up
```
するだけです．便利．

```zsh
$ vagrant ssh
```

これでsshで入れます．

シャットダウンする場合には

```zsh
$ vagrant halt
```

でできます．

あと

vagrant upは最初にinitした時のディレクトリじゃないとだめです．
今回なら，最初に作ったhogehogeのディレクトリの中で，ですね．

また，便利な機能として，
ホスト側の方の最初に作ってvagrant upしたディレクトリと
仮想環境の方の/vagrantが共有フォルダになっています．
何かデータを受け渡したりとか，設定ファイル置いたりとか，そういうのに便利そうですね．
（もしもこれが無いと，sftpとかでやりとりしないとダメです．）

vagrant upするときに，boxのVirtualboxの想定するバージョンと自分のVirtualboxのバージョンが異なる場合には
余計に何かを自動でインストールしているようなので，なるべく同じバージョンのboxがあると良いですね(あるとは言っていない)

[Vagrant日本語ドキュメント](http://lab.raqda.com/vagrant/index.html)

##仮想で複数のOSを起動してそれをネットワークでつなぐ
たとえば実際に4台のクラスタを作るのを想定して，vagrantで4台同じ仮想環境を立ち上げて，それらの仮想環境同士をネットワークにつなぎたいと思います．

```zsh
$ vagrant init
```
したら，vagrantfileができるので
とりあえず複数台を起動したいだけなら以下のように設定を編集するだけで良いようです
node0Xとかの名前は適当です．

「centos7」はboxをダウンロードした時に自分がつけた名前ですね．

```text:Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos7"

  config.vm.define :node01
  config.vm.define :node02
  config.vm.define :node03
  config.vm.define :node04

end
```
vagrantfileをこのように記述して

```zsh
$ vagrant up
```
これで，この記述の場合は4台の仮想環境が立ち上がります(割りと時間かかります)

でもこれだと，仮想環境同士はネットで繋がっていないので
仮想環境同士をネットワークで繋げられるように設定しましょう
vagrant initしたあと，できたvagrantfileを以下の用に変更

```text:Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos7"

  config.vm.define :node01 do | node01 |
  	node01.vm.hostname = "node01"
	node01.vm.network :private_network, ip: "192.168.33.10", virtualbox__intnet: "intnet"
  end

  config.vm.define :node02 do | node02 |
  	node02.vm.hostname = "node02"
	node02.vm.network :private_network, ip: "192.168.33.20", virtualbox__intnet: "intnet"
  end

  config.vm.define :node03 do | node03 |
  	node03.vm.hostname = "node03"
	node03.vm.network :private_network, ip: "192.168.33.30", virtualbox__intnet: "intnet"
  end

  config.vm.define :node01 do | node04 |
  	node04.vm.hostname = "node04"
	node04.vm.network :private_network, ip: "192.168.33.40", virtualbox__intnet: "intnet"
  end
end
```

node0Xとかのホストの名前とipアドレス，intnetとかの名前は適当です．

このように設定してから

```zsh
$ vagrant up
```
すると立ち上がります．

```zsh
$ vagrant ssh 
This command requires a specific VM name to target in a multi-VM environment.
```

複数のVM立ち上げておいて，sshすると，複数あってわからん，みたいに怒られます．
今回は設定で，各ノードの名前やipアドレスを指定していたので

```zsh
$ vagrant ssh node01
```
とすればこれでログインできるようになります．

さて

```zsh
$ vagrant ssh node01
(ログインできるので，ここで)
$ ssh 192.168.33.30
```
こんな感じでnode01からnode03にsshでつながります！
ちなみに，vagrantユーザの場合には，パスワードも「vagrant」のようです．

これでネットワークの設定できた，かな？

このページが参考になりました
[Vagrant で複数のVM を立ち上げて、お互いに通信できるようにするには](http://qiita.com/sho7650/items/cf5a586713f0aec86dc0)

##vagrant sshじゃなくて普通にsshで接続する場合
localから仮想環境にログインする場合は先ほどのように

```zsh
$ vagrant ssh node01
```

みたいな感じでログインできます．
node01のipアドレスは192.168.33.10でした．
これをいつもの感じで

```zsh
$ ssh vagrant@192.168.33.10
```
とか

```zsh
$ ssh node01
```

みたいな感じでログインしたい場合があります．

仮想環境とのsshに必要な情報は以下のコマンドで確認できます

```zsh
$ vagrant ssh-config
Host node01
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/shinya/hbk/.vagrant/machines/node01/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

Host node02
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/shinya/hbk/.vagrant/machines/node02/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
.
.
.
```
これを~/.ssh/configに追加すればsshコマンドで接続できます

```zsh
$ vagrant ssh-config >> ~/.ssh/config
```
とするといけます．

```zsh
$ ssh node01
```

これが，192.168.33.10とかを使いたい場合にはHostの名前を192.168.33.10に変えてしまうというのが手ですね．


##仮想環境間でのsshをパス無しで行う

今回の4つの仮想環境の場合

+ node01 192.168.33.10
+ node02 192.168.33.20
+ node03 192.168.33.30
+ node04 192.168.33.40

となっています．

```zsh
$ vagrant ssh node01
(node01にログイン)

node01$ ssh 192.168.33.20 (node02にログイン)

The authenticity of host '192.168.33.20 (192.168.33.20)' can't be established.
ECDSA key fingerprint is 14:1a:d6:19:4f:ad:89:fd:99:37:0c:f7:60:1e:ec:de.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.33.20' (ECDSA) to the list of known hosts.
vagrant@192.168.33.20's password: 
```

みたいな感じで，パスワードを入力しないと，node間でsshできません．
ちなみに，この時のパスワードはデフォルトなら「vagrant」です

sshの鍵交換をしておくとパスワードなしでできます．

```zsh
node01$ ssh-keygen

(適当にエンターボタン押すだけ．なんかゴニョゴニョして鍵が作られる)

node01$ ssh-copy-id 192.168.33.20

(node02にnode01の鍵を送る)
(この際はパスワードvagrantで認証して送信)

(以下同様にして)

node01$ ssh-copy-id 192.168.33.30
認証
node01$ ssh-copy-id 192.168.33.40
認証
```

これで，node01->02,03,04はいけるようになりました．

残りは
node02->01,03,04
node03->01,02,04
node04->01,02,03

の分を同様にして鍵を交換するだけです．簡単だね(白目)

これ自動化できないのかな？？

##それぞれの仮想環境にMPI環境を入れる

仮想で入れたCentOS7の環境にmpich2を入れようと思って

```zsh
node01$ sudo yum install mpich2
```
としても，入らないっぽいので，頑張って自前でmakeする．

せっかくなのでmpich3を入れてみよう

[公式サイト](http://www.mpich.org/downloads/)からとりあえずダウンロードしてくる

そしたら，vagrant initしたディレクトリに放り込む(共有ディレクトリを介してデータを受け渡す)

```zsh
node01$ mv /vagrant/mpich-3.1.4.tar ~/
```
これで仮想環境のホームディレクトリに持ってこれる．

解凍してmakeする

```zsh
node01$ tar xvf mpich-3.1.4.tar

(解凍)

node01$ cd mpich-3.1.4
node01$ ./configure --prefix=/opt/mpich3
node01$ make
node01$ su

(デフォルトならパスワードはvagrant)

node01$ make install

(インストールできる事を願う)

root@node01$ ln -s /opt/mpich3/bin/mpicc /usr/local/bin/mpicc
root@node01$ exit
node01$ mpicc -v

(バージョン確認)

```

入った！！

これをあと3こやれば！！

[CentOS 6.2 に mpich2 をインストール](http://ameblo.jp/takeoka/entry-11184898485.html)

-----
-----

以下完全にメモ

##導入途中メモ【Ubuntu】【失敗】
VagrantとVirtualBoxをインストール
だけど，なんかVirtualBoxのバージョンが4.3.18だとエラーが出るらしくて，
古い4.3.12が良いらしいです!!!!
これは公式

```zsh
$ sudo apt-get install virtualbox vagrant
```
入ったかどうか念の為確認

```zsh
$ VBoxManage -v
4.3.18_Ubuntur96516
$ vagrant -v
Vagrant 1.4.3
```
CentOS7の環境で試したいので，それのboxを作成します
boxのURLとかは[ここ](http://www.vagrantbox.es/)を参考にしてください．
hogehogeの部分は作るboxのタイトルなので何でも良いようです
ここでは，CentOS7のURLを指定しています．

```zsh
$ vagrant box add hogehoge https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
Downloading box from URL: https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
Extracting box...ate: 3047k/s, Estimated time remaining: --:--:--)
Successfully added box 'hogehoge' with provider 'virtualbox'!
```
途中ですすみません

##VagrantでCentOS7を動かして，Chefで環境構築