Решение, предлагаемое MS, хорошо, когда вы не используете Visual Studio или Portal для развертывания.Моя основная проблема заключалась в проверке шаблона, который снова не будет работать для развертывания на уровне подписки, поскольку он использует схему, которая не распознается как ARM.
Это может работать как @ 4c74356b41, предложенный любым другим способом, например cli \ sdks \ rest api, но я не пошел по этому пути.
Другое решение, которое у меня было, состояло в том, чтобы запустить скрипт powershell, добавив шаг в конвейер DevOps Azure.Который был ближе всего к этой работе, но опять же проверка того, будет ли мое развертывание успешной, все еще была в воздухе.Я не хотел, чтобы мой конвейер выпуска не работал из-за неверного шаблона.
Вот то, что я собрал, причина, по которой проверка завершилась неудачно (даже с развертыванием RG и использованием зависящего от ), заключалась в том, что группы ресурсов не будут созданы, пока вы не развернете шаблон,Развертывание шаблона не произойдет, если оно не пройдет проверку, поскольку группы ресурсов не существуют.Итак, мы застряли в петле.Два варианта: либо создать их вручную на портале перед проверкой (это не поддается автоматизации), либо использовать простой шаг powershell перед их проверкой.Последний - то, с чем я пошел.Я знаю, что это неортодоксально, но работает .... и также проверяет мой шаблон.
ПРИМЕЧАНИЕ - Решение отличается от исходной проблемы, поскольку я использовал создание нескольких групп ресурсов.Согласно документации MS, таким способом можно развернуть до 5 RG.
Сначала , создайте файл группы ресурсов, в котором будут храниться группы ресурсов, которые вы хотите создать.Это будет простой файл JSON, например,
{
"rgNames":
{
"rg1": { "rg": "resource-group-main" },
"rg2": { "rg": "resource-group-backup" }
}
}
Используйте те же значения, которые вы добавили в этот файл в качестве параметра, чтобы их можно было использовать для развертывания ресурсов.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"ResourceGroups": {
"type": "object",
//If you are changing this value !!!! Please make sure you are also updating the same in the ResourceGroups.ARM.json !!!!
"allowedValues": [
{
"rgNames":
{
"rg1": { "rg": "resource-group-main" },
"rg2": { "rg": "resource-group-backup" }
}
}
]
}
}
Второй , измените скрипт PS, включив в него код, в котором он будет перебирать список групп ресурсов, которые ему необходимо развернуть.
# Set '$RGTemplateFile' parameter to be the name of the file you added to your project
$rgFile = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, $RGTemplateFile))
$rgString = Get-Content -Raw -Path $rgFile | ConvertFrom-Json
# helper to turn PSCustomObject into a list of key/value pairs
function Get-ObjectMembers {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True, ValueFromPipeline=$True)]
[PSCustomObject]$obj
)
$obj | Get-Member -MemberType NoteProperty | ForEach-Object {
$key = $_.Name
[PSCustomObject]@{Key = $key; Value = $obj."$key"}
}
}
$rgValues = $jsonParam | Get-ObjectMembers | foreach {
$_.Value | Get-ObjectMembers | foreach {
[PSCustomObject]@{
RGName = $_.value.rgNames | select -First 1
}
}
}
foreach ($values in $rgValues)
{
New-AzureRmResourceGroup -Name $values.RGName -Location $ResourceGroupLocation -Verbose -Force
}
добавить приведенный выше код непосредственно перед проверкой -
if ($ValidateOnly) {
$ErrorMessages = Format-ValidationOutput (Test-AzureRmResourceGroupDeployment -ResourceGroupName $ResourceGroupName `
-TemplateFile $TemplateFile `
-TemplateParameterFile $TemplateParametersFile `
@OptionalParameters)
:
Наконец , измените файл шаблона развертывания (azuredeploy.json) навыполните развертывание вложенного шаблона или связанный шаблон для развертывания ресурсов на объявленной вами RG (я использовал Linked, так как она выглядит более аккуратно)
"variables": {
"rg1Name": "[parameters('ResourceGroups')['rgNames']['rg1'].rg]",
"rg2Name": "[parameters('ResourceGroups')['rgNames']['rg2'].rg]",
"blob1Name": "[parameters('blob1')]",
"blob2Name": "[parameters('blob2')]",
"arm1": "[concat(parameters('_artifactsLocation'), 'rg1/rg1.ARM.json', parameters('_artifactsLocationSasToken'))]",
"arm2": "[concat(parameters('_artifactsLocation'), 'rg2/rg2.ARM.json', parameters('_artifactsLocationSasToken'))]"
},
"resources": [
{
//RG1 Resources Deployment
"type": "Microsoft.Resources/deployments",
"name": "RG1Resources",
"apiVersion": "2017-05-10",
"resourceGroup": "[variables('rg1Name')]",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('arm1')]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"blob1Name": {
"value": "[variables('blob1Name')]"
}
}
}
},
{
//RG2 Resources Deployment
"type": "Microsoft.Resources/deployments",
"name": "RG2Resources",
"apiVersion": "2017-05-10",
"resourceGroup": "[variables('rg2Name')]",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('arm2')]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"blobName": {
"value": "[variables('blob2Name')]"
}
}
}
}
],
"outputs": {}
}
Ваши rg1.ARM.json и rg2.ARMПохоже, файлы .json могут иметь более одного ресурса.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"blobName": {
"type": "string"
}
},
"variables": {
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[parameters('blobName')]",
"kind": "StorageV2",
"apiVersion": "2018-07-01",
"location": "[resourceGroup().location]",
"sku": {
"name": "Standard_LRS"
},
"properties": {}
}
],
"outputs": {
}
}
После настройки вы сможете проверить файл, поскольку сценарий PS создаст для вас RG, прежде чем он пройдет проверку.