Развертывание нескольких шаблонов ARM параллельно с PowerShell
Я создал проект Resource Manager в Visual Studio 2017 и в результате получил Deploy-AzureResourceGroup.ps1
который развертывает шаблон в Azure. Но у меня есть несколько шаблонов, и я хотел бы иметь возможность развертывать их параллельно с PowerShell. Мой текущий подход перебирает каждый шаблон и разворачивает их последовательно, что занимает много времени.
Как я могу этого достичь?
Изменить: принимая во внимание ответ от @4c74356b41. Мне нужно выполнить еще немного логики как часть работы. Поэтому недостаточно просто выполнить ResourceGroupDeployment параллельно.
2 ответа
Решение
- Прежде всего, получите все соответствующие шаблоны, например, через
$armTemplateFiles = Get-ChildItem -Path $PSScriptRoot -Include *.JobTemplate.json -Recurse;
- Теперь выполните итерацию по каждому файлу шаблона и создайте задание для каждого (эти задания затем выполняются параллельно)
Код:
foreach ($armTemplateFile in $armTemplateFiles) {
$logic = {
Param(
[object]
[Parameter(Mandatory=$true)]
$ctx,
[object]
[Parameter(Mandatory=$true)]
$armTemplateFile,
[string]
[Parameter(Mandatory=$true)]
$resourceGroupName
)
function Format-ValidationOutput {
param ($ValidationOutput, [int] $Depth = 0)
Set-StrictMode -Off
return @($ValidationOutput | Where-Object { $_ -ne $null } | ForEach-Object { @(' ' * $Depth + ': ' + $_.Message) + @(Format-ValidationOutput @($_.Details) ($Depth + 1)) })
}
# Get related parameters file
$paramTemplateFile = Get-ChildItem -Path $armTemplateFile.FullName.Replace("JobTemplate.json", "JobTemplate.parameters.json")
# Test Deployment
$ErrorMessages = Format-ValidationOutput (Test-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName `
-TemplateFile $armTemplateFile.FullName `
-TemplateParameterFile $paramTemplateFile.FullName `
-DefaultProfile $ctx)
if ($ErrorMessages) {
Write-Host '', 'Validation returned the following errors:', @($ErrorMessages), '', 'Template is invalid.'
}
else { # Deploy
New-AzureRmResourceGroupDeployment -Name (($armTemplateFile.Name).Split(".")[0] + ((Get-Date).ToUniversalTime()).ToString('MMddHHmm')) `
-ResourceGroupName $resourceGroupName `
-TemplateFile $armTemplateFile.FullName `
-TemplateParameterFile $paramTemplateFile.FullName `
-Force `
-ErrorVariable ErrorMessages `
-DefaultProfile $ctx
if ($ErrorMessages) {
Write-Host '', 'Template deployment returned the following errors:', @(@($ErrorMessages) | ForEach-Object { $_.Exception.Message.TrimEnd("`r`n") })
}
}
}
Start-Job $logic -ArgumentList (Get-AzureRmContext), $armTemplateFile, $ResourceGroupName
}
While (Get-Job -State "Running")
{
Start-Sleep 10
Write-Host "Jobs still running..."
}
Get-Job | Receive-Job
Чрезвычайно плохое решение, много сложностей.
New-AzureRmResourceGroupDeployment -ResourceGroup xxx -TemplateFile xxx -AsJob
и вам нужна петля поверх этого