как заменить образ сетевой карты в виртуальной машине на образ ipxe

Небольшая статья - как заменить образ сетевой карты в виртуальной машине на образ ipxe.

На сайте ipxe нашел как можно заменить образы сетевой карты на свои. Но это все делается ручками. Что делать, если у тебя виртуальных машин больше 100 и более.

Нужно автоматизировать данный процесс. Используем powershell и powercli. Также нам понадобятся putty, pscp.

Использовал информацию со следующих сайтов:

Создание образов

Скрипт с поддержкой dhcp

#!ipxe

dhcp
chain http://boot.nurm.local/ipxe.php?mac=${net0/mac:hexhyp}

Скрипт со статическим адресом

#!ipxe

ifopen

set net0/ip 192.168.1.200
set net0/netmask 255.255.255.0
set net0/gateway 192.168.1.1
set net0/dns 192.168.1.1

chain http://boot.nurm.local/ipxe.php?mac=${net0/mac:hexhyp}

Скрипт powershell

Param(
[String]$ESXHost="192.168.1.2",
[String]$ESXUser="root",
[String]$ESXPass="123root123")

# Check PsSnapin Before Loading
if ( (Get-PSSnapin -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin VMware.VimAutomation.Core
}


#Connect to vcenter server first before starting script
Connect-VIServer -Server $ESXHost -User $ESXUser -Password $ESXPass

# Start the SSH service
$sshService = Get-VmHostService -VMHost $ESXHost | Where { $_.Key -eq "TSM-SSH"}
Start-VMHostService -HostService $sshService -Confirm:$false

# Run putty - create folder /usr/lib/vmware/resources, copy mrom files to esxi host
$RunPuttyCmd = @"
mkdir -p /usr/lib/vmware/resources
"@

$RunPuttyCmd           |Out-File -FilePath  commands.txt  -Force -encoding ASCII

$RunPuttyBat = @"
REM -----------------------------RunPuttyCmds.BAT------------------------------

    putty.exe -pw $ESXPass $ESXUser@$ESXHost -m commands.txt

    pscp.exe -pw $ESXPass -l $ESXUser *.mrom $($ESXHost):/usr/lib/vmware/resources/

REM -----------------------------End-of-Run-PuttyCmds.BAT----------------------
"@

$RunPuttyBat           |Out-File -FilePath  RunPuttyCmd.bat  -Force -encoding ASCII

Invoke-Expression -Command:".\RunPuttyCmd.bat"

Remove-Item -LiteralPath:"RunPuttyCmd.bat" -Force
Remove-Item -LiteralPath:"commands.txt" -Force

# Stop SSH service
Stop-VMHostService -HostService $sshService -Confirm:$false

$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.tools = New-Object VMware.Vim.ToolsConfigInfo

$extra1 = New-Object VMware.Vim.OptionValue
$extra1.Key = "ethernet0.opromsize"
$extra1.Value = "262144"
$spec.ExtraConfig += $extra1
$extra2 = New-Object VMware.Vim.OptionValue
$extra2.Key = "e1000bios.filename"
$extra2.Value = "/vmfs/volumes/datastore1/mrom/8086100f.mrom"
$spec.ExtraConfig += $extra2
$extra3 = New-Object VMware.Vim.OptionValue
$extra3.Key = "e1000ebios.filename"
$extra3.Value = "/vmfs/volumes/datastore1/mrom/808610d3.mrom"
$spec.ExtraConfig += $extra3
$extra4 = New-Object VMware.Vim.OptionValue
$extra4.Key = "nbios.filename"
$extra4.Value = "/vmfs/volumes/datastore1/mrom/10222000.rom"
$spec.ExtraConfig += $extra4
$extra5 = New-Object VMware.Vim.OptionValue
$extra5.Key = "nx3bios.filename"
$extra5.Value = "/vmfs/volumes/datastore1/mrom/15ad07b0.rom"
$spec.ExtraConfig += $extra5


$vms = get-vm | get-view

foreach($vm in $vms){
    Write-Host "Found VM $vm.Name"
    $vm.ReconfigVM($spec)
}

Disconnect-VIServer -Confirm:$false

Данный скрипт обновляет vmx файл ВМ, добавляет bootrom для сетевых карт. Работает даже на запущенных ВМ.

TODO - 
add example images before and after

Результаты работы

TODO -
add picture of running vms

в скрипте есть недостатки - 
* обновляет только первую сетевую карту - нужно изменить скрипт так, чтобы изменялась информация по всем сетевым картам.
* нужно отслеживать какой тип сетевой карты используется и добавлять информацию только данной карте.
comments powered by Disqus