Vagrant カスタムboxの作成(CentOS7 + Virtualbox5.0) 改定版


# 概要
 [前回の投稿](http://qiita.com/saitou1978/items/8e29b4f17257d8447d83)の修正。
 ヘッドレスのbox作成は失敗していたが、VirtualBoxのバージョンアップに伴い面倒な作業はなくなった。
以前はMacbook proで作っていたが、壊れてしまったのでUbuntuを用意し試した。一連の操作に差異がないことの確認ができた。

## 環境

　Boxを作成するために使ったホストOSの環境。

```
$ lsb_release -d
Description:	Ubuntu 14.04.4 LTS
$ uname -mrs
Linux 3.19.0-58-generic x86_64
$ VBoxManage --version
5.0.16r105871
```


## 元になるゲストOSをインストール
　Virutalbox上でゲストOSをインストールする。新規で作成し、名前を"CentOS7"とした。
　カスタムBoxを作るのが目的なので基本的には好きにしていい。ただし、BoxはゲーストOSをアーカイブしてダウンロードすることになるため、最小パッケージがおすすめ。Hashicorpへの公開を前提とすればインターネットを介してダウンロードすることになるので、OSのサイズは小さい方がいい。
　インストールが終わったらゲストOSをshutdownするが、その前に必要なパッケージの追加や設定を行ってもいい。

## Virtualboxの設定

以下のようにした。

| 変更する項目 | 変更後の値 |
|:----------- |:------------:|
|メインメモリー | 512MB |
|フロッピー | 無効 |
|アクセラレーション | Legacy|
|オーディオ| 無効|
|USBコントローラー | 無効|

その他は初期値のまま。

## 作業中のネットワーク設定
　SSHでログインしながら以降の操作をやるために、VirutalboxでNetwowkアダプター１の設定を __"NAT"__ から __"ブリッジ"__ に変更する。これをやらないと、ゲストOSから外側のネットワークへはアクセスすることはできても、逆はできない。つまり、ホストOSからゲストOSにSSHでログインすることができないので作業がやりずらくなる。

## ゲストOSの設定

### パッケージの追加
アップデートしながら使っていこうとする場合、dkmsはあったほうがいい。

```
yum -y update
yum install epel-release
yum install dkms
```


### vagrantユーザーを追加
ゲストOSにて以下を実行。
インストール時にユーザー"vagrant"を追加していない場合は追加する。

```
groupadd -g 1000 vagrant
useradd -u 1000 -g vagrant vagrant
```

また、ユーザーのパスワードが必要な場合はつぎのようにする。
__echo "PASSWORD" | passwd user_name --stdin__

```
echo "vagrant" |passwd vagrant --stdin
```

### sudoers の設定

```
sed -i -e s/^Defaults\ \ \ \ requiretty/#Defaults\ \ \ \ requiretty/g /etc/sudoers
test -f /etc/sudoers.d/vagrant || echo "%vagrant ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/vagrant
```

### ユーザー vagrant のSSH公開鍵を追加する

```
mkdir -m 700 /home/vagrant/.ssh
mkdir -p /vagrant
chown vagrant:vagrant /home/vagrant/.ssh

echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key" > /home/vagrant/.ssh/authorized_keys

chmod 600 /home/vagrant/.ssh/authorized_keys
chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys
```



## Virtualbox additonal CD のインストール
 ツールをインストールしないと、"varant up"したときにホストOSとの共有ディレクトリ/vagrantをマウントできない。また、ゲストOS起動時にエラーとなってしまう。


まず、ツールのCDイメージをマウントする。
[Dvice] -> [Instert Guest Additions CD images]


 Additional toolsをインストールするためにはツールを再構築しなければいけない。
最小インストールの場合は、つぎのように追加でパッケージをインストールしておく。

```
yum -y install openssh-clients bzip2 kernel-devel gcc
```


### AdditionalToolのインストール

```
mount -o loop /dev/sr0 /mnt
/mnt/VBoxLinuxAdditions.run --nox11
```

この時点で、光学ドライブは有効なままになっているが、今後使う予定がなければ無効にする。

## MACアドレスの消去
CentOS7では必要ないはず。
好みがあれば修正する。

```
cat > /etc/sysconfig/network-scripts/ifcfg-enp0s3 << 'EOF'
・・・
(略)
・・・
EOF
```

## カスタマイズ

パッケージの追加や必要な設定を行う。

## ログの消去
配布するBoxサイズを少しでも小さくするために、ログを消去する。
リモートからはできないので、Virtualboxのコンソールから操作。

```
init 1
find /var/log -type f -exec rm -f {} \;
rm -f /home/vagrant/.bash_history
rm -f /root/.bash_history
history -c
shutdown -h now
```

## boxアーカイブの作成

ここでは、centos7.boxという名でアーカイブを作成する。

```
cd ${HOME}/VirtualBox\ VMs/
vagrant package --base CentOS7 --output centos7.box
```

### テスト
#### Boxの登録

```
vagrant box add test-centos7 centos7.box
```

#### 作成したカスタムBoxのテスト

```
mkdir test-dir && cd test-dir
vagrant init test-centos7
vagrant up --provider=virtualbox
vagrant ssh
```

エラーがなければ終わり。
必要な確認はそれぞれだけど、Additional Toolが正常インストールされていれば、/vagrant がマウントされているはず。

```
df /vagrant
```

## Boxの公開&&アップロード
 パブリックなWebサーバへアップロードすれば、hashicorpで公開できる。

### BoxをWebsサーバーへアップロード

認証なしで参照可能なWebサーバーへファイルをアップロード。

```
scp centos-7_0.0.0.box <yourserver>:/home/saitou/public/.
```

## テスト その2

しつこいけど、もう一回テスト。
もし、Vagrantを使っているPCが２台以上あるなら、ファイルをアップロードしたあとでもう一度テストしておくのがいい。

```
vagrant box add --name yourid/centos7 http://<yourserver>/~saitou/centos-7_0.0.0.box
mkdir testdir && cd testdir
vagrant init yourid/centos7
vagrant up
vagrant ssh
```

## Hashicorp への公開

https://hashicorp.com/

デザインがマメに変わるので、Web検索で出てくるスクリーンショットは最新ではない可能性が高い。”場所”で覚えず、何を選択していけばいいのかをよく覚えておくほうがいいでしょう。(次の手順は、2016年１月12日に確認した方法になる。)

### ログイン
アカウントがない場合 ___"Sign up"___
アカウントがある場合 ___"Sign in"___

### Boxのアップロード

どの項目を選択するか毎回迷う。
___"Create VagrantBox with the WebUI"___ を選択。

### Boxの名前をつける
___"name"___ へ任意の名前を入力し、 ___"Create box"___を選択。

### Description

いづれも後から変更することができる。

___"New Box Version"___ : 習慣として、 ___0.0.0___ のようにつける。
___"Description"___ : わかりやすい内容を入力。

入力後、 ___"Create Version"___ を選択。
この段階ではまだ公開にはなっていない。

### Providerの設定
___Provider___ は、仮想マシンを指している。ここでは、 ___virtualbox___ を設定する。
また、URLにはBoxをアップロードしたWebサーバへのアドレスを入力する。

```
http://<yourserver>/~saitou/vagrant/box/virtualbox/centos-7_0.0.0.box
```

___"Create provider"___ を選択。
この段階でもまだ公開にはなっていない。

### 公開

この時点では、次のメッセージが表示されているかと思う。

```
This version was created 12 minutes ago. This version is unreleased. 
```
___unreleased___　がリンクになっているのでクリック。または、 ___"Edit"___ を選択。
次画面で ___"Released version"___ を選択。
公開にステータスが変わったはず。

## テスト その3
しついけど、またテスト。
確認を兼ねている。

```
vagrant box add yourid/centos7
mkdir testdir && cd testdir
vagrant init yourid/centos7
vagrant up
```
見慣れた実行形式になっているでしょう！
ここまででエラー等なければ終わり。

## まとめ

　今回、テストを何回もやっているのだけれど、手戻りしないために必要なことなので面倒がらずにやっていただきたい。


## Appendix

https://hashicorp.com/