Как запустить один и тот же скрипт несколько раз в шаблоне ARM?

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

Я хочу использовать функцию "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'))]"
            }
          }
        }
      ]

ИЗМЕНИТЬ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.


person Mark Allison    schedule 02.07.2018    source источник


Ответы (2)


Я считаю, что то, что вы ищете, находится здесь: 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" здесь устанавливает имя цикла копирования и счетчик, который он будет перебирать. В приведенной выше ссылке также есть примеры того, как это можно сделать.

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

Привет, Лачи

person Lachie White    schedule 03.07.2018
comment
Спасибо, я посмотрел ссылку, которую вы отправили, и, похоже, мне нужно переместить дочерний ресурс на тот же уровень, что и родительский. Однако он все еще не работает, см. EDIT1. Большое спасибо! - person Mark Allison; 03.07.2018
comment
для этой ошибки посмотрите: stackoverflow.com/questions / 26766882 / У меня была аналогичная ошибка, и этот ответ уже позаботился об этом ранее - person Lachie White; 03.07.2018
comment
вы пытаетесь построить 10 виртуальных машин, на которых работают 10 агентов или 10 агентов vsts на одной виртуальной машине? @MarkAllison - person Lachie White; 03.07.2018
comment
Я перечитал ваш вопрос и полагаю, что вы хотите иметь 10 агентов на одной машине. тогда это можно сделать в JSON, но это будет беспорядочно. вам было бы намного лучше отредактировать скрипт installvstsagent.ps1 - person Lachie White; 03.07.2018
comment
Я хочу установить несколько агентов на одну виртуальную машину. Я посмотрю на редактирование скрипта. Благодарю. - person Mark Allison; 03.07.2018
comment
для сценария Powershell создайте параметр count и используйте его для создания списка из 10 имен агентов, затем переберите каждое имя агента (параллельно, если хотите) - person Lachie White; 03.07.2018
comment
Лачи только что нашел это lol github.com/Azure / azure-quickstart-templates / tree / master / - person Mark Allison; 03.07.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person Lachie White; 03.07.2018

Мне удалось использовать этот сценарий для установки нескольких агентов на серверах:

Get-ExecutionPolicy

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser

for($i=0; $i -le 9;  $i++)
{
    $suffix=$i.ToString('00')
    $folder="vsts-agent-win-x64-2.144.2-$suffix"
    $agent="myagent-$suffix"

    "$PSScriptRoot\$folder"
    #note: folder needs to be copied for each instance
    #'vsts-agent-win-x64-2.144.2' is the folder after downloading and unzipping agent -manually.
    Copy-Item "$PSScriptRoot\vsts-agent-win-x64-2.144.2" "$PSScriptRoot\$folder" -Recurse

    cd $PSScriptRoot\$folder
 #.\config.cmd --unattended --url https://myaccount.visualstudio.com --auth pat --token myToken --pool 
#default --agent myAgent --runAsAutoLogon --windowsLogonAccount myDomain\myUserName 
#--windowsLogonPassword myPassword
    Write-Host "vsts-agent-win-x64-2.144.2-$suffix"

     .\config.cmd    --unattended `
                    --url "https://devops.my.org/org/" ` #(url of tfs)
                    --auth "pat" `
                    --token "u7s2mbna5v7heqzyfmz5ufrnvlektessebs7flfaf2ll4efzuj7q" `  (tfs token)
                    --pool "foiaModernization" `
                    --agent $agent `
                    --replace `
                    --acceptTeeEula `
                    --runAsService `
                    --windowsLogonAccount "xxx\yyy" `  #not sure if these lines are needed
                    --windowsLogonPassword "JJJJJlllll!!11" #not sure if these lines are 

}

person jlo-gmail    schedule 23.10.2019