Mit dem 2012 R2 Release des Virtual Machine Manager haben einige Verbesserungen im Bereich des Management von IP-Adressen für VMs Einzug erhalten.
IP address management for virtual machines: Hosters and enterprises can more easily manage IP addresses for VMs across the datacenter. After virtual machine deployment, IP addresses can be viewed for each virtual network adapter, and can be changed or added without logging on to the virtual machines. For virtual machine migration, new IP addresses can be assigned from an IP pool in the destination subnet. In addition, virtual machines in a guest cluster can set their own IP addresses on networks that use Hyper-V network virtualization.
Das man sich die IP-Adressen des Netzwerkadapters einer VM im VMM anzeigen lassen kann, hatte ich schon in einem früheren Blogartikel geschrieben.
-> http://technet.microsoft.com/en-us/library/dn440575.aspx
Aber wie erfolgt die Zuweisung einer anderen IP-Adresse ohne sich an der VM beziehungsweise dem Windows Betriebssystem anzumelden?
Über die VMM Konsole nach meinem derzeitigen Stand nicht. Es bleibt also einem nur die Möglichkeit über die PowerShell und die VMM Cmdlets zu gehen.
Ein sehr einfaches PowerShell Skript für diesen Zweck sieht zum Beispiel so aus.
$VMMServer=”SRV-1″
$IPAddress=Read-Host “Enter IP address”
$VM=Get-SCVirtualMachine -VMMServer $VMMServer|Select-Object -Property Name|Out-Gridview -PassThru
$NIC=Get-SCVirtualNetworkAdapter -VMMServer $VMMServer -VM $VM.Name|Out-Gridview -PassThru
Set-SCVirtualNetworkAdapter -VMMServer $VMMServer -VirtualNetworkAdapter $NIC -IPv4AddressType Static -IPv4Addresses $IPAddress
Zuerst legt man die IP-Adresse fest, die man vergeben möchte. Diese muss aus einem im VMM definierten statischen IP-Pool kommen. Danach ruft man alle VMs ab und anschließend die vNICs der ausgewählten VM. Im letzten Schritt erfolgt dann die Zuweisung der IP-Adresse. Dies funktioniert bei einer laufenden sowie bei einer ausgeschalteten VM.
Ich habe allerdings ein etwas umfangreicheres PowerShell Skript geschrieben, um weitere Szenarien im Zusammenhang mit der Änderungen der IP-Adresse abzudecken. Das Skript bietet dabei die folgenden Möglichkeiten.
-
Ändern der IP-Adresse
-
Ändern des VM Network
-
Ändern des VM Subnet
-
Anzeigen welche IP-Adressen vergeben oder reserviert sind
-
VM Networks mit und ohne VM Subnet
Eine Einschränkung hat das Skript in seiner ersten Version allerdings noch. Der Adressbereich des IP-Pools darf nicht über mehrere Subnetze reichen.
IP-Adressbereich | Subnetzmaske | Unterstützt vom Skript |
10.0.0.1-10.0.0.254 | 255.255.254.0 | Ja |
10.0.0.1-10.0.1.254 | 255.255.254.0 | Nein |
Sobald ich die Zeit finde das Skript weiter auszubauen, wird auch diese Einschränkung aufgehoben werden.
Nun aber zur Funktionsweise des Skripts, da es sich im Endeffekt um ein Cmdlet handelt, wird dieses folgendermaßen aufgerufen.
Set-SCVMIPAddress –VMMServer SRV-1
Im nächsten Schritt erhält man über ein Out-Gridview die abgerufenen VMs zur Auswahl sowie danach die vNICs der VM.
Danach wird das VM Network und das VM Subnet ausgewählt mit dem die VM verbunden werden soll. Hiermit definiert man auch gleichzeitig schon den IP-Pool aus dem die VM ihre neue IP-Adresse beziehen wird, da hier die Abfrage über das VM Subnet erfolgt.
Nachdem man die IP-Adresse ausgewählt hat, wird diese gesetzt. Der linke Screenshot zeigt die Einstellungen vor der Änderung und der Rechte danach.
Da die VM zum Zeitpunkt der Änderung ausgeschaltet war, erscheint in den Jobs des VMM folgende Warnung.
Warning (50016)
The parent VM of the given virtual network adapter WAP-1 is not running and hence configuring the IP address settings is not supported. They will be applied by the host virtualization platform only when the VM starts running.Recommended Action
Please ensure that the VM is running so that the settings can be applied by the host virtualization platform.
Startet man danach die VM werden die Änderungen angewendet.
Wie weiter oben geschrieben kann die Änderung auch im laufenden Betrieb erfolgen. In diesem Beispiel ändere ich die IP-Adresse und das VM Network wieder zurück auf die ursprünglichen Einstellungen. Die Besonderheit dabei das VM Network Datacenter besitzt kein VM Subnet, da es direkt an das Netzwerk per No isolation gebunden ist. Die Auswahl der VM und vNIC sind die gleichen.
Da das VM Network Datacenter, wie bereits erwähnt, kein VM Subnet besitzt, gelangt man direkt zur Auswahl des IP-Pools und der IP-Adresse. Anschließend kann in den Jobs des VMM und innerhalb der VM selber das Ergebnis überprüft werden.
Somit lässt sich ohne Anmelden an der VM die IP-Adresse ändern. Dabei kann man auch noch das VM Network und VM Subnet ändern, wenn man möchte.
Hier der Downloadlink zum Skript.
PowerShell Skript Set-SCVMIPAddress:
<#
.SYNOPSIS
Change the IP address of a VM without logging on to the VM.
.DESCRIPTION
Change the IP address of a VM without logging on to the VM.Recent Version from 12/21/2013 works only with ip pools with /24 subnet IP pool range.
Other IP pool ranges will be supported in a future version of this script.
Example:
IP pool range 10.0.0.1-10.0.0.254 with subnet mask 255.255.254.0 works!IP pool range 10.0.0.1-10.0.1.254 with subnet mask 255.255.254.0 does not work!
.NOTES
File Name : Set-SCVMIPAddress.ps1
Author : Daniel Neumann
Requires : PowerShell Version 3.0
System Center 2012 R2 Virtual Machine Manager PowerShell Cmdlets
.LINK
To provide feedback or for further assistance visit:
https://www.danielstechblog.io
.EXAMPLE
Set-SCVMIPAddress -VMMServer vmmserver.demo.localCall with the FQDN of the VMM Management Server.
.EXAMPLE
Set-SCVMIPAddress -VMMServer vmmserverCall with the name of the VMM Management Server.
#>
function Set-SCVMIPAddress
{
param
(
[Parameter(Mandatory=$true, HelpMessage=’VMM Server’)]
[String]
$VMMServer
)$VM=Get-SCVirtualMachine -VMMServer $VMMServer|Select-Object -Property Name|Out-Gridview -PassThru -Title ‘Select Virtual Machine’
$NIC=Get-SCVirtualNetworkAdapter -VMMServer $VMMServer -VM $VM.Name|Out-Gridview -PassThru -Title ‘Select VMs vNIC’
$VMNetwork=Get-SCVMNetwork -VMMServer $VMMServer|Out-Gridview -PassThru -Title ‘Select VM Network’
if($VMNetwork.VMSubnet){
$VMSubnet=Get-SCVMSubnet -VMMServer $VMMServer -VMNetwork $VMNetwork|Out-GridView -PassThru -Title ‘Select VM Subnet’
$IPPool=Get-SCStaticIPAddressPool -VMMServer $VMMServer -VMSubnet $VMSubnet|Out-GridView -PassThru -Title ‘Select IP address pool’
}
else{
$LogicalNetworkDefinition=Get-SCLogicalNetworkDefinition -VMMServer $VMMServer -LogicalNetwork $VMNetwork.LogicalNetwork
$IPPool=Get-SCStaticIPAddressPool -VMMServer $VMMServer -LogicalNetworkDefinition $LogicalNetworkDefinition |Out-GridView -PassThru -Title ‘Select IP address pool’
}
$IPAddresses=Get-SCIPAddress -VMMServer $VMMServer -StaticIPAddressPool $IPPool -Assigned$FreeIPAddresses=@()
if($IPPool.IPAddressRangeStart.Substring(0,$IPPool.IPAddressRangeStart.LastIndexOf(“.”)) -eq $IPPool.IPAddressRangeEnd.Substring(0,$IPPool.IPAddressRangeEnd.LastIndexOf(“.”))){
$Start=[Int]$IPPool.IPAddressRangeStart.Substring($IPPool.IPAddressRangeStart.LastIndexOf(“.”)+1)
$End=[Int]$IPPool.IPAddressRangeEnd.Substring($IPPool.IPAddressRangeEnd.LastIndexOf(“.”)+1)
$ReservedIPs=$IPPool.IPAddressReservedSet.Split(“,”) -replace ” “,””
$Subnet=$IPPool.IPAddressRangeStart.Substring(0,$IPPool.IPAddressRangeStart.LastIndexOf(“.”))
for($Start;$Start -le $End;$Start++){
$Info = New-Object PSObject -Property @{
Name=”$Subnet.$Start”
Info=’Free’
}
$FreeIPAddresses += $Info
}
foreach($IPAddress in $IPAddresses){
foreach($FreeIPAddress in $FreeIPAddresses){
if($FreeIPAddress.Name -eq $IPAddress.Address){
$FreeIPAddress.Info=’Assigned’
}
}
}
foreach($ReservedIP in $ReservedIPs){
foreach($FreeIPAddress in $FreeIPAddresses){
if($FreeIPAddress.Name -eq $ReservedIP){
$FreeIPAddress.Info=’Reserved’
}
}
}
$ChoosenIPAddress=$FreeIPAddresses|Out-Gridview -PassThru -Title ‘Select IP address’
#Grant-SCIPAddress -VMMServer $VMMServer -StaticIPAddressPool $IPPool -GrantToObjectType VirtualNetworkAdapter -GrantToObjectID $NIC.ID -IPAddress $ChoosenIPAddress.Name|Set-SCIPAddress
if($VMNetwork.VMSubnet){
Set-SCVirtualNetworkAdapter -VMMServer $VMMServer -VirtualNetworkAdapter $NIC -VMNetwork $VMNetwork -VMSubnet $VMSubnet -IPv4AddressType Static -IPv4Addresses $ChoosenIPAddress.Name
}
else{
Set-SCVirtualNetworkAdapter -VMMServer $VMMServer -VirtualNetworkAdapter $NIC -VMNetwork $VMNetwork -IPv4AddressType Static -IPv4Addresses $ChoosenIPAddress.Name
}
}
}