In the past I posted my two Hyper-V Server demo script for Windows Network Virtualization.
And a whole series of posts about Windows Network Virtualization. Unfortunately, some folks just could not get it working.
Well, a key script that I left out was the one I used to setup my servers. And that is here.
I use the little trick of setting the IP of the VMs through WMI as well (remember, the VMs must be running).
I also use a little trick to build all of the routes and rules. Remember, there is no automatic route maintenance, if you are setting this up and using it, you must also manage the change – the system won’t do it for you.
One requirement here, the machines are joined to the same domain. And I have a Register-PSSessionConfiguration on the remote machine defined as Taylor mentions here.
Okay, enough of that. Here is my setup and reset PowerShell script:
$what = Read-Host -Prompt "Do you want to RESET or SETUP?"
# Load the function to set the IP address.
function Get-VMIPAddress ($VMName)
{
$Query = "SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" + $VMName + "'"
$VM = Get-WmiObject -Query $Query -Namespace "root\virtualization\v2"
if ($VM -eq $null)
{
write-host ("No VM found with the specified name '" + $VMName + "'")
return
}
$Query = "ASSOCIATORS OF {" + $VM.__PATH + "} WHERE ResultClass = Msvm_VirtualSystemSettingData"
$VMSettings = Get-WmiObject -Query $Query -Namespace "root\virtualization\v2"
$Query = "ASSOCIATORS OF {" + $VMSettings.__PATH + "} WHERE ResultClass = Msvm_SyntheticEthernetPortSettingData"
$VMNIC = Get-WmiObject -Query $Query -Namespace "root\virtualization\v2"
$Query = "ASSOCIATORS OF {" + $VMNIC.__PATH + "} WHERE ResultClass = Msvm_GuestNetworkAdapterConfiguration"
$VMIpSettings = Get-WmiObject -Query $Query -Namespace "root\virtualization\v2"
$VMIpSettings
}
function Set-VMIPAddress ($VMName, $IPSettings)
{
$Service = Get-WmiObject -Class "Msvm_VirtualSystemManagementService" -Namespace "root\virtualization\v2"
$Query = "SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" + $VMName + "'"
$VM = Get-WmiObject -Query $Query -Namespace "root\virtualization\v2"
if ($VM -eq $null)
{
write-host ("No VM found with the specified name '" + $VMName + "'")
return
}
$Value = $Service.SetGuestNetworkAdapterConfiguration($VM, $IPSettings.GetText(1))
#Value success if the return value is "0"
if ($Value.ReturnValue -eq 0)
{
write-host "Operation completed successfully"
}
#If the return value is not "0" or "4096" then the operation failed
elseif ($Value.ReturnValue -ne 4096)
{
write-host ("Operation failed: " + $Value.ReturnValue)
}
else
{
#Get the job object
$job = [WMI]$Value.job
if ($job.JobState -eq 7)
{
# Job has already failed
write-host "Operation failed"
write-host "ErrorCode:" $job.ErrorCode
write-host "ErrorDescription" $job.ErrorDescription
}
else
{
#Provide updates if the jobstate is "3" (starting) or "4" (running)
while ($job.JobState -eq 3 -or $job.JobState -eq 4)
{
write-host $job.PercentComplete
start-sleep 1
#Refresh the job object
$job = [WMI]$Value.job
#A jobstate of "7" means success
if ($job.JobState -eq 7)
{
write-host "Operation completed successfully"
}
else
{
write-host "Operation failed"
write-host "ErrorCode:" $job.ErrorCode
write-host "ErrorDescription" $job.ErrorDescription
}
}
}
}
}
switch ($what) {
RESET {
"RESET!!"
# Get set up and make sure that it is all ready
Invoke-Command -ComputerName Waldorf.brianeh.local -ConfigurationName HVRemoteAdmin { Move-VM -Name “Red22” -DestinationHost Statler.brianeh.local –IncludeStorage –DestinationStoragePath D:\BlankVM }
sleep 30
# Reset adapters
Get-VMNetworkAdapter -VMName * | Connect-VMNetworkAdapter -SwitchName VMs
Get-VMNetworkAdapter -VMName * | Set-VMNetworkAdapter -VirtualSubnetId 0
Get-VMNetworkAdapter * | ft vmname, name, macaddress, ipaddresses, virtualsubnetid
# Reset the VMs to DHCP
# Red11
$VMIP = Get-VMIPAddress "Red11"
$VMIP.DHCPEnabled = $True
Set-VMIPAddress "Red11" $VMIP
# Red22
$VMIP = Get-VMIPAddress "Red22"
$VMIP.DHCPEnabled = $True
Set-VMIPAddress "Red22" $VMIP
# Blue11
$VMIP = Get-VMIPAddress "Blue11"
$VMIP.DHCPEnabled = $True
Set-VMIPAddress "Blue11" $VMIP
# Blue22
$VMIP = Get-VMIPAddress "Blue22"
$VMIP.DHCPEnabled = $True
Set-VMIPAddress "Blue22" $VMIP
# Reset the Windows NetVirt binding
$vSwitch = Get-VMSwitch -SwitchType External
Disable-NetAdapterBinding -InterfaceDescription $vSwitch.NetAdapterInterfaceDescription -ComponentID "ms_netwnv"
Invoke-Command -ComputerName waldorf.brianeh.local -ConfigurationName HVRemoteAdmin {
$vSwitch = Get-VMSwitch -SwitchType External
Disable-NetAdapterBinding -InterfaceDescription $vSwitch.NetAdapterInterfaceDescription -ComponentID "ms_netwnv"
}
# power off VMs, Red first
Stop-VM Red* -AsJob
sleep 60
Stop-VM Blue* -AsJob
}
SETUP {
"SETUP!!"
# power on VMs, Red first
Start-VM Red* -AsJob
sleep 60
Start-VM Blue* -AsJob
# wait until all VMs ICs are 'awake' and are reporting an IP address
$vmNics = Get-VMNetworkAdapter *
do {
$upCount = ($vmNics | where {$_.IPAddresses.count -ne 0})
$upCount.Count
sleep 30
}
until ($vmNics.Count -eq $upCount.Count)
# Red11
# Set the IP of each VM
$VMIP = Get-VMIPAddress "Red11"
#Setting the VM Network settings to a static IPv4 address
$VMIP.DNSServers = @("192.168.1.2")
$VMIP.IPAddresses = @("192.168.1.11")
$VMIP.DefaultGateways = @("192.168.1.1")
$VMIP.Subnets = @("255.255.255.0")
$VMIP.DHCPEnabled = $False
Set-VMIPAddress "Red11" $VMIP
# Red22
$VMIP = Get-VMIPAddress "Red22"
$VMIP.DNSServers = @("192.168.1.2")
$VMIP.IPAddresses = @("192.168.1.22")
$VMIP.DefaultGateways = @("192.168.1.1")
$VMIP.Subnets = @("255.255.255.0")
$VMIP.DHCPEnabled = $False
Set-VMIPAddress "Red22" $VMIP
# Blue11
$VMIP = Get-VMIPAddress "Blue11"
$VMIP.DNSServers = @("192.168.1.2")
$VMIP.IPAddresses = @("192.168.1.11")
$VMIP.DefaultGateways = @("192.168.1.1")
$VMIP.Subnets = @("255.255.255.0")
$VMIP.DHCPEnabled = $False
Set-VMIPAddress "Blue11" $VMIP
# Blue22
$VMIP = Get-VMIPAddress "Blue22"
$VMIP.DNSServers = @("192.168.1.2")
$VMIP.IPAddresses = @("192.168.1.22")
$VMIP.DefaultGateways = @("192.168.1.1")
$VMIP.Subnets = @("255.255.255.0")
$VMIP.DHCPEnabled = $False
Set-VMIPAddress "Blue22" $VMIP
Get-VMNetworkAdapter * | ft vmname, name, macaddress, ipaddresses, virtualsubnetid
}
}
No comments:
Post a Comment