2013-08-16 37 views
0

我正在嘗試腳本(powershell/powercli)克隆我們的QA環境(261服務器)。 基本上我想創建每個服務器的新副本,只需更改虛擬機名稱,主機名和IP地址。理想情況下,我希望域上的新克隆(其中90%是Windows操作系統)。我的許多服務器都有很多大型硬盤驅動器,這些硬盤驅動器並不都適用於一個數據存儲區,所以我必須能夠克隆到多個數據存儲區。克隆虛擬機更改網絡身份

我開始使用New-VM作爲適合於一個數據存儲的小型服務器,但OSCustomization只能在大約30%的時間內工作。剩下的時間我必須登錄到Windows並手動從域中刪除以重命名主機名。大部分時間Set-OSCustomizationNicMapping工作但是指定-Domain -DomainUsername/Password永遠不會工作(最好它重命名服務器並放入「域名」工作組,但它永遠不會將它連接到域)。

要解決multidatastore問題,我發現$ vm.ExtensionData.CloneVM使用VMWare.Vim.VirtualMachineRelocateSpec來指定哪些硬盤驅動器轉到哪個數據存儲區,並且效果很好,但我不知道如何自定義主機名或NIC設置。

所以基本要求是:克隆到多個數據存儲區,更改主機名和IP設置。有沒有人有任何建議或解決方案?

下面是我的一些代碼片段:

新-VM設置的OSCustomizationSpec

$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 

新-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),但我無法從pubs中獲得足夠的信息來了解如何構建我的$ 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。

+0

感謝您的評論。不幸的是,我不能做一個孤立的環境,因爲許可和大小問題,我的一些服務器是單個實例,我克隆的服務器必須能夠路由到相同的單個實例。 – Arluin

+0

我爲大醫院構建了這樣的東西。他們需要一個OTA環境,在這個環境中他們可以擁有生產虛擬機的精確副本。我被禁止更改虛擬機的IP地址。我構建了一個單獨的VLAN,在該VLAN中部署了VM並將vShield Edge防火牆作爲NAT路由器插入。通過這種方式,測試環境中的機器仍然可以訪問這些服務器。而他們的大型癌症治療掃描儀(價值超過一百萬歐元)當然無法複製,所以我在它前面增加了一個額外的NAT路由器。根據不同的情況,它會轉到產品或測試。 – Gabrie

+0

如果需要更多信息請發郵件給我(thegabeman at gmail) – Gabrie