У меня проблема с созданием нескольких виртуальных машин VMWARE из шаблона в одном VIServer. В следующем коде, когда в сценарии дросселя помещается что-либо больше 1, выполняется только одна виртуальная машина и не создается никакая другая (параллельно), похоже, проблема с сохранением сеанса, скорее всего, просто сбросить его или изменить в $ global: DefaultVIServer .
Код ниже основан на вопросе в этой ветке: ">Поток не создает несколько виртуальных машин (проблема сеанса) Ответ заключается в том, чтобы поддерживать один и тот же сеанс все время, но я не смог заставить это работать
Я также предполагаю, что этот пост был о той же проблеме, что и у меня: https://communities.vmware.com/thread/463060?start=0&tstart=0
Интересно, есть ли у кого-нибудь рабочее решение по использованию пространства выполнения в powershell для создания нескольких виртуальных машин в vmware?
cls
Add-PSSnapin VMware.VimAutomation.Core | Out-Null
#import csv
$VMs = Import-CSV 'filename.csv' -UseCulture
#connections array
$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 = @()
#this contains all connected vSphere endpoints
$global:DefaultVIServer
$User = "domain\username"
$PWord = ConvertTo-SecureString -String "password" -AsPlainText -Force
$Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $User, $PWord
# SctiptBlock to execute for each job
$ScriptBlock = {
Param ($VM, $ses)
Add-PSSnapin VMware.VimAutomation.Core | Out-Null
Write-Host $VM.Name "Father session: " $ses.SessionSecret
Connect-VIServer $VM.VIServer -Session $ses.SessionSecret -wa 0
Write-Host $VM.Name "Child session: " $sessionf.SessionId
New-VM -Name $VM.Name -ResourcePool "..." -Location "Windows Servers" -Datastore "..." -DiskStorageFormat "..." -Notes "..." -Template "..."
}
# Starting script
Write-Host ("Starting script: {0}" -f (Get-Date))
$startTime = Get-Date
$count = 0
ForEach($VM in $VMs)
{
$count = $count + 1
Write-Host "Current connections:"
$Global:DefaultVIServers.count
$ses = Connect-VIServer $VM.VIServer -Credential $Credential -wa 0
$Job = [powershell]::create()
$Job.RunspacePool = $RunspacePool
$Job.AddScript($ScriptBlock).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() | Out-Null
}
}
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"