vagrantを使ってローカルにubuntu22.04環境を用意する

# はじめに
macにおいて仮想マシンを構築するためのソフトウェアといえば[VirtualBox](https://www.virtualbox.org/)が著名ですが、いまのところApple M1チップ以降のCPUではVirtualBoxは使用できません。（β版は存在するそう。）

そこで別のソフトウェアを使用して仮想環境を構築する方法について
- Vagrantを用いて構築する
- ホストコンピュータが属するネットワーク上の別の物理マシンとして仮想マシンを認識させたい

上記２点の観点から[parallels](https://www.parallels.com/jp/)を使用することにします。
（他に[VMware Fusion](https://www.vmware.com/jp/products/fusion.html)なども著名です。）

# 動作環境と前提事項
本記事は以下のホスト環境で動作確認しています。
```
OS: macOS Venture 13.3.1
Chip: Apple M1 Pro
```

### 前提事項

前提として、以下２点導入済みとします。
- [Homebrew](https://brew.sh/index_ja)（macOS用パッケージ管理ソフトウェア）
- [Parallels Desktop for Mac](https://www.parallels.com/jp/)（仮想マシン構築用ソフトウェア: 有料版）

# vagrantインストール
まずは[公式ドキュメント](https://developer.hashicorp.com/vagrant/downloads)に沿って`vagrant`のインストールを行います。

```shell
brew install hashicorp/tap/hashicorp-vagrant
```

バージョン確認します。
```shell
vagrant -v
```
> Vagrant 2.3.6

# vagrant-parallelsのインストール

`vagrant`を使用して`Parallels`上に仮想マシンを構築するには、そのためのドライバに相当する`vagrant-parallels`が必要になります。

Githubの`README`を参照してインストールします。
```shell
vagrant plugin install vagrant-parallels
```

# Vagrantfileの初期化

任意のプロジェクトディレクトリに移動して作業を行います。

作成する仮想マシンの定義は`Vagrantfile`というファイルをプロジェクト毎に一つ作成します。Vagrant起動時にこのファイルを読み込むことで定義した環境を作成することができます。

ではまず、`Vagrantfile`を初期化します。
（`Vagrantfile`は手動で作成することもできますが、`vagrant init`を使用すると各パラメータが記載された雛形を出力することができるので、便利です。）
```shell
vagrant init
```

`Vagrantfile`が作成されていることを確認します。

```shell
ls
```

# Vagrantfileの編集

`Vagrant`はベースとなるイメージから仮想マシンを構築します。そのベースイメージ（ボックス）を`config.vm.box`パラメータに指定します。
（ボックスは仮想マシンのOSなどが含まれるのでサイズが大きいです。）

使用したいboxファイルは[こちら](https://app.vagrantup.com/boxes/search)のサイトから検索することができます。（[docker hub](https://hub.docker.com/)に似たようなサイトです。）

ここでは、ホストマシンがM1チップであるのとUbuntu22.04の仮想マシンを構築したいので「arm ubuntu」で検索し、以下のボックスを指定します。

```ruby
config.vm.box = "bento/ubuntu-22.04-arm64"
```

また、冒頭でも記載したように今回は「**ホストコンピュータが属するネットワーク上の別の物理マシンとして仮想マシンを認識させたい**」ので以下の`config.vm.network`パラメータもアクティブにしておきます。

```ruby
config.vm.network "public_network"
```

`config.vm.network`パラメータで設定できる値については[ドキュメント](https://developer.hashicorp.com/vagrant/docs/networking)を参照してください。

**デフォルトのボックスは設計上、セキュリティリスクが存在します。仮想マシン上のゲストOSに対する資格情報を使用することで同一ネットワーク上の誰でもアクセスできる可能性があることにご注意ください。**

なので特段、目的がなければ他の設定値（`private_network`など）が無難かと思います。

# 仮想マシン起動

準備ができたので仮想マシンを起動します。（初回は時間かかります。）
```shell
vagrant up
```

# 仮想マシン状態確認

仮想マシンの状態を確認するには以下のコマンドが使用できます。

```shell
vagrant status
```

# 仮想マシンへssh接続

起動した仮想マシンへの接続には以下のコマンドを使用します。
（意味的には、通常の`ssh user@host`と同じです。）
```
vagrant ssh
```

プロンプトの`hostname`、`username`が変化すれば接続完了です！
ちなみに仮想マシンの接続を抜けるには`exit`を実行すれば抜けられます。

# おまけ

## その他よく使うvagrantコマンド

### halt

実行中の仮想マシンをシャットダウンします。
```shell
vagrant halt
```

### suspend

このコマンドは完全なシャットダウンではなく仮想マシンを一時停止します。

一時停止は、後で再開した際にその時点から直ちに実行を開始します。（再ブートではなく一時停止からの再開です。）

```shell
vagrant suspend
```

### resume

以前に（`vagrant suspend`コマンドで）一時停止された仮想マシンを再開します。
```shell
vagrant resume
```

### destroy

このコマンドは、実行中の仮想マシンを停止し、仮想マシン作成過程で生成されたすべてのリソースを削除します。これによって仮想マシン作成前と同様に、ホストコンピュータはクリーンな状態になります。
```shell
vagrant destroy
```

# 参考ドキュメント
- [Homebrew](https://brew.sh/index_ja)
- [Parallels Desktop for Mac](https://www.parallels.com/jp/)
- [Vagrant](https://www.vagrantup.com/)
- [Vagrant Parallels Provider](https://parallels.github.io/vagrant-parallels/docs/)
- [Vagrant Cloud](https://app.vagrantup.com/boxes/search)