Создать группу ресурсов и развернуть ресурс - PullRequest
0 голосов
/ 22 февраля 2019

Согласно Документации Microsoft , теперь можно создавать группы ресурсов и развертывать ресурсы во вновь созданной группе ресурсов.Есть небольшая загвоздка, хотя, в самом начале, у нас есть этот отказ от ответственности -

Развертывание на уровне подписки отличается от развертывания группы ресурсов в следующих аспектах:

Схема и команды

Схема и команды, которые вы используете для развертываний на уровне подписки, отличаются от развертываний группы ресурсов.

Для схемы используйте https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#

Это приводит к значительномупроблема, azuredeploy.json больше не распознается как шаблон развертывания, поскольку он не использует схему развертывания ресурса (https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#).

Таким образом, другой вариант заключался в созданииГруппа ресурсов как Вложенный шаблон и добавление зависит от для дочерних ресурсов, которые будут созданы, теперь это позволило мне развернуть / проверить файл. ОднакоЭто связано с новой проблемой. Несмотря на то, что зависящий от диктует, что группа ресурсов создана, он все равно не может распознать это и возвращается с ошибкой - rГруппа ресурсов не найдена, поэтому ресурсы не могут быть развернуты.Я пытался использовать связанный шаблон (я знаю, что это не имеет никакого значения, но все же)

Кто-нибудь, удалось сделать это случайно?

  • Созданные группы ресурсов и развернутые ресурсы одновременно.
  • Преодолеть препятствие при попытке использовать DependsOn и все еще не получить правильное развертывание или проверку?

Добавление моего кода.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "North Europe"
    },
    "FirstResourceGroupName": {
      "type": "string",
      "defaultValue": "myFirstRG"
    },
    "FirstBlobStorageName": {
      "type": "string",
      "defaultValue": "North Europe"
    }
  },
  "variables": {
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2018-05-01",
      "name": "ResourceGroupDeployment",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
          "contentVersion": "1.0.0.1",
          "resources": [
            {
              "type": "Microsoft.Resources/resourceGroups",
              "apiVersion": "2018-05-01",
              "location": "[parameters('location')]",
              "name": "[parameters('FirstResourceGroupName')]",
              "properties": {}
            }
          ],
          "outputs" : {}
        }
      }
    },
    {
      //ResourceDeployment
      "type": "Microsoft.Resources/deployments",
      "name": "StorageDeployment",
      "apiVersion": "2017-05-10",
      "dependsOn": [
        "[concat('Microsoft.Resources/deployments/', 'ResourceGroupDeployment')]"
        //"ResourceGroupDeployment"
      ],
      "resourceGroup": "[parameters('FirstResourceGroupName')]",
      "properties": {
        "mode": "Incremental",
        "template": {
            "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
            "contentVersion": "1.0.0.0",
            "parameters": {},
            "variables": {},
            "resources": [
                {
                    "type": "Microsoft.Storage/storageAccounts",
                    "apiVersion": "2017-10-01",
                    "name": "[parameters('FirstBlobStorageName')]",
                    "location": "[parameters('location')]",
                    "kind": "StorageV2",
                    "sku": {
                        "name": "Standard_LRS"
                    }
                }
            ],
            "outputs": {}
        }
      }
    } 
  ],
  "outputs": {}
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Решение, предлагаемое 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, прежде чем он пройдет проверку.

0 голосов
/ 22 февраля 2019

Пример взят из официальной документации:

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.1",
    "parameters": {
        "rgName": {
            "type": "string"
        },
        "rgLocation": {
            "type": "string"
        },
        "storagePrefix": {
            "type": "string",
            "maxLength": 11
        }
    },
    "variables": {
        "storageName": "[concat(parameters('storagePrefix'), uniqueString(subscription().id, parameters('rgName')))]"
    },
    "resources": [
        {
            "type": "Microsoft.Resources/resourceGroups",
            "apiVersion": "2018-05-01",
            "location": "[parameters('rgLocation')]",
            "name": "[parameters('rgName')]",
            "properties": {}
        },
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2018-05-01",
            "name": "storageDeployment",
            "resourceGroup": "[parameters('rgName')]",
            "dependsOn": [
                "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
            ],
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "type": "Microsoft.Storage/storageAccounts",
                            "apiVersion": "2017-10-01",
                            "name": "[variables('storageName')]",
                            "location": "[parameters('rgLocation')]",
                            "kind": "StorageV2",
                            "sku": {
                                "name": "Standard_LRS"
                            }
                        }
                    ]
                }
            }
        }
    ]
}

делает именно то, что вам нужно.

https://docs.microsoft.com/en-us/azure/azure-resource-manager/deploy-to-subscription#create-resource-group-and-deploy-resources

...