【问题标题】:How to reference virtual machine name of VMSS in JSON template如何在 JSON 模板中引用 VMSS 的虚拟机名称
【发布时间】:2024-01-08 15:20:01
【问题描述】:

有没有办法引用部署在 VM Scale Set 中的 VM 名称?我正在使用自定义脚本扩展,该扩展在部署规模集中的每个 VM 时运行安装脚本,并且对于脚本的参数之一,我想使用 VM 的名称。对于单个实例,这很容易:

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

但是由于规模集中的 VM 名称是在部署时动态创建的,所以我想不出一种在 JSON 中引用它的方法。 VM 命名约定为 vmssTemplate_0、vmssTemplate_1 等,其中 vmssTemplate 为 VMSS 模板中的参数('virtualMachineScaleSets_name')。

【问题讨论】:

    标签: json azure azure-virtual-machine azure-resource-manager azure-vm-scale-set


    【解决方案1】:

    无法在模板本身中执行此操作,因为在脚本执行时会将相同的参数传递给每个 VM。但是,您应该能够从脚本中找出 VM 名称。例如,在 Linux 机器上,您可以使用 hostname 命令,该命令将返回 VM 名称。这是否满足您的需求?

    【讨论】:

    • 我考虑过这一点,但我担心hostname,因为据我所知,自定义扩展在部署 VM 时会运行脚本,所以我不知道这个命令是否会可用,如果它会返回正确的值。但我想我只需要试一试。
    【解决方案2】:

    其中 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 具有自动缩放设置,并且应该自动创建 vm 的名称。

    如果你想获取虚拟机的名字,我们可以使用powershell来获取:

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

    您还可以在脚本中添加一些脚本(以获取 VM 的名称),然后将脚本上传到自定义脚本扩展。

    【讨论】:

    最近更新 更多