我正在使用 ESXi 6.0 和 PowerCLI。我创建了一个生产虚拟机的克隆:
$Source_VM = Get-VM -Name "MyProductionServer"
$Target_VMHost = Get-VMHost -VM $Source_VM
$Cloned_VM = (New-VM -Name "MyPreProdServer" -VM $Source_VM -VMHost $Target_VMHost)
我的 MyProductionServer 在 OS 端设置了静态 IP 地址。如果我启动 $Cloned_VM,我将在同一子网上获得重复的 IP。我想要做的是在启动此虚拟机之前断开克隆虚拟机上的 NIC。
我发现的是:
1)在已启动的虚拟机上:
Get-NetworkAdapter -VM $Cloned_VM | Set-NetworkAdapter -Connected:$false -StartConnected:$false -Confirm:$false
这是可行的,但是由于克隆的虚拟机的状态,我无法这样做。
2)从虚拟机中移除网卡:
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec
$spec.deviceChange[0].Operation = "Remove"
$spec.DeviceChange[0].Device = $Cloned_VM.ExtensionData.Config.Hardware.Device | ?{$_.DeviceInfo.Label -eq "Network adapter 1"}
$Cloned_VM.ExtensionData.ReconfigVM_Task($spec)
来源:https://communities.vmware.com/thread/454525
这也有效,但这不是我想要的。
我想断开当前 NIC 的连接,以便启动克隆的 VM,更改 IP 地址,然后连接 NIC(+ 重新启动)以使克隆的 VM 使用另一个 IP 地址工作。
简单来说,我想在已关闭的虚拟机上执行 1)。可以吗?
答案1
所以我在测试环境中测试了它并且它可以运行。
# Saving the NIC
$Saved_NIC = $Cloned_VM.ExtensionData.Config.Hardware.Device | ?{$_.DeviceInfo.Label -eq "Network adapter 1"}
# Removing the NIC
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec
$spec.deviceChange[0].Operation = "Remove"
$spec.DeviceChange[0].Device = $Saved_NIC
$Cloned_VM.ExtensionData.ReconfigVM_Task($spec)
# Modifying my VM (boot + launch script + poweroff)
# Adding the NIC
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec
$spec.deviceChange[0].Operation = "Add"
$spec.DeviceChange[0].Device = $Saved_NIC
$Cloned_VM.ExtensionData.ReconfigVM_Task($spec)
# Boot again my VM and test to reach the internet: WORKING!
Start-VM -VM $Cloned_VM
看起来还不错,稍后我会在 Pre-Prod 环境中看到它 :)