VagrantコマンドとVagrantfileの設定メモ

Vagrant のコマンドと Vagrantfile の設定をメモしておきます。

# 環境
Vagrant の利用には VirtualBox が必要です。ボクは Mac+VirtualBox+Vagrant で実行しています。

- https://www.vagrantup.com/
- https://www.virtualbox.org/

ホストは Mac を使用しています。

# よく使う言葉
Vagrant を使っていてよく使う単語です。

| 単語 | 説明 |
|:-----------:|:------------:|
| ホストOS | SSH で接続する側の OS。ボクの場合 Mac。 |
| ゲストOS | 接続される側の OS。CentOS や Ubuntu など。 |

Vagrant の起動や停止については、実際には VirtualBox 上で VM が起動したり停止したりしています。

# Vagrant を init
`vagrant init` で Vagrantfileを作成します。

```bash:Vagranfileを作成します
vagrant init
```
`vagrant init` をしたディレクトリに Vagrantfile という設定ファイルが作成されます。そして、`vagrant up`などのコマンドが使えるようになります。

# Vagrantを起動
Vagrantfile が作成されたディレクトリで、`vagrant up` コマンドを実行すると Vagrant が起動します。

```bash:Vagrantを起動
vagrant up
```
Vagrant が起動というのは実際には VirtualBox の VM が起動しています。Vagrant を起動した後に、VirtualBox.app を起動してみてください。

# VMの状態を確認
Vagrant を起動したら、Vagrant が起動しているか `vagrant status` を使ってVMの状態を確認してみましょう。

```bash:VMの状態を確認
vagrant status
```

起動している場合

```bash:VMが起動している状態
default                   running (virtualbox)
```

停止している場合

```bash:VMが停止している状態
default                   poweroff (virtualbox)
```
Vagrant につながらない場合などは、まず `vagrant status` で状態を確認すると良いです。

# Vagrantを停止
haltで停止できます。

```bash:Vagrantを停止
vagrant halt
```

# Vagrantを再起動

```bash:Vagrantを再起動
vagrant reload
```

# Vagrantへsshログイン

```bash:Vagrantへログイン
vagrant ssh
```
もしパスワードを聞かれる場合は、`vagrant`と入力します。

# Vagrantのユーザーについて

OS 内の vagrant ユーザーのパスワードは **vagrant** です。
つまり、`su` コマンドで root になる場合にもパスワードを求められるので上記を利用します。


# Vagrantのboxを追加

```bash:boxの追加方法
vagrant box add boxの名前 boxのパス
```
例えばcentos-5.6というboxを追加する場合

```bash:CentOSのbox追加例
vagrant box add centos-5.6 http://dl.dropbox.com/u/9227672/centos-5.6-x86_64-netinstall-4.1.6.box
```
# Vagrantのbox一覧を確認
Vagrantのbox一覧を確認するコマンドです。

```bash:box一覧の確認
vagrant box list

centos64                       (virtualbox, 0)
centos66                       (virtualbox, 0)
laravel/homestead              (virtualbox, 0.2.2)
miya0001/vccw                  (virtualbox, 1.9.5)
```
boxが一覧で表示されます。

# Vagrantのboxを書き出し
既に存在するboxを書き出す場合です。boxを書き出す前に`vagrant halt`でvagrantを停止しておきます。

```bash:boxの書き出し
vagrant package

==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...

略
```
package.boxという名前でboxが書き出されます。
出力されたpackage.boxを利用すれば、dockerやchefなどを使用しなくてもほぼ同様の体験を実現できます。オススメです。

# Vagrantのboxを削除

```bash:boxを削除
vagrant box remove box名
```

## 特定バージョンのboxを削除
box の名前が同じだが、box のバージョンを指定した削除方法です。

```
vagrant box remove box名 --box-version 1.9.5
```
`--box-version`の後ろにバージョン番号を指定します。

# Vagrant の box を update
box を updateする場合は`box update`を実行します。

```bash:boxのupdate
vagrant box update
```

## Vagrant の box を物理的に削除したい

box は`~/.vagrant.d/boxes/`ディレクトリに配置されています。

# アクティブなVMを確認
アクティブな Vagrant 環境を確認するコマンドです。

```bash:
vagrant global-status
```

# アクティブなVagrantを停止
vagrant global-status で表示された Vagrant を destroy したいときに実行します。

```bash:destroy
vagrant destroy VagrantのID
```

# Vagrant のバージョンを確認
Vagrant のバージョンを確認します。

```bash:バージョンを確認
vagrant -v
```

# Vagrant の ssh-config の設定
Vagrant に ssh で接続できない場合の調査などに使えます。

```bash:ssh設定の確認
vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/pugiemonn/Documents/workspace/pugiemonn.com/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

# Vagrantfileの設定

## boxの設定

```rb:boxの設定
config.vm.box = "box名"
```

## ネットワークの設定
ゲストマシンのネットワーク設定には`config.vm.network`を使用します。

```rb:networkの設定
config.vm.network "private_network", ip: "192.168.33.10"
```
ネットワークを少しかじるとわかるのですが、ホスト側に存在する ip が被った状態で複数の VagrantBox を立ち上げることはできません。ある box を ip アドレス`192.168.33.10`で立ち上げいている場合、新たに VagrantBox を立ち上げるには、`192.168.33.10`以外のipを指定する必要があります。

### auto_config̶̶設定
Vagrant は自動でネットワークを設定してくれます。`config.vm.network`の`auto_config`が true になっているからです。Vagrant が勝手に設定してくれるネットワーク設定で都合が悪い場合はauto_config の値を変えてみると解消するかもしれません。

```rb:
config.vm.network "private_network", ip: "192.168.33.10", auto_config:false
```
`auto_config:false`をつけた例です。

## synced_folder でフォルダの同期設定
synced_folder を使用すれば、Mac側でコードを書いて、Vagrant 経由で動作検証などのフローが簡単に構築できます。

ホスト PC と Vagrant のディレクトリを同期するには、synced_folder を指定します。

```rb:synced_folderの基本
config.vm.synced_folder "ホストPC側のパス", "Vagrant側のパス"
```
ホスト側の workspace ディレクトリと、ゲスト側・Vagrant側の/var/www/htmlを同期する場合の例です。

```rb:synced_folderの基本
config.vm.synced_folder "/Users/pugiemonn/Documents/workspace", "/var/www/html"
```
ホスト側のパスは`"~/Documents/workspace"`などと書くこともできます。VagrantfileをGitリポジトリに入れてしまう場合は、`"./"`のようにしてしまうと作業をシェアする際に、作業環境ごとにパスを書き換える必要がないので楽になります。

### nfs で synced_folder を高速化
`nfs` を `true`にすると `vagrant up`が早くなります。ただし Mac 側の root パスワード入力が必要です。

# 参考

- https://www.vagrantup.com/docs/