Vagrantでboxファイル作成

## 概要
Vagrantで、自分好みのカスタマイズをしたboxを作成する。

[関連記事]
[Vagrantのインストール、設定手順](http://qiita.com/Esfahan/items/41c4469f28f6011ab33b)
[VagrantでSSH鍵の設定](http://qiita.com/Esfahan/items/e5f707dc6d116c2cc751)

## 必要要件
Windows上で、Git-bashを使います。その他のクライアントソフトでもOKです。
[Git-bashダウンロード](https://git-scm.com/downloads)

下記コマンドで、`[Git-bash]$`となっているものが、Git-bash上、付いていないものは、サーバーにsshでログインして実行するものとなります。

## 環境
- Vagrant 1.8.1


## Vagrant起動

ベースとなるOSを選択して、`init` & `up`

```
[Git-bash]$ vagrant init centos67
[Git-bash]$ vagrant up
```



## パッケージに含めたいものを設定をする

パッケージに含めたい必要なミドルエアのインストールや、その他設定を行う。今回は、下記の2つを行う。

- 新規ユーザーの追加
- PHPのインストール

#### まずはVagrantにSSHでログイン

```
[Git-bash]$ vagrant ssh
```

### 1. ユーザの追加 
([こちらを参照](http://qiita.com/Esfahan/items/a159753d156d23baf180))
パスワードなしでsudoできるようにする。

### 2. PHPのインストール

```
# yum list installed | grep php
# yum install -y php
```

## MACアドレスとのマッピングを無効にする

vagrantでパッケージをした場合などに、MACアドレスとのマッピングがうまくいかなくなり、Vagrantfileで指定しているipアドレスでアクセスができなくなることがあるので、下記コマンドでマッピングを無効にしておく。

ちなみにエラー時にはこんなものが出る。
`The following SSH command responded with a non-zero exit status`

参考：http://to-developer.com/blog/?p=1827

```
$ sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

## Vagrant停止

```
$ exit
[Git-bash]$ vagrant halt
```

## boxファイルの生成

```
[Git-bash]$ vagrant package
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: c:/vagrant/package.box
```

package.boxが生成されたことを確認

```
[Git-bash]$ ls | grep box$
package.box
```

## 生成したboxファイルをVagrantに登録

```
[Git-bash]$ vagrant box add mycentos67 package.box
==> box: Box file was not detected as metadata.Adding it directly...
==> box: Adding boc 'mycentos67' (V0) for provider:
    box: Unpacking necessary files from: file://c:vagrant/package.box
    box: Progress: 100% (Rate: 485M/s, Estimated time remaining --:--:--)
==> box: Succesfully added box 'mycentos67' (v0) for 'virtualbox'!
```

- 新しいboxが追加されたことを確認

```
[Git-bash]$ vagrant box list
centos67 (virtualbox, 0)
mycentos67 (virtualbox, 0)
```

## 新しいboxでVagrant起動

別のboxを設定することになるので、
現在のVagrantfileがあるディレクトリではなく、別の場所へ移動して、`vagrant init`してください。

```
[Git-bash]$ vagrant init mycentos67
[Git-bash]$ vagrant up
[Git-bash]$ vagrant ssh
```

### 中身確認

- sampleuserのユーザーの確認

```
$ sudo su - 
# sudo su - sampleuser
$ whoami
sampleuser
$ groups
sampleuser wheel
```

- PHPの確認

```
$ sudo yum list installed | grep php
```

## ログインユーザーを変更

デフォルトのログインユーザーを`sampleuser`に変更する。

#### 1. vagrantユーザーの.sshディレクトリを、sampleuserのホームディレクトリ直下にコピー。

```
$ sudo su -
# cp -rp /home/vagrant/.ssh /home/sampleuser/
# chown sampleuser:sampleuser -R .ssh
```

既に下記と同様のパーミッションになっていると思いますが、念のため確認してください。
正しいパーミッションになっていないと、SSHでログインできません。

```
$ sudo chmod 700 /home/sampleuser/.ssh
$ sudo chmod 600 /home/sampleuser/.ssh/authorized_keys
```

#### 2. OSからログアウトして、秘密鍵の場所を確認

```
[Git-bash]$ vagrant ssh-config
  (**snip**)
  IdentityFile xxxx/vagrant_private_key
  (**snip**)
```

#### 3. Vagrantfileに追記

```
[Git-bash]$ vi Vagrantfile

(**snip**)
# IPアドレスの設定
config.vm.network "private_network", ip: "192.168.33.10"

(**snip**)

# ログイン情報設定
config.ssh.guest_port = 22
config.ssh.username = "sampleuser"
config.ssh.host = "127.0.0.1"
config.ssh.private_key_path = "xxxx/vagrant_private_key"
```

#### 4. Reload

```
[Git-bash]$ vagrant reload
```


## vagrantユーザー削除

```
[Git-bash]$ vagrant ssh
$ sudo userdel vagrant
```

## IPアドレス指定でSSHログインできることを確認

Teratermなどで確認。

```
$ ssh sampleuser@192.168.33.10
```

以上



SSH周りがうまく行かないときは、こちらも参考にしてみて下さい。
[VagrantでSSH鍵の設定 - [Authentication failure. Retrying…]の対処策](http://qiita.com/Esfahan/items/e5f707dc6d116c2cc751)




[参考]
[Vagrant で作った仮想マシンから Box ファイルを作りなおす](http://momijiame.tumblr.com/post/65429388802/vagrant-%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9F%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%8B%E3%82%89-box-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%AA%E3%81%8A%E3%81%99)
[Package化したboxを使うときによく出るエラー](http://blog.10rane.com/2015/08/28/errors-out-when-using-to-package-the-box/)
[Vagrant で作った VM にやってはいけない2つのこと](http://qiita.com/megane42/items/1d8ae7444d8c1b10bbd7)
[vagrantでログインする際のユーザーを変更する](http://qiita.com/YusukeHigaki/items/8e8508cd9603958fbf0a)