2013-08-16 4 views
0

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

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

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

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

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

Настройка OSCustomizationSpec для Нью-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.

ответ

0

Я наконец-то нашел эту страницу: 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 
    } 
0

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

+0

Спасибо за комментарий. К сожалению нет я не могу сделать изолированную среду, из-за проблем с лицензированием и размером некоторые из моих серверов являются единичным экземпляром, а те, которые я клонирую, должны иметь возможность маршрутизировать в одни и те же экземпляры. – Arluin

+0

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

+0

Если вам нужно больше информации e-mail me (thegabeman at gmail) – Gabrie