клонировать vm изменить сетевой идентификатор

Я пытаюсь написать сценарий (powershell/powercli) для клонирования нашей среды контроля качества (261 сервер). В основном я хочу сделать новую копию каждого сервера, просто изменив имя виртуальной машины, имя хоста и IP-адрес. В идеале я бы хотел, чтобы новый клон был в домене (90% из них - ОС Windows). И многие из моих серверов имеют много больших жестких дисков, которые не помещаются в одно хранилище данных, поэтому я должен иметь возможность клонировать их в несколько хранилищ данных.

Я начал с New-VM для серверов, которые были достаточно малы, чтобы поместиться в одно хранилище данных, но OSCustomization работает только примерно в 30% случаев. В остальное время я должен войти в Windows и вручную удалить из домена, чтобы переименовать имя хоста. Большую часть времени Set-OSCustomizationNicMapping работает, но указание -Domain -DomainUsername/Password никогда не работает (в лучшем случае он переименовывает сервер и помещает его в рабочую группу «имя домена», но никогда не присоединяется к домену).

Чтобы обойти проблему с несколькими хранилищами данных, я обнаружил, что $vm.ExtensionData.CloneVM использует VMWare.Vim.VirtualMachineRelocateSpec, чтобы указать, какие жесткие диски относятся к каким хранилищам данных, и это прекрасно работает, но я не знаю, как настроить имя хоста или параметры сетевой карты.

Таким образом, основные требования таковы: клонировать в несколько хранилищ данных, изменяя настройки имени хоста и IP. У кого-нибудь есть какие-либо рекомендации или решения?

Вот некоторые из моих фрагментов кода:

Настройка OSCustomizationSpec для New-VM

$spec = New-OSCustomizationSpec -Name "PowerCLI Scripting for $NewHostName" -Spec "PowerCLI Scripting" -WhatIf:$False
Set-OSCustomizationSpec $spec -Workgroup "WORKGROUP" -DomainUsername "[email protected]" -DomainPassword (Get-Password -Username "qa\qajoin") -ProductKey $ProductKey -AdminPassword (Get-Password $Script:LuserName) | Out-Null
Get-OSCustomizationSpec "PowerCLI Scripting for $NewHostName" `
| Get-OSCustomizationNicMapping `
| Set-OSCustomizationNicMapping `
-IPMode:UseStaticIP `
-IPAddress $NewIPAddress `
-SubnetMask "255.255.248.0" `
-DNS "10.26.40.115","10.26.40.116" `
-DefaultGateway $NewDFGW | Out-Null

Команда New-VM:

$VM = New-VM -VMHost $VMHost -VM $Hostname -Name $NewHostName -Description "$Description" -OSCustomizationSpec "PowerCLI Scripting for $NewHostName" -Location (Get-Folder -Id $Location) -Datastore $MostFreeSpace -ErrorAction Stop

Вот клон с несколькими хранилищами данных:

$VMXtargetDatastore = Get-Datastore ($MapInfo | Where-Object {$_.Name -eq "Hard disk 1"}).NewDataStore

#Create an empty CloneSpec
$spec = New-Object VMware.Vim.VirtualMachineCloneSpec 
$spec.Template = $false
 $spec.PowerOn = $false

 #Create a RelocateSpec (datastore is target for .vmx)
$spec.Location = New-Object VMware.Vim.VirtualMachineRelocateSpec
$spec.Location.Datastore = $targetDatastore.ExtensionData.MoRef

#For each disk in the current vm
#  create a new DiskLocator spec
#  populate the datastore and diskid from the current harddisk
#  add the spec to RelocateSpec from above
Get-HardDisk -VM $Origvm | %{
    $disk = New-Object VMware.Vim.VirtualMachineRelocateSpecDiskLocator
    $disk.diskId = $_.ExtensionData.Key #2001,2002,2003,...
    $DiskLabel = $_.ExtensionData.DeviceInfo.Label
    #$disk.datastore = $_.ExtensionData.Backing.Datastore #type=datastore value=datastore-2790
    $dsname = ($MapInfo | Where-Object {$_.Name -eq $DiskLabel}).NewDataStore
    $ds = Get-Datastore -Name $dsname
    $disk.datastore = $ds.id
    $spec.Location.Disk += $disk
}

$CustSpec = New-Object VMware.Vim.CustomizationSpec
$origvm.ExtensionData.CloneVM((Get-Folder -Id $folder).ExtensionData.MoRef, $targetName, $spec)

Я предполагаю, что следующим шагом с использованием метода ExtensionData.CloneVM является объявление нового объекта CustomizationIdentitySettings, но документация (http://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.vm.customization.IdentitySettings.html), которые я смог найти, на самом деле не полезно (вероятно, потому что настройки различаются в зависимости от ОС?), а затем добавьте этот объект в мой объект $spec. То же самое касается OSCustomizationNicMapping (http://www.vmware.com/support/developer/PowerCLI/PowerCLI41U1/html/OSCustomizationNicMapping.html), но я не могу получить достаточно информации из пабов, чтобы понять, как создать мой объект $spec.


person Arluin    schedule 16.08.2013    source источник


Ответы (2)


Вы не можете скопировать в изолированную среду? Просто создайте набор дополнительных (изолированных) VLAN и скопируйте все виртуальные машины, сохраните IP/имена, переключите VLAN только на уровне виртуальной машины.

person Gabrie    schedule 18.08.2013
comment
Спасибо за комментарий. К сожалению, нет, я не могу создать изолированную среду из-за проблем с лицензированием и размером, некоторые из моих серверов являются отдельными экземплярами, а те, которые я клонирую, должны иметь возможность маршрутизироваться к одним и тем же отдельным экземплярам. - person Arluin; 19.08.2013
comment
Я строю что-то подобное для большой больницы. Им нужна была среда OTA, в которой они могли бы иметь точные копии своих производственных виртуальных машин. Мне не разрешили изменить IP-адрес виртуальных машин. Я создал отдельную VLAN, в которой развернул виртуальные машины и вставил брандмауэр vShield Edge в качестве маршрутизатора NAT. Таким образом, машины в тестовой среде все еще могли получить доступ к этим серверам. И их большой сканер для лечения рака (стоимость которого превышает миллион евро), конечно же, нельзя было скопировать, поэтому я поставил перед ним дополнительный NAT-маршрутизатор. В зависимости от сценария он будет направлен на производство или тестирование. - person Gabrie; 19.08.2013

Наконец-то я нашел эту страницу: http://www.vmdev.info/?p=202 Я начал с примера, который они показывают, и он сработал, поэтому я продолжал добавлять поля CloneSpec, пока не получил то, что хотел:

    $nicMaparray = @()
    $FirstNic = New-Object VMware.Vim.CustomizationAdapterMapping
        $FirstNic.adapter = New-Object VMware.Vim.CustomizationIPSettings
            $FirstNic.adapter.dnsDomain = $domain
            $FirstNic.adapter.dnsServerList = "10.26.40.115","10.26.40.116"
            $FirstNic.adapter.gateway = $DefGW
            $FirstNic.adapter.ip = New-Object Vmware.Vim.CustomizationFixedIp
                $FirstNic.adapter.ip.IpAddress = $NewIP
            $FirstNic.adapter.subnetMask = "255.255.248.0"
    $nicMaparray += $FirstNic

    $folderobj = $origvm.parent
    $vm = Get-VM $sourceName | Get-View
    $cloneName = $targetName
    $cloneFolder = Convert-PathToFolderObject -FolderPath $folderpath
    $cloneSpec = new-object Vmware.Vim.VirtualMachineCloneSpec
    $cloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec
    $cloneSpec.Location.Host = (Random(Get-VMHost | Where {$_.Name -like "*esxiqa*"}) | get-view).MoRef
    $targetDatastore = ($MapInfo | Where-Object {$_.Name -eq "Hard disk 1"}).NewDataStore
    $cloneSpec.Location.Datastore = (Get-Datastore $targetDatastore | get-view).MoRef
        $cloneSpec.customization = New-Object VMware.Vim.CustomizationSpec
            $cloneSpec.customization.globalIPSettings = New-Object VMware.Vim.CustomizationGlobalIPSettings
                $cloneSpec.customization.globalIPSettings.dnsServerList = "10.26.40.115","10.26.40.116"
            $cloneSpec.customization.identity = New-Object VMware.Vim.CustomizationSysprep
#           $spec.customization.identity.guiRunOnce = New-Object VMware.Vim.CustomizationGuiRunOnce
            $cloneSpec.customization.identity.guiUnattended = New-Object VMware.Vim.CustomizationGuiUnattended
                $cloneSpec.customization.identity.guiUnattended.autoLogonCount = 0
                $cloneSpec.customization.identity.guiUnattended.password = New-Object VMware.Vim.CustomizationPassword
                    $cloneSpec.customization.identity.guiUnattended.password.plainText = $true
                    $cloneSpec.customization.identity.guiUnattended.password.value = Get-Password -Username "Administrator"
            $cloneSpec.customization.identity.identification = New-Object VMware.Vim.CustomizationIdentification
                $cloneSpec.customization.identity.identification.joinWorkgroup = "WORKGROUP"
#           $spec.customization.identity.licenseFilePrintData = $null
            $cloneSpec.customization.identity.userData = New-Object VMware.Vim.CustomizationUserData
                $cloneSpec.customization.identity.userData.computerName = New-Object VMware.Vim.CustomizationFixedName
                    $cloneSpec.customization.identity.userData.computerName.name = $cloneName
                $cloneSpec.customization.identity.userData.productID = $ProductKey
            $cloneSpec.customization.nicSettingMap = $nicMaparray
                #nicMaparray build above
#           $cloneSpec.customization.options = $null
    $cloneSpec.powerOn = $true

    Get-HardDisk -VM $sourceName | %{
        $disk = New-Object VMware.Vim.VirtualMachineRelocateSpecDiskLocator
        $disk.diskId = $_.ExtensionData.Key #2001,2002,2003,...
        $DiskLabel = $_.ExtensionData.DeviceInfo.Label
        $dsname = ($MapInfo | Where-Object {$_.Name -eq $DiskLabel}).NewDataStore
        $ds = Get-Datastore -Name $dsname
        $disk.datastore = $ds.id
        $cloneSpec.Location.Disk += $disk
    }

    Write-Verbose "Cloning $sourceName"
    try
    {
        $vm.CloneVM( $cloneFolder, $cloneName, $cloneSpec)
        return $true
    }
    catch
    {
        $_.Exception
        return $false
    }
person Arluin    schedule 30.10.2013