WSL2だけでいいの？あえてVagrantを使う理由

WSL2は、Windows上で手軽にLinux環境を構築できるシステムです。\
開発環境やサーバー環境、コンテナ環境などに活用でき、私も頻繁に利用しています。\
それでも構成によっては、Vagrant（ベイグラント）の方が便利な場合があるので、Vagrantだとこんなことができます、という例をいくつかご紹介します。

## 仮想ネットワークの構築が柔軟にできる
Vagrantは、VirtualBox, Hyper-V,VMware などのハイパーバイザのフロントエンドとして機能する仮想マシン管理ツールです。\
ハイパーバイザに備わっている仮想ネットワーク機能が利用できます。

### ホストPCと同じセグメントのIPを割当て

仮想マシンはホストマシンと同じネットワークに直接接続されるようになります。(ブリッジ接続)\
サービスを公開する場合のポートフォワード等の設定は不要です。\
<span style="font-size: 70%">※ IPアドレスの使用は、利用するネットワークルールおよびネットワーク管理者に確認のうえ、ご利用ください</span>
![bridge.drawio.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600759/79275fdf-0696-54a4-32b0-192dff3084d7.jpeg)





```yml:Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"  # Ubuntu 20.04 LTS
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.cpus = 1
  end

  # 1台目の仮想マシン
  config.vm.define "vm1" do |vm1|
    vm1.vm.hostname = "vm1"
    vm1.vm.network "public_network", ip: "192.168.1.10"
  end

  # 2台目の仮想マシン
  config.vm.define "vm2" do |vm2|
    vm2.vm.hostname = "vm2"
    vm2.vm.network "public_network", ip: "192.168.1.11"
  end
end
```
### 仮想マシンに複数のIPを割り当て

仮想マシンに複数のIPアドレスを割り当てることで、待ち受けポート番号が同じでも複数のサービスを公開することができます。
![bridge2.drawio.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600759/ce15e210-a1aa-2f9b-680b-590e4059204c.jpeg)



```yml:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"  # Ubuntu 20.04 LTS
  
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = 2
  end

  config.vm.define "multi_ip_vm" do |node|
    node.vm.hostname = "multi-ip-vm"
    
    # 1つ目のブリッジネットワークインターフェース
    node.vm.network "public_network", ip: "192.168.1.10"    
    # 2つ目のブリッジネットワークインターフェース
    node.vm.network "public_network", ip: "192.168.1.11"
    # 3つ目のブリッジネットワークインターフェース
    node.vm.network "public_network", ip: "192.168.1.12"
  end
end
```

仮想マシン上のdockerコンテナに、IP指定してポートマッピングする例

```yml:docker-compose.yml
version: '3'

services:
  nginx1:
    image: nginx
    ports:
      - "192.168.1.10:80:80"
  nginx1:
    image: nginx
    ports:
      - "192.168.1.11:80:80"
  nginx1:
    image: nginx
    ports:
      - "192.168.1.12:80:80"
```

## プロビジョニングで環境構築を自動化できる
Vagrantfileにプロビジョニング(事前の環境設定、環境構築)を記載することで、起動時にソフトウエアのインストールや設定ができます。

### ソフトウェアの事前設定
```yml:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"

  # Webサーバー
  config.vm.define "web" do |web|
    web.vm.network "private_network", ip: "192.168.33.10"
    web.vm.hostname = "webserver"
    web.vm.provision "shell", inline: <<-SHELL
      apt-get update
      apt-get install -y nginx
      systemctl enable nginx
      systemctl start nginx
    SHELL
    web.vm.provision "file", source: "./nginx.conf", destination: "/tmp/nginx.conf"
    web.vm.provision "shell", inline: <<-SHELL
      mv /tmp/nginx.conf /etc/nginx/nginx.conf
      systemctl restart nginx
    SHELL
  end
```

### 全ての仮想マシンにカスタムスクリプトの実行

```yml:Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"  # Ubuntu 20.04 LTS
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.cpus = 1
  end

  # 1台目の仮想マシン
  config.vm.define "vm1" do |vm1|
    vm1.vm.hostname = "vm1"
    vm1.vm.network "public_network", ip: "192.168.1.10"
  end

  # 2台目の仮想マシン
  config.vm.define "vm2" do |vm2|
    vm2.vm.hostname = "vm2"
    vm2.vm.network "public_network", ip: "192.168.1.11"
  end

  # Ansibleによるプロビジョニング（すべてのマシンに適用）
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
  end

  # カスタムスクリプトの実行（すべてのマシンに適用）
  config.vm.provision "shell", path: "custom_script.sh"
end
```

## WSL2よりも仮想マシンイメージの種類が豊富


すぐに利用可能な仮想マシンイメージが豊富にあります。\
<https://app.vagrantup.com/boxes/search>\
※HashiCorpは基本的なセキュリティスキャンを行いますが、すべてのboxの内容を完全に検証しているわけではありません。可能な限り公式に維持されているboxesを使用することをお勧めします。また、ゲストOSにWindowsを利用する場合ライセンスに注意ください。

![boxs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600759/2456a42e-efce-3912-9f55-f009f4cbef7a.png)


## おわりに
手短ですがVagrantだとこんなことができます、という例でした。\
最後まで読んで頂きありがとうございました。