Шаблон Azure ARM — использование виртуальных машин/расширений с CopyIndex

Мне удалось развернуть этот скрипт без каких-либо проблем, но я пытаюсь подготовить виртуальные машины с помощью сценария bash, используя файл virtualMachines/extensions. Есть ли у вас какие-либо предложения по использованию copyIndex в этом разделе? Я пытался несколькими способами, но мне не повезло, и скрипт не развертывается с синтаксическими ошибками. Это скрипт, который я пытаюсь перепрофилировать: https://github.com/Azure/azure-quickstart-templates/tree/master/201-vm-copy-index-loops. Любая помощь приветствуется. Спасибо.

Это код, который я использовал, но без copyIndex. Сценарий должен передавать параметры каждой виртуальной машине.

{
"type": "Microsoft.Compute/virtualMachines/extensions",
"name": "[concat(parameters('MetaPortName'),'/newuserscript')]",
"apiVersion": "2020-06-01",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Compute/virtualMachines/', parameters('MetaPortName'))]"
],
"properties": {
"publisher": "Microsoft.Azure.Extensions",
"type": "CustomScript",
"typeHandlerVersion": "2.0",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": ["https://raw.githubusercontent.com/willguibr/azure/main/MetaPort-Standalone-NATGW-v1.0/install_metaport.sh"]
},
"protectedSettings": {
"commandToExecute": "[concat('sh install_metaport.sh ', parameters('MP1TokenCode'), parameters('MP2TokenCode'))]"
}
}
}

person Security Geek IO    schedule 22.10.2020    source источник
comment
Не могли бы вы подробно описать вашу проблему? Вы хотите установить расширение на несколько виртуальных машин?   -  person Jim Xu    schedule 22.10.2020


Ответы (2)


@Stringfellow, спасибо за ваш ответ ранее. Действительно полезно. После того, как я опубликовал это, я частично заработал, используя приведенный ниже код. Сценарий bash должен предоставлять два различных параметра (по одному для каждой виртуальной машины), так как это уникальные коды токенов, которые нельзя запускать дважды (OTAP). На самом деле сценарий успешно работает на первой виртуальной машине, но он запускает оба параметра в той же ВМ, а не во второй ВМ. Например: (MP1TokenCode) должен работать на VM1, а (MP2TokenCode) должен работать на VM2. Оба токена предоставляются пользователем в качестве параметров. Мне также пришлось добавить несколько разделителей строк, потому что в противном случае шаблон объединял бы оба токена вместе и ломал все. Итак, теперь у меня есть следующее, но, как я уже упоминал, он дважды запускает скрипт на одной и той же виртуальной машине и не работает на второй. На самом деле выполнение скрипта на второй ВМ не выполняется.

            {
        "type": "Microsoft.Compute/virtualMachines",
        "name": "[concat('metaport-', copyIndex())]",
        "apiVersion": "2020-06-01",
        "location": "[parameters('location')]",
        "copy": {
            "name": "virtualMachineLoop",
            "count": "[parameters('numberOfInstances')]"
        },
        "dependsOn": [
            "nicLoop"
        ],
        "properties": {
            "availabilitySet": {
                "id": "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]"
            },
            "hardwareProfile": {
                "vmSize": "[parameters('vmSize')]"
            },
            "osProfile": {
                "computerName": "[concat('vm', copyIndex())]",
                "adminUsername": "[parameters('adminUsername')]",
                "adminPassword": "[parameters('adminPasswordOrKey')]",
                "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
            },
            "storageProfile": {
                "imageReference": "[variables('imageReference')[parameters('OS')]]",
                "osDisk": {
                    "createOption": "FromImage"
                }
            },
            "networkProfile": {
                "networkInterfaces": [
                    {
                        "id": "[resourceId('Microsoft.Network/networkInterfaces',concat('nic', copyindex()))]"
                    }
                ]
            }
        }
    },
{
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "name": "[concat('metaport', copyIndex(), '/newuserscript')]",
    "apiVersion": "2020-06-01",
    "location": "[parameters('location')]",
    "copy": {
        "name": "metaport",
        "count": "[parameters('numberOfInstances')]"
        },
    "dependsOn":[
        "virtualMachineLoop"
    ],
    "properties": {
        "publisher": "Microsoft.Azure.Extensions",
        "type": "CustomScript",
        "typeHandlerVersion": "2.0",
        "autoUpgradeMinorVersion": true,
        "settings": {
        "fileUris": ["https://raw.githubusercontent.com/willguibr/azure/main/MetaPort-Dual-AvailabilitySet-v2.0/install_metaport.sh"]
        },
        "protectedSettings": {
        "commandToExecute": "[concat('sh install_metaport.sh ', parameters('MP1TokenCode'), ' ', parameters('MP2TokenCode'), ' ')]"
    }
  }

Я также попытался разбить скрипт на две части и создать два раздела виртуальных машин/расширений, но безуспешно. Сценарий терпит неудачу в обоих исполнениях. Явно не самый оптимальный способ, так как хочется избежать повторения кода. Другими словами, единственное, что мне нужно сейчас, это способ убедиться, что каждый параметр отправляется каждой виртуальной машине отдельно, MP1TokenCode должен быть отправлен на VM1, а MP2TokenCode должен быть отправлен на VM2.

person Security Geek IO    schedule 23.10.2020

Что-то вроде следующего было бы моим подходом. Передайте параметр MetaPortNameArray в виде массива имен виртуальных машин. Я сделал предположения о параметрах кода токена, например о том, что код токена одинаков для каждой виртуальной машины. Если они должны быть уникальными для каждой виртуальной машины, они должны быть частью массива, например массива объектов, а не строк, представляющих имена виртуальных машин.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "MetaPortNameArray": {
      "type": "array"
    },
    "location": {
      "type": "string"
    },
    "MP1TokenCode": {
      "type": "securestring"
    },
    "MP2TokenCode": {
      "type": "securestring"
    }
  },
  "variables": {
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines/extensions",
      "name": "[concat(parameters('MetaPortNameArray')[copyIndex()],'/newuserscript')]",
      "apiVersion": "2020-06-01",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Compute/virtualMachines/', parameters('MetaPortNameArray')[copyIndex()])]"
      ],
      "copy": {
        "name": "vmExtCopy",
        "count": "[length(parameters('MetaPortNameArray'))]"
      },
      "properties": {
        "publisher": "Microsoft.Azure.Extensions",
        "type": "CustomScript",
        "typeHandlerVersion": "2.0",
        "autoUpgradeMinorVersion": true,
        "settings": {
          "fileUris": [ "https://raw.githubusercontent.com/willguibr/azure/main/MetaPort-Standalone-NATGW-v1.0/install_metaport.sh" ]
        },
        "protectedSettings": {
          "commandToExecute": "[concat('sh install_metaport.sh ', parameters('MP1TokenCode'), parameters('MP2TokenCode'))]"
        }
      }
    }
  ],
  "outputs": {}
}

Обновление 1

Основываясь на почти повторяющемся заданном вопросе, я вижу, что вы ищете уникальные токены для каждой виртуальной машины. Ниже приведен подход, который следует использовать с использованием массива объектов.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "MetaPortNameArray": {
      "type": "array"
    },
    "location": {
      "type": "string"
    }
  },
  "variables": {
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines/extensions",
      "name": "[concat(parameters('MetaPortNameArray')[copyIndex()].VmName,'/newuserscript')]",
      "apiVersion": "2020-06-01",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Compute/virtualMachines/', parameters('MetaPortNameArray')[copyIndex()].VmName)]"
      ],
      "copy": {
        "name": "vmExtCopy",
        "count": "[length(parameters('MetaPortNameArray'))]"
      },
      "properties": {
        "publisher": "Microsoft.Azure.Extensions",
        "type": "CustomScript",
        "typeHandlerVersion": "2.0",
        "autoUpgradeMinorVersion": true,
        "settings": {
          "fileUris": [ "https://raw.githubusercontent.com/willguibr/azure/main/MetaPort-Standalone-NATGW-v1.0/install_metaport.sh" ]
        },
        "protectedSettings": {
          "commandToExecute": "[concat('sh install_metaport.sh ', parameters('MetaPortNameArray')[copyIndex()].MPTokenCode)]"
        }
      }
    }
  ],
  "outputs": {}
}

Представление PowerShell переданного массива объектов будет выглядеть так.

$MetaPortNameArray = @(
    @{
        'VmName'      = 'OneMachine'
        'MPTokenCode' = 'SomeTokenCodeOne'
    },
    @{
        'VmName'      = 'TwoMachine'
        'MPTokenCode' = 'AnotherTokenCodeTwo'
    }
)
person Stringfellow    schedule 23.10.2020
comment
@Security Geek IO -- Если мой ответ помог, пожалуйста, примите ответ. :) - person Stringfellow; 23.10.2020