web-dev-qa-db-ja.com

HyperV-Vagrantを使用した静的IP

私はLaravel Homestead with Vagrantを使用しています。Windowsに統合されているため、Virtual Boxの代わりにHyper-Vを使用するのが理にかなっていると思います。

これが私の問題です。時々、Hyper-v仮想マシンは新しいIPを取得します。通常は172.20.83.Xです。ドメインをテストするためにipsを実行するときに、これは私のhostsファイルをめちゃくちゃにします。そのため、hyper-vサーバーが新しいIPを取得するたびに、新しいIPを再入力する必要があり、すぐに退屈になります。

私は自分のマシンで常に同じになるようにIPを設定できる方法があるかどうか疑問に思っています。

サーバーの仮想スイッチマネージャーをいじってみましたが、インターネットが完全に失われました。

6
Jazerix

バックグラウンド

アスカー、および同様のユースケースを持つ誰もが、ローカル開発の目的でワークステーション(Windows Serverエディションではない)で動作している可能性が高く、Hyper-Vが 変更すべてのホストマシンの再起動時のIPアドレスの割り当て

プロビジョニング後、VMのネットワーク構成内に静的IPアドレスを「手動で」ハードコードする必要があり、面倒で自動化を妨げます。 「使い捨て」開発VMの精神とハンズフリーのプロビジョニングワークフローに合わせて、プロセス全体を自動化する方がはるかに望ましいのではないでしょうか。なぜそうなのでしょう!

Vagrantは(まだ)Hyper-Vマシンに静的IPアドレスを設定できないため、このすべてのフープジャンプが必要です。見る:

概観

つまり、これを機能させるための一連のイベントは次のとおりです。

  1. NATスイッチをHyper-V用に作成します(これは内部でのみ使用できるスイッチであり、その背後で静的IPアドレスを持つ任意の数のVMが座って、Hyper-Vと通信できます。ホスト。このスイッチの背後にあるゲストは、インターネットやLANなど、ホストがアクセスできるすべてのネットワークリソースにアウトバウンドアクセスできます。
  2. リロード前のイベント内でvagrant-reloadプラグインを利用するVagrant Triggerを設定して、特定のVMのネットワークスイッチをオンデマンドで変更します。
  3. vagrant up、ただし初期プロビジョニングではDefault Switch(新しいNATSwitchではなく)を選択します。
  4. プロビジョニングプロセスの最初に、NATSwitchの範囲内にある静的IPをVMのオペレーティングシステム内に構成します(この手順はOS固有です)。
  5. config.vm.provision :reloadを呼び出します。これにより、a)手順2で定義したトリガーが起動され、VMのネットワークスイッチが新しいNATSwitchに変更されます。およびb)vagrant reloadを発行し、VMの再起動後にプロビジョニングプロセスを続行します。
  6. VMが再起動すると、静的IPアドレスがNATSwitchから取得され、無期限に使用されます。

1.作成NATスイッチ

この手順は確かに1回、手動で行うことができますが、プロビジョニング中にVagrantfileから呼び出すことができるスクリプトにコマンドをベイクする方がより強力です。このようなスクリプトは次のようになります。

./scripts/create-nat-hyperv-switch.ps1

# See: https://www.petri.com/using-nat-virtual-switch-hyper-v

If ("NATSwitch" -in (Get-VMSwitch | Select-Object -ExpandProperty Name) -eq $FALSE) {
    'Creating Internal-only switch named "NATSwitch" on Windows Hyper-V Host...'

    New-VMSwitch -SwitchName "NATSwitch" -SwitchType Internal

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceAlias "vEthernet (NATSwitch)"

    New-NetNAT -Name "NATNetwork" -InternalIPInterfaceAddressPrefix 192.168.0.0/24
}
else {
    '"NATSwitch" for static IP configuration already exists; skipping'
}

If ("192.168.0.1" -in (Get-NetIPAddress | Select-Object -ExpandProperty IPAddress) -eq $FALSE) {
    'Registering new IP address 192.168.0.1 on Windows Hyper-V Host...'

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceAlias "vEthernet (NATSwitch)"
}
else {
    '"192.168.0.1" for static IP configuration already registered; skipping'
}

If ("192.168.0.0/24" -in (Get-NetNAT | Select-Object -ExpandProperty InternalIPInterfaceAddressPrefix) -eq $FALSE) {
    'Registering new NAT adapter for 192.168.0.0/24 on Windows Hyper-V Host...'

    New-NetNAT -Name "NATNetwork" -InternalIPInterfaceAddressPrefix 192.168.0.0/24
}
else {
    '"192.168.0.0/24" for static IP configuration already registered; skipping'
}

次に、適切なトリガーをVagrantfile configセクションの先頭に追加します。これにより、vagrant upで構成が常に正しいことが保証されます。

config.trigger.before :up do |trigger|
    trigger.info = "Creating 'NATSwitch' Hyper-V switch if it does not exist..."

    trigger.run = {privileged: "true", powershell_elevated_interactive: "true", path: "./scripts/create-nat-hyperv-switch.ps1"}
end

2. Vagrant Reload Triggerを設定します

プロビジョニングの最中にVM)を再起動(リロード)するには、静的IPアドレスに切り替えるために https://github.com/aidanns/vagrant- reload プラグインなので、最初にインストールします。

vagrant plugin install vagrant-reload

トリガーが呼び出すスクリプトは非常に単純です。

./scripts/set-hyperv-switch.ps1

# See: https://www.thomasmaurer.ch/2016/01/change-hyper-v-vm-switch-of-virtual-machines-using-powershell/

Get-VM "Homestead" | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName "NATSwitch"

次に、適切なトリガーをVagrantfile configセクションに追加します(つまり、前の手順で追加したトリガーのすぐ下)。

config.trigger.before :reload do |trigger|
    trigger.info = "Setting Hyper-V switch to 'NATSwitch' to allow for static IP..."

    trigger.run = {privileged: "true", powershell_elevated_interactive: "true", path: "./scripts/set-hyperv-switch.ps1"}
end

3.ゲストVM内で静的IPを構成する

静的IPの構成はOS固有のタスクであるため、この手順は、特定のゲストOSに合わせて調整する必要があります。 2つの例を次に示します。

[〜#〜]注[〜#〜]:企業ネットワーク上にある場合、Googleのように会社のDNSサーバーを使用してください(これらの例)に到達できない場合があります。

Ubuntu 18.04 LTSの例

Ubuntu 18.04 LTSでは、これはうまく機能します:

./scripts/configure-static-ip.sh

#!/bin/sh

echo 'Setting static IP address for Hyper-V...'

cat << EOF > /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.0.2/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]
EOF

# Be sure NOT to execute "netplan apply" here, so the changes take effect on
# reboot instead of immediately, which would disconnect the provisioner.

RedHat、CentOS、およびOracle Linuxの例

./scripts/configure-static-ip.sh

#!/bin/sh

echo 'Setting static IP address for Hyper-V...'

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
PREFIX=24
IPADDR=192.168.0.2
GATEWAY=192.168.0.1
DNS1=8.8.8.8
EOF

# Be sure NOT to execute "systemctl restart network" here, so the changes take
# effect on reboot instead of immediately, which would disconnect the provisioner.

上記のスクリプトを配置したら、先ほど追加したトリガー定義のすぐ下に次のようなものを追加します。

config.vm.provision "Shell", path: "./scripts/configure-static-ip.sh"

config.vm.provision :reload

4. VMをプロビジョニングする

vagrant upをクリックし、プロンプトが表示されたらDefault Switchを選択します。これにより、VMは、VagrantがVMにSSH経由で接続し、共有フォルダーをマウントし、プロビジョニングを開始するのに十分な動的IPv4アドレスを取得します。

これで、静的IPアドレスが設定され、プロビジョニングが続行される前にVMがリロードされます。

出力例:

    Homestead: Setting static IP address for Hyper-V...
==> Homestead: Running provisioner: reload...
==> Homestead: Running action triggers before reload ...
==> Homestead: Running trigger...
==> Homestead: Setting Hyper-V switch to 'NATSwitch' to allow for static IP...
    Homestead: Running local script: ./scripts/set-hyperv-switch.ps1
==> Homestead: Attempting graceful shutdown of VM...
==> Homestead: Stopping the machine...
    Homestead: Configuring the VM...
==> Homestead: Starting the machine...
==> Homestead: Waiting for the machine to report its IP address...
    Homestead: Timeout: 120 seconds
    Homestead: IP: 192.168.0.2
==> Homestead: Waiting for machine to boot. This may take a few minutes...
==> Homestead: Machine booted and ready!

5.その他の考え

  1. 最初のDefault Switchの後にvagrant upを選択するには、手動入力が必要です。これを回避する方法を見つけることが理想的です。
  2. Vagrant-reloadプロビジョナーはマシンを正常にシャットダウンできず、強制的に停止する必要があります。 (最初のプロビジョニング時に)1回だけ発生するため、重大な問題ではありません。これは、VMのHyper-VスイッチをDefault SwitchからNATSwitchに変更する前にリロードイベント中に実行する必要があるために発生します。これは、事実上、イーサネットコードを引き出すのに似ています。物理的なジャックの別のスイッチに接続します。
5
Ben Johnson

172.20.23.Xのスコープを持つ外部DHCPサーバーが仮想マシンにIPアドレスを提供するようです。 DHCPコンソールでフィルターを使用して、仮想マシンのMACアドレスを入力することにより、DHCPサーバーがこれらのマシンにアドレスを発行しないようにすることができます。以下に示すように: enter image description here

enter image description here

次に、他のDHCPを使用して仮想マシンの予約済みアドレスを設定するか(私の理解では、172.20.83.Xスコープでアドレスを取得したくないため、他のDHCPを使用します)、静的アドレスを手動で構成して、情報は、ホストファイルの内容と同じです。

1
S.Leon