2016-02-29 45 views
0

数据从* .csv文件拍摄。脚本应该在我的测试用例中创建2个虚拟机,但是在不同的线程中。需要指导如何解决这个问题。线程没有创建多个虚拟机(会话问题)

cls 

Add-PSSnapin VMware.VimAutomation.Core | Out-Null 

#import VM settings 
$VMs = Import-CSV '...\Data.csv' -UseCulture 

#array for connections 
$server = @() 
#threads 
$Throttle = 2 

# Create session state 
$sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() 

# Create runspace pool consisting of runspaces 
$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $Throttle, $sessionState, $Host) 
$RunspacePool.Open() 

#array for jobs 
$Jobs = @() 
$global:DefaultVIServer 



$ScriptBlocky = { 
    Param ($VM, $ses) 

    Add-PSSnapin VMware.VimAutomation.Core | Out-Null 
    Write-Host $VM.vm_name "Father session: " $ses.SessionSecret 

    $sessionf = Connect-VIServer $VM.vs_xstream__vc_host -Session $ses.SessionSecret -wa 0 
    Write-Host $VM.vm_name "Child session: " $sessionf.SessionId 


    $domain_name = $VM.FQDN.split('.') 
    Write-Host $domain_name 
    #Random for testing purposes 
    $OSspec = ("BasicLinuxSpec_rand{0}" -f (Get-Random)) 
    # Create new OS Customization Specification template for further usage 
    New-OSCustomizationSpec –Name $OSspec –Domain ("{0}.{1}" -f $domain_name[1],$domain_name[2]) –DnsServer $VM.DNS,$VM.DNS2 –NamingScheme VM –OSType Linux 

    Get-OSCustomizationSpec $OSspec -Server $VM.vs_xstream__vc_host | Get-OSCustomizationNicMapping | Set-OSCustomizationNicMapping -IpMode UseStaticIp -IpAddress $VM.Ipaddress -SubnetMask $VM.NetMask -DefaultGateway $VM.Gateway 

    Write-Host $VM.vm_name "OSspec: "$OSspec 

    Write-Host $VM.vm_name "Cluster: "$VM.Cluster 
    Write-Host $VM.vm_name "Host: "$VM.vs_xstream__vc_host 
    # Selecting random Cluster for VMs deployment 
    $ClusterHost = Get-Cluster $VM.Cluster -server $VM.vs_xstream__vc_host | Get-VMHost | Get-Random 
    Write-Host "=================" 
    Write-Host $VM.vm_name "ClusterHost " $ClusterHost 
    Write-Host "=================" 

    New-Vm -VMhost $ClusterHost -Name $VM.vm_name -Server $VM.vs_xstream__vc_host -Datastore $VM.Datastore -Template $VM.Template -Description $VM.Description -DiskStorageFormat "Thin" -OScustomizationSpec $OSspec 

    Remove-OSCustomizationSpec $OSspec -Server $VM.vs_xstream__vc_host -confirm:$false 


} 

Write-Host ("Starting script: {0}" -f (Get-Date)) 
$startTime = Get-Date 

$count = 0 
ForEach($VM in $VMs) 
{ 
    $count = $count + 1 

    Write-Host $VM.vs_xstream__vc_host 

    Write-Host "Current connections:" 
    $Global:DefaultVIServers.count 

    $ses = Connect-VIServer $VM.vs_xstream__vc_host -User $VM.vs_xstream__vc_admin -Password $VM.vs_xstream__vc_password -wa 0 

    $Job = [powershell]::create() 
    $Job.RunspacePool = $RunspacePool 
    $Job.AddScript($ScriptBlocky).AddParameter("VM", $VM).AddParameter("ses", $ses) 

    Write-Host "Adding job to jobs list" 
    $Jobs += New-Object PSObject -Property @{ 
     RunNum = $count 
     Job = $Job 
     Result = $Job.BeginInvoke() 
     } 

    #Disconnect-VIServer $VM.vs_xstream__vc_host -Confirm:$false -Force 
} 


Write-Host "Waiting.." -NoNewline 
Do { 
    Write-Host "." -NoNewline 
    Start-Sleep -Seconds 1 
} While ($Jobs.Result.IsCompleted -contains $false) 

$endTime = Get-Date 
$totalSeconds = "{0:N4}" -f ($endTime-$startTime).TotalSeconds 
Write-Host "All jobs finished in $totalSeconds seconds" 

结果:

Name       Port User       
----       ---- ----       
10.xxx.xx.10     443 VSPHERE.LOCAL\do1xstream  
Starting script: 2/29/2016 2:48:20 PM 
10.xxx.xx.10 
Current connections: 
1 

Adding job to jobs list 
10.xxx.xx.10 
Current connections: 
1 
The specified mount name 'vmstores' is already in use. 
The specified mount name 'vis' is already in use. 
virtual38 Father session:  f8bafd42e6b7c85aa313e2896eba11c0f9f876cf 

Adding job to jobs list 
virtual38 Child session:  f8bafd42e6b7c85aa313e2896eba11c0f9f876cf 
virtual38 domain com 
Waiting...virtual39 Father session:  f8bafd42e6b7c85aa313e2896eba11c0f9f876cf 
virtual39 Child session:  
virtual39 domain com 
virtual39 OSspec:  BasicLinuxSpec_rand618798101 
virtual39 Cluster:  do1mgmt 
virtual39 Host:  10.xxx.xx.10 
================= 
virtual39 ClusterHost  
================= 
virtual38 OSspec:  BasicLinuxSpec_rand581276505 
virtual38 Cluster:  do1mgmt 
virtual38 Host:  10.xxx.xx.10 
.================= 
virtual38 ClusterHost  10.xxx.xx.2 
================= 
.............. 

作为结果表明因为virtual38是第一线具有会话信息,并且可以执行动作。

也许我错了,这个我觉得会议isssue是防止产生第二VM(virtual39)

更新/通知:我意识到,当线程$油门= 1,则这两个VM创建,当我设置$ Throttle = 2或更多,那么只有其中一个(第一个)被创建。

有什么建议吗?

回答

1

相信我,或没有,但我发现什么是错误的。脚本正在工作,但是当连接到新会话或现有的会话(甚至是不同的vCenter,需要在多个vCenter环境中创建虚拟机时),DefaultVIServers变量会被修改,会话将会丢失。

解决方案: *创建所有其他行动之前,所有连接到vCenter的连接,以便将保持稳定。例如:所有的工作已经完成

# Iterate and connect to all vCenters so connections to them will be stable and read only 
ForEach($VM in $VMs) 
{ 
    If ($VM.Use -eq 1) 
    { 
     If($server.Contains($VM.vs_xstream__vc_host) -eq $FALSE) 
     { 
     $server += $VM.vs_xstream__vc_host 
     $AllSessions += Connect-VIServer $VM.vs_xstream__vc_host -User $VM.vs_xstream__vc_admin -Password $VM.vs_xstream__vc_password -NotDefault 
     Write-Host "Connected to: " $VM.vs_xstream__vc_host 
     } 
    } 
} 

后,我简单地从所有会话

# Disconnect all created sessions 
ForEach($item in $server) 
{ 
    Write-Host ("Disconnecting from {0}...." -f ($item)) 
    Disconnect-VIServer $item -Confirm:$false 
} 

断开现在脚本完美的作品,并在不同或相同的vCenter创建VM。如果有人会遇到任何问题,请告诉我。