jsysde
Goto Top

HyperV, PowerShell, VMNetworkadapter

Guten Abend.

Ich hänge grad an einem kleinen Problem und hoffe auf gute Ideen. face-wink

Szenario:
Auf etlichen HyperV-Hosts mit ungezählten VMs sind jeweils n HyperV-Switche angelegt, die auf allen Hosts jeweils identische Namen tragen. Jeder dieser HyperV-Switche ist an jeweils eine einzelne NIC gebunden. Nun haben die HyperV-Hosts zusätzliche NICs spendiert bekommen, es wurden NIC-Teams (LACP-Trunks) gebildet und entsprechend neue HyperV-Switche auf Basis der NIC-Teams angelegt. Bisher kommen innerhalb der VM-Konfiguration auf den HyperV-Hosts keine VLANs zum Einsatz.

Zielsetzung:
Per PowerShell soll auf allen HyperV-Hosts
- der (ein bestimmter) VMNetworkadapter innerhalb der VMs mit dem entsprechenden, neuen HyperV-Switch verbunden und
- diesem VMNetworkadapter eine VLAN-ID mitgegeben werden.

Ich dachte an einen Oneliner:
Get-VM | Get-VMNetworkadapter | Where { $_.Switchname -like "OldSwitchName" } | Connect-VMNetworkAdapter -SwitchName "NewSwitchName" | Set-VMNetworkAdapterVlan -Access -VlanId 0815  

Klappt leider nur teilweise, der VMNetworkadapter wird zwar mit dem neuen Switch verbunden, das VLAN wird allerdings nicht eingetragen; Fehlermeldung gibt es keine. Jemand eine Idee, warum der letzte Befehl nicht ausgeführt wird?

Ich könnte das nun aufsplitten und
Set-VMNetworkAdapter | Where { $_.Swichtname "NewSwitchName" } | Set-VMNetworkAdapterVlan -Access -VlanId 0815  
separat ausführen - dabei stoße ich auf ein anderes Problem:
Da die VMs künftig größtenteils den gleichen HyperV-Switch benutzen, aber unterschiedliche VLAN-IDs erhalten sollen, funktioniert mein Filter auf "SwitchName" natürlich nicht mehr - wenn ich mit obigem Befehl alle VMs, die vorher auf HyperV-Switch1 konfiguriert waren, auf den neuen HyperV-Switch verbinde, kann ich diesen nur für das Vergeben der ersten VLAN-ID nutzen. Sobald dann die VMs, die bisher HyperV-Switch2 genutzt haben, ebenfalls mit dem gleichen, neuen HyperV-Switch verbunden sind, würde ich die schon vergenenen VLAN-IDs überschreiben.

Drehe mich gerade im Kreis und hoffe darauf, dass jemand von euch das schon mal gemacht und einen passenden Oneliner parat hat. face-wink
Danke und einen schönen Abend.

Cheers,
jsysde

Content-ID: 645148

Url: https://administrator.de/contentid/645148

Ausgedruckt am: 23.11.2024 um 13:11 Uhr

lcer00
lcer00 27.01.2021 aktualisiert um 21:23:34 Uhr
Goto Top
Hallo,

In Powershell gibt es keinen Einzeilerzwang. Bau doch ein Skript, das ganz herkömmlich und mehrzeilig durch alle VMs iteriert (foreach) und mittels gewöhnlichen if die Einstellungen vornimmt.

Einen Überblick zu Schleifen findest Du z.B hier: https://www.windowspro.de/script/schleifen-powershell-foreach-while-do-u ...

Dort findest Du auch den Syntax für Einzeiler:
Get-ADUser -Filter *| %{ if($_.surname) {(Get-Culture).TextInfo.ToTitleCase( $_.surname)}}

Grüße

lcer
jsysde
jsysde 28.01.2021 um 12:45:13 Uhr
Goto Top
Mahlzeit.

Zitat von @lcer00:
In Powershell gibt es keinen Einzeilerzwang.
Ist mir klar - wäre aber "nett" gewesen, wenn es auch ein Oneliner getan hätte. Kann aber hier nicht funktionieren, da ich es a) in der falschen Reihenfolge versucht habe und b) das Verketten von Befehlen in der Pipe so nicht funktionieren kann (was man lernt, wenn man sich die Aufzeichnungen des vor Jahren gemachten PS-Kurses wieder vornimmt). face-wink

Bau doch ein Skript, das ganz herkömmlich und mehrzeilig durch alle VMs iteriert (foreach) und mittels gewöhnlichen if die Einstellungen vornimmt.
Darauf ist es jetzt hinausgelaufen. Ist bestimmt nicht richtig gut oder schön - aber es funktioniert und macht, was es soll.

$HVHost = "meinhypervhost"  
$vmold1 = Get-VM -ComputerName $HVHost | Get-VMNetworkAdapter | Where { $_.SwitchName -eq "OldSwitch1" }  
$vmold2 = Get-VM -ComputerName $HVHost | Get-VMNetworkAdapter | Where { $_.SwitchName -eq "OldSwitch2" }  
$vmold3 = Get-VM -ComputerName $HVHost | Get-VMNetworkAdapter | Where { $_.SwitchName -eq "OldSwitch3" }  
$vmold4 = Get-VM -ComputerName $HVHost | Get-VMNetworkAdapter | Where { $_.SwitchName -eq "OldSwitch4" }  

ForEach($vm1 in $vmold1) {
Get-VM -ComputerName $HVHost -Name $vm1.vmname | Get-VMNetworkAdapter | Where { $_.SwitchName -eq "OldSwitch1" } | Set-VMNetworkAdapterVlan -Access -VlanId 0815  
Get-VM -ComputerName $HVHost -Name $vm1.vmname | Get-VMNetworkAdapter | Where { $_.Switchname -eq "OldSwitch1" } | Connect-VMNetworkAdapter -SwitchName "NewSwitch"  
}

ForEach($vm2 in $vm2extern) {
Get-VM -ComputerName $HVHost -Name $vm2.vmname | Get-VMNetworkAdapter | Where { $_.SwitchName -eq "OldSwitch2" } | Set-VMNetworkAdapterVlan -Access -VlanId 0816  
Get-VM -ComputerName $HVHost -Name $vm2.vmname | Get-VMNetworkAdapter | Where { $_.Switchname -eq "OldSwitch2" } | Connect-VMNetworkAdapter -SwitchName "NewSwitch"  
}

ForEach($vm3 in $vmold3) {
Get-VM -ComputerName $HVHost -Name $vm3.vmname | Get-VMNetworkAdapter | Where { $_.SwitchName -eq "OldSwitch3" } | Set-VMNetworkAdapterVlan -Access -VlanId 0817  
Get-VM -ComputerName $HVHost -Name $vm3.vmname | Get-VMNetworkAdapter | Where { $_.Switchname -eq "OldSwitch3" } | Connect-VMNetworkAdapter -SwitchName "NewSwitch"  
}

ForEach($vm4 in $vmold4) {
Get-VM -ComputerName $HVHost -Name $vm4.vmname | Get-VMNetworkAdapter | Where { $_.SwitchName -eq "OldSwitch4" } | Set-VMNetworkAdapterVlan -Access -VlanId 0818  
Get-VM -ComputerName $HVHost -Name $vm4.vmname | Get-VMNetworkAdapter | Where { $_.Switchname -eq "OldSwitch4" } | Connect-VMNetworkAdapter -SwitchName "NewSwitch"  
}
lcer00
lcer00 28.01.2021 um 12:52:14 Uhr
Goto Top
Hallo,

innerhalb der foreach Schleifen ist die Where Klausel überflüssig.

Grüße

lcer
jsysde
jsysde 29.01.2021 um 19:05:50 Uhr
Goto Top
N'Abend.


Zitat von @lcer00:
innerhalb der foreach Schleifen ist die Where Klausel überflüssig.
Nein, ist sie nicht - wenn ich sie weglasse, werden alle NICs, die in der Konfig der jeweiligen VM angelegt sind, mit der VLAN-ID versehen und dem neuen Switch zugeordnet. Das ist aber explizit nicht gewünscht. Wäre pro VM nur eine NIC definiert, wäre das kein Problem und ich könnte die Where-Klausel tatsächlich weglassen.

Cheers,
jsysde
lcer00
lcer00 29.01.2021 um 19:52:40 Uhr
Goto Top
Hallo,
Zitat von @jsysde:

N'Abend.


Zitat von @lcer00:
innerhalb der foreach Schleifen ist die Where Klausel überflüssig.
Nein, ist sie nicht - wenn ich sie weglasse, werden alle NICs, die in der Konfig der jeweiligen VM angelegt sind, mit der VLAN-ID versehen und dem neuen Switch zugeordnet. Das ist aber explizit nicht gewünscht. Wäre pro VM nur eine NIC definiert, wäre das kein Problem und ich könnte die Where-Klausel tatsächlich weglassen.

OK, das macht dann Sinn.

Grüße

lcer