私はLaravel Homestead with Vagrantを使用しています。Windowsに統合されているため、Virtual Boxの代わりにHyper-Vを使用するのが理にかなっていると思います。
これが私の問題です。時々、Hyper-v仮想マシンは新しいIPを取得します。通常は172.20.83.Xです。ドメインをテストするためにipsを実行するときに、これは私のhostsファイルをめちゃくちゃにします。そのため、hyper-vサーバーが新しいIPを取得するたびに、新しいIPを再入力する必要があり、すぐに退屈になります。
私は自分のマシンで常に同じになるようにIPを設定できる方法があるかどうか疑問に思っています。
サーバーの仮想スイッチマネージャーをいじってみましたが、インターネットが完全に失われました。
アスカー、および同様のユースケースを持つ誰もが、ローカル開発の目的でワークステーション(Windows Serverエディションではない)で動作している可能性が高く、Hyper-Vが 変更すべてのホストマシンの再起動時のIPアドレスの割り当て 。
プロビジョニング後、VMのネットワーク構成内に静的IPアドレスを「手動で」ハードコードする必要があり、面倒で自動化を妨げます。 「使い捨て」開発VMの精神とハンズフリーのプロビジョニングワークフローに合わせて、プロセス全体を自動化する方がはるかに望ましいのではないでしょうか。なぜそうなのでしょう!
Vagrantは(まだ)Hyper-Vマシンに静的IPアドレスを設定できないため、このすべてのフープジャンプが必要です。見る:
つまり、これを機能させるための一連のイベントは次のとおりです。
vagrant-reload
プラグインを利用するVagrant Triggerを設定して、特定のVMのネットワークスイッチをオンデマンドで変更します。vagrant up
、ただし初期プロビジョニングではDefault Switch
(新しいNATSwitch
ではなく)を選択します。NATSwitch
の範囲内にある静的IPをVMのオペレーティングシステム内に構成します(この手順はOS固有です)。config.vm.provision :reload
を呼び出します。これにより、a)手順2で定義したトリガーが起動され、VMのネットワークスイッチが新しいNATSwitch
に変更されます。およびb)vagrant reload
を発行し、VMの再起動後にプロビジョニングプロセスを続行します。NATSwitch
から取得され、無期限に使用されます。この手順は確かに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
プロビジョニングの最中に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
静的IPの構成はOS固有のタスクであるため、この手順は、特定のゲストOSに合わせて調整する必要があります。 2つの例を次に示します。
[〜#〜]注[〜#〜]:企業ネットワーク上にある場合、Googleのように会社のDNSサーバーを使用してください(これらの例)に到達できない場合があります。
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.
./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
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!
Default Switch
の後にvagrant up
を選択するには、手動入力が必要です。これを回避する方法を見つけることが理想的です。Default Switch
からNATSwitch
に変更する前にリロードイベント中に実行する必要があるために発生します。これは、事実上、イーサネットコードを引き出すのに似ています。物理的なジャックの別のスイッチに接続します。