技術メモ

技術メモ

ラフなメモ

VagrantのproviderにHyper-Vを使う

やりたいこと

いままでVagrantOracle Virtual Box上で起動させていたが、DockerをWindows上で動かしたい。併用はできないので、VagrantHyper-Vで起動させるように変更します。

TL;DR

VirtualBoxはそのまま残しておいて、Boxのイメージと vagrant up する際に --provider=hyperv を付与する、または環境変数VAGRANT_DEFAULT_PROVIDER=hyperv を追加するとよいです。

試していたこと

Oracle VirtualBox のアンインストール

アプリと機能からOracle VirtualBoxをアンインストールします。

vagrant box list で確認するとboxにゴミが残っていたので不要なboxを削除しようとしますが、アンインストールしてしまったのでcliから削除できませんでした。

D:\Vagrant\precise64>vagrant box list
centos/7           (virtualbox, 1901.01)
D:\Vagrant\precise64>vagrant box remove centos/7
The provider 'virtualbox' that was requested to back the machine
'master' is reporting that it isn't usable on this system. The
reason is shown below:

Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed.
Vagrant uses the `VBoxManage` binary that ships with VirtualBox, and requires
this to be available on the PATH. If VirtualBox is installed, please find the
`VBoxManage` binary and add it to the PATH environmental variable.

ということでファイルシステム上のファイルを直接削除しました。

Windowsの場合は C:\Users\${MyUser}\.vagrant.d\boxes にあります。${MyUser} は各々異なります。

ファイルシステムのファイルを削除した後、vagrant box list で確認すると以下のように削除されたことが分かります。

D:\Vagrant\precise64>vagrant box list
There are no installed boxes! Use `vagrant box add` to add some.

Boxのダウンロード

D:\Vagrant\precise64>vagrant box add hashicorp/precise64
==> box: Loading metadata for box 'hashicorp/precise64'
    box: URL: https://vagrantcloud.com/hashicorp/precise64
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) virtualbox
3) vmware_fusion

Enter your choice: 1
==> box: Adding box 'hashicorp/precise64' (v1.1.0) for provider: hyperv
    box: Downloading: https://vagrantcloud.com/hashicorp/boxes/precise64/versions/1.1.0/providers/hyperv.box
    box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws.com
    box: Progress: 100% (Rate: 11.5M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'hashicorp/precise64' (v1.1.0) for 'hyperv'!

D:\Vagrant\precise64>vagrant box list
hashicorp/precise64 (hyperv, 1.1.0)

Vagrantfileの修正

以下のように Vagrantfile を修正します。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.box_version = "1.1.0"
end

起動しない...

D:\Vagrant\precise64>vagrant up --provider=hyperv
Bringing machine 'default' up with 'hyperv' provider...
Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed.
Vagrant uses the `VBoxManage` binary that ships with VirtualBox, and requires
this to be available on the PATH. If VirtualBox is installed, please find the
`VBoxManage` binary and add it to the PATH environmental variable.

デバッグログを出力して調査

VAGRANT_LOG=debug vagrant upデバッグログを出力させるようにしました。ログを確認するとエラーになっている原因が推測できました。DEBUG base: Windows, checking for VBoxManage on PATH first とあるようにWinodwsだとデフォルトで VBoxManage のパスをチェックするようです。このパスが存在しないことが原因でエラーになっていると考えられます。
よって、Oracle VirtualBox を再度インストールすることで vagrant up --provider=hyperv で起動させることができました。

D:\Vagrant\precise64>VAGRANT_LOG=debug vagrant up

 INFO interface: info: Bringing machine 'default' up with 'hyperv' provider...
Bringing machine 'default' up with 'hyperv' provider...
 INFO batch_action: Enabling parallelization by default.
 INFO batch_action: Disabling parallelization because provider doesn't support it: hyperv
 INFO batch_action: Batch action will parallelize: false
 INFO batch_action: Starting action: #<Vagrant::Machine:0x0000000005238980> up {:destroy_on_error=>true, :install_provider=>false, :parallel=>true, :provision_ignore_sentinel=>false, :provision_types=>nil}
 INFO machine: Calling action: up on provider Hyper-V (new)
DEBUG environment: Attempting to acquire process-lock: machine-action-65facac4d5faa720c79dfc299d95a150
DEBUG environment: Attempting to acquire process-lock: dotlock
 INFO environment: Acquired process lock: dotlock
 INFO environment: Released process lock: dotlock
 INFO environment: Acquired process lock: machine-action-65facac4d5faa720c79dfc299d95a150
 INFO interface: Machine: action ["up", "start", {:target=>:default}]
 INFO runner: Preparing hooks for middleware sequence...
DEBUG base: Windows, checking for VBoxManage on PATH first
 INFO base: VBoxManage path: VBoxManage
 INFO environment: Released process lock: machine-action-65facac4d5faa720c79dfc299d95a150
 INFO environment: Running hook: environment_unload
 INFO runner: Preparing hooks for middleware sequence...
 INFO runner: 1 hooks defined.
 INFO runner: Running action: environment_unload #<Vagrant::Action::Builder:0x00000000052ec8e0>
ERROR vagrant: Vagrant experienced an error! Details:
ERROR vagrant: #<Vagrant::Errors::VirtualBoxNotDetected: Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed.
Vagrant uses the `VBoxManage` binary that ships with VirtualBox, and requires
this to be available on the PATH. If VirtualBox is installed, please find the
`VBoxManage` binary and add it to the PATH environmental variable.>
ERROR vagrant: Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed.
Vagrant uses the `VBoxManage` binary that ships with VirtualBox, and requires
this to be available on the PATH. If VirtualBox is installed, please find the
`VBoxManage` binary and add it to the PATH environmental variable.
ERROR vagrant: C:/HashiCorp/Vagrant/embedded/gems/2.2.4/gems/vagrant-2.2.4/plugins/providers/virtualbox/driver/meta.rb:51:in `rescue in block in initialize'

起動させる

D:\Vagrant\centos7>vagrant up
Bringing machine 'server1' up with 'hyperv' provider...
==> server1: Verifying Hyper-V is enabled...
==> server1: Verifying Hyper-V is accessible...
    server1: Configuring the VM...
==> server1: Starting the machine...
==> server1: Waiting for the machine to report its IP address...
    server1: Timeout: 120 seconds
    server1: IP: 192.168.20.84
==> server1: Waiting for machine to boot. This may take a few minutes...
    server1: SSH address: 192.168.20.84:22
    server1: SSH username: vagrant
    server1: SSH auth method: private key
==> server1: Machine booted and ready!
==> server1: Setting hostname...
==> server1: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> server1: flag to force provisioning. Provisioners marked to run always will still run.
D:\Vagrant\centos7>vagrant ssh
Last login: Sun Apr  7 08:48:58 2019 from 192.168.20.81
[vagrant@server1 ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

まとめ

Hyper-VVagrantを扱う場合でもVirtualBoxのインストールは必要であることが分かりました。Hyper-Vを使う場合でもVirtualBoxが必要であることは盲点でした。。。