Как запустить один и тот же скрипт несколько раз в шаблоне ARM? - PullRequest
0 голосов
/ 02 июля 2018

У меня есть скрипт powershell для установки агента сборки VSTS в шаблон ARM. Этот шаблон основан на шаблонах быстрого запуска Azure здесь .

Я хочу использовать функцию "copy" для запуска сценария несколько раз, потому что я хочу установить 10 агентов при развертывании моей виртуальной машины. Когда я пытаюсь развернуть мой шаблон, я получаю эту ошибку:

Error: Code=InvalidTemplate; Message=Deployment template validation failed: 
'The template resource 'CustomScript' at line '247' column '13' is not valid. Copying nested resources is not supported.

У меня вопрос, как я могу установить 10 агентов сборки с функцией copy, чтобы у меня было vsts-agent-1, vsts-agent-2, etc?

Вот соответствующий фрагмент шаблона:

{
      "name": "[parameters('vmName')]",
      "type": "Microsoft.Compute/virtualMachines",
      "location": "[parameters('location')]",
      "apiVersion": "2017-03-30",
      "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', variables('vmNicName'))]"
      ],
      "tags": {
        "displayName": "VM01"
      },
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('vmSize')]"
        },
        "osProfile": {
          "computerName": "[parameters('vmName')]",
          "adminUsername": "[parameters('vmAdminUserName')]",
          "adminPassword": "[parameters('vmAdminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('vmImagePublisher')]",
            "offer": "[variables('vmImageOffer')]",
            "sku": "[parameters('vmVisualStudioVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "[concat(parameters('vmName'),'_OSDisk')]",
            "caching": "ReadWrite",
            "createOption": "FromImage"
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('vmNicName'))]"
            }
          ]
        }
      },
      "resources": [
        {
          "name": "CustomScript",
          "type": "extensions",
          "location": "[parameters('location')]",
          "apiVersion": "2015-05-01-preview",
          "dependsOn": [
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
          ],
          "properties": {
            "publisher": "Microsoft.Compute",
            "type": "CustomScriptExtension",
            "typeHandlerVersion": "1.4",
            "settings": {
              "fileUris": [
                "[concat(parameters('_artifactsLocation'),'/InstallVSTSAgent.ps1')]"
              ],
              "commandToExecute": "[concat('powershell.exe -ExecutionPolicy Unrestricted -Command .\\InstallVSTSAgent.ps1 -vstsAccount ', parameters('vstsAccount'), ' -personalAccessToken ', parameters('personalAccessToken'), ' -AgentName ', parameters('vstsAccount'), ' -PoolName ', parameters('poolName'), ' -runAsAutoLogon ', parameters('enableAutologon'), ' -vmAdminUserName ', parameters('vmAdminUserName'), ' -vmAdminPassword ', parameters('vmAdminPassword'))]"
            }
          }
        }
      ]

EDIT1

Я обновил шаблон и переместил дочерний ресурс, чтобы дочерний ресурс находился на том же уровне, что и родительский. Этот раздел теперь выглядит так:

{
  "name": "CustomScript",
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "location": "[parameters('location')]",
  "apiVersion": "2015-05-01-preview",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
  ],
  "copy": {
    "name": "customScriptGroup",
    "count": "[parameters('agentCount')]"
  },
  "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.4",
    "protectedSettings": {
      "fileUris": [
        "[concat(parameters('_artifactsLocation'),'/InstallVSTSAgent.ps1')]"
      ],
      "commandToExecute": "[concat('powershell.exe -ExecutionPolicy Unrestricted -Command .\\InstallVSTSAgent.ps1 -vstsAccount ', parameters('vstsAccount'), ' -personalAccessToken ', parameters('personalAccessToken'), ' -AgentName ', parameters('vstsAccount')[copyIndex(1)], ' -PoolName ', parameters('poolName'), ' -runAsAutoLogon ', parameters('enableAutologon'), ' -vmAdminUserName ', parameters('vmAdminUserName'), ' -vmAdminPassword ', parameters('vmAdminPassword'))]"
    }
  }
}

Однако, когда я пытаюсь развернуть, я получаю эту ошибку:

Error: Code=InvalidTemplate; Message=Deployment template validation failed: The template resource 'CustomScript' for type 'Microsoft.Compute/virtualMachines/extensions' at line '247' and column '9' has incorrect segment lengths. A nested resource type must have identical number of segments as its resource name. A root resource type must have segment length one greater than its resource name.

1 Ответ

0 голосов
/ 03 июля 2018

Я считаю, что то, что вы ищете, находится здесь: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple

Где вы можете использовать функцию copyIndex() для итерации в цикле для создания нескольких ресурсов.

Приведенная выше ссылка содержит хорошие примеры и простой способ сделать это, но для вашего вышеупомянутого шаблона вам нужно будет внести некоторые изменения в большинство вашего шаблона, если вы хотите, чтобы соглашение об именах также соответствовало вашим сетевым картам и тому подобному

Что-то вроде этого должно помочь вам начать:

{
   "name" : "[concat(parameters('vmName'), copyIndex())]",
   "copy": {
      "name" : "vmCopy",
      "count": 10
   }
   ...
   ...
   ...
   "osProfile" : "[concat(parameters('vmName'), copyIndex())]"
   ...
   ...
}

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

Надеюсь, это поможет!

Ура, Lachie

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...