代码之家  ›  专栏  ›  技术社区  ›  Mark Allison

如何在ARM模板中多次运行同一个脚本?

  •  2
  • Mark Allison  · 技术社区  · 6 年前

    我有一个PowerShell脚本,用于在ARM模板中安装VSTS生成代理。此模板基于Azure快速启动模板 here .

    我想用 "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.
    

    我的问题是,如何在 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'))]"
                }
              }
            }
          ]
    

    编辑1

    我已经更新了模板并将子资源移出,以便子资源与父资源处于同一级别。此部分现在看起来如下:

    {
      "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 回复  |  直到 6 年前
        1
  •  0
  •   Lachie White    6 年前

    我相信你要找的是这里: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple

    在哪里可以使用 copyIndex() 函数在循环中迭代以创建多个资源。

    上面的链接有很好的示例和一个干净的方法,但是对于上面的模板,如果您希望命名约定也与您的NIC等保持一致,则需要对大部分模板进行一些更改。

    像这样的事情应该有助于你前进:

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

    这个 "copy" 属性在此处设置复制循环的名称和它将迭代的计数。在上面的链接中也有一些例子说明了如何做到这一点。

    希望这有帮助!

    干杯, 拉奇