Amazon Linux 2 の Vagrant Base Box を作成する


この記事の続きです
[Amazon Linux 2 を VirtualBox でオンプレミスの開発環境に使用する](https://qiita.com/aibax/items/88e2ab6794cfc89ff997)


# 概要

- オンプレミスでも使える Amazon Linux 2 が発表
- VirtualBox で使えるなら Vagrant で使いたい！
- Amazon Linux 2 の Vagrant Base Box を作りました


# VirtualBox で Base Box にする仮想マシンを作成する

この記事の内容を前提としています
[Amazon Linux 2 を VirtualBox でオンプレミスの開発環境に使用する](https://qiita.com/aibax/items/88e2ab6794cfc89ff997)


## Base Box を作成するために必要な設定

[Creating a Base Box - Vagrant by HashiCorp](https://www.vagrantup.com/docs/boxes/base.html)

### 設定内容

- ユーザー vagrant を作成する
- root のパスワードを 'vagrant' にする
- パスワード不要で sudo できるようにする

cloud-init でこの設定を行っていきます



## cloud-init のファイルを格納したISOイメージを作成

### meta-data ファイルを作成

```yaml:meta-data
local-hostname: localhost.localdomain
```

ホスト名は Vagrant によって起動時に変更されます

### user-data ファイルを作成

```yaml:user-data
#cloud-config
users:
  - default 
  - name: vagrant
    groups: wheel
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    plain_text_passwd: vagrant
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key 
    lock_passwd: false

chpasswd:
  list: |
    root:vagrant
  expire: False


# VirtualBox Guest Additions のビルドに必要なパッケージをインストール
packages:
  - kernel-devel
  - kernel-headers
  - gcc
  - make
  - perl
  - bzip2
  - mod_ssl


runcmd:

  # cloud-init による起動時の root のパスワードリセット処理を無効化  
  - sed -i 's/.*root:RANDOM/#&/g' /etc/cloud/cloud.cfg.d/99_onprem.cfg
```

SSHの認証に Vagrant の [Insecure Keypair](https://github.com/hashicorp/vagrant/tree/master/keys) の公開鍵を指定しています

cloud-init のファイルを格納したISOイメージを作成する方法は [前回の記事](https://qiita.com/aibax/items/88e2ab6794cfc89ff997) を参考にして下さい。


## Base Box の設定

### 仮想マシンの起動

作成した cloud-init のISOイメージをマウントして Amazon Linux 2 の仮想マシンを起動します

### カーネルの更新

カーネルを更新します。
カーネルに更新があった場合、この後の VirtualBox Guest Additions のインストールでヘッダと実行中のカーネルのバージョンの不一致によりビルドに失敗するので、更新後に再起動を行います。

```
$ sudo yum -y update kernel
$ sudo reboot
```

### VirtualBox Guest Additions のインストール

1. VirtualBox の設定から cloud-init のISOイメージを取り外します

2. メニューから VirtualBox Guest Additions のCDイメージを挿入します

3. 仮想マシンにログインします

4. root で以下のコマンドを実行し、VirtualBox Guest Additions をインストールします

```
# mount -r -t iso9660 /dev/cdrom /media
# /media/VBoxLinuxAdditions.run
# umount /media
# systemctl enable vboxadd.service
```


### 後処理

この作業は、Base Box にする仮想マシンの初期設定で実行したコマンドの履歴の削除とキャッシュの初期化によって Box のファイルサイズを抑えるために行っています。
コマンドの実行履歴が残っても問題ない場合はこの作業は省略しても構いません。


#### Bash のコマンド履歴を削除

```
# export HISTSIZE=0
```

#### yum のキャッシュを削除

```
# yum clean all
# rm -rf /var/cache/yum
```

#### /var/log ディレクトリに出力されたのログを削除

```
# find /var/log -type f -exec cp -f /dev/null {} \;
```

#### 仮想ハードディスクの領域を最適化

```
# dd if=/dev/zero of=/ZERO bs=1M
# rm -f /ZERO
```

#### シャットダウン

```
# shutdown -h now
```


# 仮想マシンから Base Box を作成

VirtualBox の仮想マシンを Base Box のファイルに書き出します

```
$ vagrant package --base <仮想マシンの名前> --output amazonlinux2.box
```

出力された amazonlinux2.box が Base Box のファイルです
box を共有する場合はこのファイルを配布します


# Base Box を使用する

## Vagrant へ box を登録

作成した Base Box を Vagrant に追加します

```
$ vagrant box add --name amazonlinux2 amazonlinux2.box
```


## box の起動

```
$ vagrant init amazonlinux2
$ vagrant up
```


# 参考

- [Creating a Base Box - Vagrant by HashiCorp](https://www.vagrantup.com/docs/boxes/base.html)