KUSANAGI for Vagrantの構築で詰まったところ

## 概要
元サーバサイドエンジニアですが、地方で活動するようになって、成果の説明がしやすいフロント側の必要性を感じてWordPressの勉強を始めようと思い立ちました。
そして『[ビジネスサイトを作って学ぶ WordPressの教科書 Ver.5.x 対応版](https://www.amazon.co.jp/dp/4802612079/ref=cm_sw_em_r_mt_dp_ZCCJK0YFJ0MK03J6ERFB?_encoding=UTF8&psc=1)』
の環境構築編でいくつか詰まったので、その詰まりポイントおよびその解決を残しておきます。
具体的には、[Vagrant](https://www.vagrantup.com/)を使って[VirtualBox](https://www.virtualbox.org/)上で[Kusanagi](https://kusanagi.tokyo/about/)というプライムストラテジー社提供のWordPress向けの仮想環境を構築しました。
Kusanagiを使うことで、WordPressに必要なデータベース、Webサーバ、PHP、等のミドルウェア環境の構築が省略できるみたいです。便利ですね。
で、実際に書籍の手順通りに進めていったところ、バージョンの違いによりいくつか躓きました。よくあることです。

## 記事構成
ざっくり、３部構成になってます。
1. 実行環境
1. 環境構築手順
1. エラーと対処

## 実行環境
||Version|
|:-|:-|
|Host OS|Ubuntu 20.04.4 LTS|
|VirtualBox|6.1.32|
|Vagrant|2.2.19|
|Kusanagi|8.4.2-2|

## 環境構築手順
### 1. VirtualBoxのインストール
```
# キーを追加
$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
# リポジトリに追加
$ sudo apt-add-repository "deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian $(lsb_release -cs) contrib"
# リポジトリ最新化とインストール
$ sudo apt-get update && sudo apt-get install virtualbox-6.1
```
参考：[Virtualbox download for linux](https://www.virtualbox.org/wiki/Linux_Downloads)

### 2. Vagrantのインストール
```
# キーを追加
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
# リポジトリに追加
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
# リポジトリ最新化とインストール
sudo apt-get update && sudo apt-get install vagrant
```
参考：[Download Vagrant](https://www.vagrantup.com/downloads)

バージョン確認
```
$ vagrant --version
Vagrant 2.2.19
```

### 3. Kusanagi環境のインストール
作業ディレクトリ作成
```
$ cd 【任意のディレクトリ】
$ mkdir pacificmall && cd pacificmall
```

``Vagrantfile``の作成
```
$ vagrant init prime-strategy/kusanagi-wp5 --box-version 1.0
$ ls
Vagrantfile
```

``Vagrantfile``の編集
```Vagrantfile
  :
  # 仮想マシンにプライベートIPアドレスを割り振るため
  # ↓のコメントアウトの削除
  config.vm.network "private_network", ip: "192.168.33.10"
  :
```

仮想マシンの起動
```
$ vagrant up
```

ここでいくつか詰まったので、色々と対処しました。
エラーとその対処は次章に記載しておきます。
以降、エラー対処後、プライベートIPを``192.168.56.10``にした前提で進みます。


### 4. ホスト名の設定
ホストマシンの``/etc/hosts``に追記
```
:
192.168.56.10	pacificmall.local
:
```

### 5. ``WordPress``にアクセス
[https://pacificmall.local](https://pacificmall.local)にアクセス
![wordpress_index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2295954/3d8178b0-bb3b-b538-39bb-84de4eff7236.png)
完了。

---

## ``vagrant up``で出たエラーと対処
### エラー１：　プライベートIPアドレスの設定エラー
```
The IP address configured for the host-only network is not within the
allowed ranges. Please update the address used to be within the allowed
ranges and run the command again.

  Address: 192.168.33.10
  Ranges: 192.168.56.0/21

Valid ranges can be modified in the /etc/vbox/networks.conf file. For
more information including valid format see:

  https://www.virtualbox.org/manual/ch06.html#network_hostonly
```
割り当てようとしたプライベートIPアドレスがVirtualBoxのホストオンリーネットワークで許可されたIPアドレスの範囲外だそうです。
調べてみると``VirtualBox 6.1.26``以降のバージョンで起こるようです。
エラーメッセージ通り、VirtualBoxの許可範囲を変えてもいいのですが、そもそも``192.168.33.10``にこだわる必要もない気がしたので``Vagrantfile``のほうを修正しました。
```Vagrantfile
  :
  config.vm.network "private_network", ip: "192.168.56.10"
  :
```
その上で、再度構築し直しました。
```
$ vagrant destroy
$ vagrant up
```

### エラー２：　なぜかタイムアウトする問題
```
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.
```
よく分かりませんが、タイムアウトしてるのでタイムアウト時間を変更してくれとのこと。
いや、そうそうデフォルトでタイムアウトってしないと思うので、原因はタイムアウトじゃない気がします。
こりゃわからんとググってみると、[Stackoverflow](https://stackoverflow.com/questions/23690124/vagrant-up-timeout)で同じような悩みの人が。
この中で要確認と思った点は２箇所
- BIOSの設定でVMを許可していない
- VirtualBox用にGUIモードを許可していない

とりあえず、BIOSの設定は確認して問題なしだったので、``Vagrantfile``を以下のように修正
```
  :
  # コメントアウトを解除
  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  end
  :
```
これによりVirtualBoxは立ち上がり、VirtualBox上でのログインはできました。
が、新たに問題が起きましたので、まだまだ続きます。


### エラー３：　ホスト端末からSSH接続できない問題
```
$ ssh vagrant@pacificmall.local
ssh: connect to host 192.168.56.10 port 22: No route to host
```
``Vagrantfile``で指定したIPアドレスでアクセスができません。
VirtualBox上ではログインできるので、VirtualBox内でIPアドレスを調べます。
```
[kusanagi]$ ip addr show
:
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> ..
    inet 192.168.33.10/24 ..
:
```
なぜか[^1]IPアドレスの設定ができていませんでした。
[^1]: 実際には、エラー４のせいで``vagrant up``が途中で転けていたからでした。

とりあえず、IPアドレスを変更したいので``/etc/sysconfig/network-scripts/ifcfg-enp0s8``を編集。
```
:
IPADDR=192.168.56.10
:
```
ネットワークを再起動。
```
[kusanagi]$ su root service network restart
パスワード:
Restarting network (via systemctl):                        [  OK  ]
[kusanagi]$ ip addr show
:
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> ..
    inet 192.168.56.10/24 ..
:
```
OK

### エラー４

上記３つを行っても、``vagrant up``の途中でエラー２と同様のエラーになるため、Timeout問題は根本的には解決してません。
ちなみに、エラーが出るのはいつも以下を実行中なので、ssh接続時に何か起きているようです。
```
    default: this with a newly generated keypair for better security.
```
いろいろ調べると、SSHの仕様で、キーペアのパーミッションが適切に設定されていないとエラーになるっぽいです。
というわけで、ディレクトリ(700)と公開鍵ファイル(600)のパーミッションを修正。
```
# 仮想マシンに接続
$ vagrant ssh

# 仮想マシン上でパーミッション変更
[vagrant]$ chmod 0700 ~/.ssh/
[vagrant]$ chmod 0600 ~/.ssh/authorized_keys
```

このあと、仮想マシンを一度シャットダウンして再読み込みしたらうまく行きました。
```
$ vagrant reload
```

WordPressにたどり着くまでになかなか手間取りました。
ミドルウェアからインストールしたほうが早いかもしれないですが、仮想化技術に触れておくのも大切ですね。

同じ問題に出会う人が何人いるかは分かりませんし、エラー→解決の組み合わせだけ載せるのでも良かったのですが、
エラー→（エラーメッセージ確認→原因仮定→修正→確認）→解決のプロセスの（）の中が意外と僕のような凡庸なエンジニアや駆け出しの方々にとって重要かなと思って、記事にしてみました。
同じようなところで詰まった誰かの解決につながれば幸いです。