Настройка сети в Hyper-V с помощью Powershell
Окружение
Что было: парк серверов виртуализации, которые нужно перенастроить. Конфигурация типовая, на каждом сервере одна встроенная сетевая карта с двумя интерфейсами.
- Один интерфейс использовался для управления хостом;
- На втором интерфейсе висел единственный виртуальный коммутатор, через который ВМ выходили наружу.
То есть достучаться до хоста можно было по одному единственному адресу.Что нужно было сделать: на базе двух интерфейсов создать тиминг-группу, на базе этой тиминг-группы создать внешний виртуальный коммутатор и подключить к нему все ВМ.Если интересуют детали реализации на уровне сетевого оборудования, то конечно же каждый из двух сетевых интерфейсов сервера планировалось что будет смотреть в отдельный коммутатор. То есть была цель реализовать избыточность на уровне сетевого оборудования.Примечание: внимательный читатель спросит зачем все это нужно, если избыточности на уровне сетевых карт сервера нету. Все верно, но хоть что-то. На моей памяти коммутаторы выходили из строя значительно чаще, чем сетевые карты на серверах, так что есть смысл обеспечить резервирование хотя бы на таком уровне.
Последовательность операций
Коротко пройдемся по основным этапам настройки.
Удаление старого виртуального коммутатора
Вы не сможете удалить виртуальный коммутатор, если к нему будут подключены ВМ. Отключаем все адаптеры всех ВМ одной командой:1 Get-VM | Get-VMNetworkAdapter | Disconnect-VMNetworkAdapter Теперь можно удалить виртуальный коммутатор:1 Get-VMSwitch | Remove-VMSwitch -Force Напомню, что в моем окружении на каждом сервере был только один vSwitch.
Сохранение сетевых настроек
На каждом сервере был всего лишь один адаптер со статическими сетевыми настройками, а потому можно их легко запомнить, чтобы потом назначить тиминг-адаптеру.Сохраняем ip-адрес:1 $IpAddress = ( Get-NetIPAddress | Where-Object IPAddress -Like $NetworkPrefix | Select-Object -First 1 ).IPAddress Маску подсети:1 $PrefixLength = ( Get-NetIPAddress | Where-Object IPAddress -Like $NetworkPrefix | Select-Object -First 1 ).Prefixlength Шлюз (пришлось погуглить, чтобы дойти до такой конструкции)1 $DefaultGateway = ( Get-WmiObject -Class Win32_IP4RouteTable | where { $_.destination -eq '0.0.0.0' -and $_.mask -eq '0.0.0.0' } | Sort-Object metric1 | select -First 1 nexthop, metric1, interfaceindex ).nexthop Серверы DNS:1 $DnsServers = Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object –ExpandProperty ServerAddresses -Unique Все настройки сохранены.
Создание тиминг-группы
Создается одной командой:1 New-NetLbfoTeam -Name $NicTeamName -TeamingMode SwitchIndependent -LoadBalancingAlgorithm HyperVPort -TeamMembers ( Get-NetAdapter -Physical ).Name -Confirm:$False Конструкция ( Get-NetAdapter -Physical ).Name возвращает список имен всех физических интерфейсов. Если ваша конфигурация отличается, вам стоит обратить внимание на этот момент.
Создание виртуального коммутатора
Тиминг-группа создана, можно на её основе создать виртуальный коммутатор:1 New-VMSwitch -Name $VMSwitchName -NetAdapterName $NicTeamName -AllowManagementOS $true -Confirm:$False Параметр -AllowManagementOS $true создаст виртуальный сетевой адаптер хоста.
Возвращение сетевых настроек
Тиминг-группа создана, виртуальный коммутатор на её основе тоже. После этого создался виртуальный сетевой адаптер хоста (имя по умолчанию vEthernet (External)), которому мы должны назначить ранее сохраненные сетевые настройки:1 New-NetIPAddress -InterfaceAlias "vEthernet (External)" -IPAddress $IpAddress -PrefixLength $PrefixLength -DefaultGateway $DefaultGateway DNS-настройки восстанавливаются отдельно:1 Set-DnsClientServerAddress -InterfaceAlias "vEthernet (External)" -ServerAddresses $DnsServers После завершения работы скрипта хост должен быть доступен по старому адресу.
Подключение адаптеров ВМ
Подключаем все адаптеры всех ВМ к единственному виртуальному коммутатору:1 Get-VM | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -VMSwitch ( Get-VMSwitch | Select-Object -First 1 ) Далее самое интересное.