VMware FusionでVagrantを扱う

# はじめに

ansibleやserverspecを学習するにあたり、仮想マシン環境が欲しいと思いました。

vagrantのプロバイダはVirtualBoxが主流ですが
元からVMwareFusionがMACに入ってたので、VMware FusionをvagrantのProviderとしました。

## 環境

```shell:環境
Mac OS：10.15.4
vagrant version：2.2.9
vmware fusion pro: 11.5
```

# vagrant環境の作成

## vagrantのインストール

vagrant自体とプラグインをインストールします。

* `vagrant-hosts`はbox同士で名前解決させるプラグイン
* `vagrant-vmware-desktop`はproviderにvmwareを使えるようにするプラグイン

```shell
% brew cask install vagrant
% vagrant plugin install vagrant-hosts
% vagrant plugin install vagrant-vmware-desktop
```
## ライセンスの購入

以下公式サイトからライセンスを購入します。2020年6月現在79ドルです。
購入時に登録したメールアドレス宛に、ライセンスダウンロードリンクがきます。

https://www.vagrantup.com/vmware#buy-now

## ライセンスの適用

ライセンスファイルをダウンロードしたら適用させます。

```shell
% vagrant plugin license vagrant-vmware-desktop ~/Downloads/license.lic
```

## VMwareユーティリティのインストール

以下リンクのVMwareユーティリティをインストールします。

https://www.vagrantup.com/vmware/downloads

これでVMware Fusionをproviderにする準備が出来ました！


# Vagrantfileの作成

適当なディレクトリを作成し、Vagrantfileを作成します。

* ほとんど同じ構成で作りたかったので、`each do`で処理をまとめました
* ホストOS（MAC）で作成したSSH公開鍵を貼り付けてキー認証出来るようにしています。
* `:hosts, :sync_hosts => true`によってbox同士が名前解決出来ます。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  # boxを3台分作成
  (1..3).each do |i|
    config.vm.define "node-#{i}" do |node|
      node.vm.box = "centos/7"
      node.vm.hostname = "node-#{i}"
      node.vm.network "private_network", ip: "192.168.33.1#{i}"
      node.vm.provision :hosts, :sync_hosts => true
      node.vm.provision "shell", inline: <<-SHELL
echo "- Copy Public Key"
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCrh2TAqqNE+BrMttioX3dWwxP9WdUktZmMsVRro1XI/f2u4KTJFQOo6tXB/Zq27LQ7bNn/sWLfXDib40oh3qCDs4UdWovlpg8xFQYZzD4BHYQIPjF0FaBVhLDSmrBBgvMMjgIZbRo8/iZgix/Ea05Yx1X05K528rcfDWk1HrkE043eBTaxELunVlcGIVWYtUoUKeT6N1YJSymSY7vzUZOw7Mj3q2z96cs2RNcwLoagquaKma1Px4srQ60RKO5VyvXhhnrpqmT3mE4fibDLFIAuqezfimMYZlTZFFI/Xwe9q0HrTf15TZAlmOAiIqFIBbVWBZMfnlT3GkI/sRPMAT9QePMA5FnKJ6s1Rrol0S+d/she/01xiZLf84Na0q4R8F2xdGtHbVEJFbO4zAGJ0DHn9RYEghY9NIdN62NiUZnwj7nNbcl0wMrOz4VVMPaPtQB+uPe0VsDffeaPjbz4OmxzOzNIzrJGJ7jLdOlKIskA5EfAwS20b3Htp+BFWWurK38= myname@mymac.local" >> /home/vagrant/.ssh/authorized_keys
SHELL
      node.vm.provider :vmware_desktop do |v|
        v.gui = false
        v.memory = "1024"
        v.cpus = "1"
      end
    end
  end
end
```

Vagrantfileを作成したら、そのディレクトリにいる状態で`vagrant up`します。

```shell
% vagrant up
% vagrant status
Current machine states:
node-1                    running (vmware_desktop)
node-2                    running (vmware_desktop)
node-3                    running (vmware_desktop)
```

boxが起動したら、秘密鍵を使って各boxにSSHが出来ます。

```shell
% ssh -i ~/.ssh/testkey vagrant@192.168.33.11
[vagrant@node-1 ~]$
```

boxから他のboxに名前でpingが出来ました。
`/etc/hosts`に普通に書かれていました。

```shell
[vagrant@node-1 ~]$ ping node-3
PING node-3 (192.168.33.13) 56(84) bytes of data.
64 bytes from node-3 (192.168.33.13): icmp_seq=1 ttl=64 time=0.956 ms
64 bytes from node-3 (192.168.33.13): icmp_seq=2 ttl=64 time=0.740 ms
```


# 参考
* [virtualboxからvmware fusionへ乗り換えしました。
](https://qiita.com/park-jh/items/93d80f32003c91289282)
* [ほぼ同一構成のVM作成方法](https://www.vagrantup.com/docs/vagrantfile/tips#loop-over-vm-definitions)
* [vagrant-hosts プラグインを使ってホスト名を名前解決する](https://blog.amedama.jp/entry/2018/04/29/033342)
* [vagrant-hosts
](https://github.com/oscar-stack/vagrant-hosts)