Как сослаться на имя виртуальной машины VMSS в шаблоне JSON

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

"commandToExecute": "[concat('sh ap-cluster-setup.sh -h=',parameters('virtualMachineName'),' -s=',parameters('subnetAddressPrefix'),'')]"

но поскольку имя виртуальной машины в масштабируемом наборе создается динамически при развертывании, я не могу придумать способ сослаться на него в JSON. Соглашение об именовании виртуальных машин — vmssTemplate_0, vmssTemplate_1 и т. д., где vmssTemplate — параметры («virtualMachineScaleSets_name») в шаблоне VMSS.


person Tomasz Tuczapski    schedule 27.02.2017    source источник


Ответы (2)


В самом шаблоне это сделать невозможно, поскольку одни и те же параметры передаются каждой виртуальной машине при выполнении скрипта. Однако вы должны быть в состоянии выяснить имя виртуальной машины из скрипта. Например, на машине с Linux вы можете использовать команду hostname, которая вернет имя виртуальной машины. Соответствует ли это вашим потребностям?

person Neil Sant Gat    schedule 28.02.2017
comment
Я думал об этом, но меня беспокоит hostname, потому что, насколько я знаю, пользовательское расширение запускает сценарии при развертывании виртуальной машины, поэтому я не знаю, будет ли доступна эта команда и вернет ли она правильное значение. Но я думаю, мне просто нужно попробовать. - person Tomasz Tuczapski; 28.02.2017

где vmssTemplate — это параметры («virtualMachineScaleSets_name») в шаблоне VMSS.

Мы можем найти, где шаблон vmss определяет имя виртуальной машины.
computernameprefix:

"osProfile": {
            "computerNamePrefix": "[variables('namingInfix')]",
            "adminUsername": "[parameters('adminUsername')]",
            "adminPassword": "[parameters('adminPassword')]"
          },

и определение 'namingInfix' здесь:

 "namingInfix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 1, 9))]",

По умолчанию VMSS с настройками автомасштабирования и имя виртуальной машины должны создаваться автоматически.

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

PS C:\windows> Get-AzureRmVmssVM -ResourceGroupName YOUR_RESOURCE_NAME -VMScaleSetName YOUR_VMSS_NAME

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

person Jason Ye    schedule 28.02.2017
comment
Это вполне понятно, и я даже нашел шаблон, в котором используется этот подход github.com/Azure/azure-quickstart-templates/blob/master/, но я не думаю, что это способ сослаться на имя виртуальной машины, которое является частью VMSS в шаблоне. Это просто способ установить префикс виртуальной машины. - person Tomasz Tuczapski; 28.02.2017