0

在我的模板输出中,我想返回分配的公共 IP 地址。我在“输出”部分尝试了以下内容:(在“对象”类型的输出中)

"ipobj":   "[reference(variables('publicIPAddressName'),'2020-07-01','Full')]"

这有效并返回整个 publicIpAddress 对象:

  "ipobj": {
    "apiVersion": "2020-07-01",
    "location": "eastus",
    "sku": {
      "name": "Basic",
      "tier": "Regional"
    },
    "properties": {
      "provisioningState": "Succeeded",
      "resourceGuid": "...",
      "ipAddress": "...",
      "publicIPAddressVersion": "IPv4",
      "publicIPAllocationMethod": "Dynamic",
      "idleTimeoutInMinutes": 4,
      "dnsSettings": {
        "domainNameLabel": "simplelinuxvm-zktwk4fzmy5p4",
        "fqdn": "simplelinuxvm-zktwk4fzmy5p4.eastus.cloudapp.azure.com"
      },
      "ipTags": [],
      "ipConfiguration": {
        "id": "/subscriptions/.../resourceGroups/.../providers/Microsoft.Network/networkInterfaces/simpleLinuxVMNetInt/ipConfigurations/ipconfig1"
      }
    },
    "subscriptionId": "...",
    "resourceGroupName": "...",
    "scope": "",
    "resourceId": "Microsoft.Network/publicIpAddresses/simpleLinuxVMPublicIP",
    "referenceApiVersion": "2020-07-01",
    "condition": true,
    "isConditionTrue": true,
    "isTemplateResource": false,
    "isAction": false,
    "provisioningOperation": "Read"
  }

这符合publicIpAddress 对象的 API 文档。而且我还可以使用不带“Full”参数的引用来检索一些属性,根据Azure doc,它应该返回对象的。这些工作:properties

"[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
"[reference(variables('publicIPAddressName')).publicIPAddressVersion]"

但其他一些属性无法访问:

"[reference(variables('publicIPAddressName')).ipAddress]"
"[reference(variables('publicIPAddressName'),'2020-07-01','Full').properties.ipAddress]"

根据错误消息,(在中间示例的情况下):

The template output '...' is not valid: The language expression property 'ipAddress' doesn't exist, available properties are 'provisioningState, resourceGuid, publicIPAddressVersion, publicIPAllocationMethod, idleTimeoutInMinutes, dnsSettings, ipTags'

因此,Azure 似乎不允许我访问完整输出中存在的属性。这背后是否有任何解释/意图,或者至少有解决方法?

注意:如果我将“字符串”输出(即不是对象的一部分)定义为

"ip": {
    "type": "string",
    "value": "[reference(variables('publicIPAddressName')).ipAddress]" 
}

或者

"ip": {
    "type": "string",
    "value": "[reference(variables('publicIPAddressName'),'2020-07-01','Full').properties.ipAddress]"
},
4

2 回答 2

0

我最近遇到了类似的问题,下面是一些参考资料,其中提到了这种情况的原因。

  1. 据此:_

    一世)

    仅当“publicIPAllocationMethod”设置为“静态”时,“ipaddress”属性才存在。(静态公共 IP 地址)。如果您对非静态 IP 地址执行此操作,则会返回错误,但适用于静态 IP 地址。

    ii)

    仅当附加到正在运行的服务或 VM 时,它才会具有“ipAddress”属性。如果 VM 已“停止”,它将没有 ipAddress 属性。

  2. 而且,看起来这个链接中的 github 中有一个未解决的问题,与此相关。参考这个,以防它在未来得到解决。

  3. 还要检查此链接,其中提到:

    这是平台中的一个已知限制,其中动态公共 IP 地址在 VM 启动并运行之前不会自行解析。有两种解决方法:

    i) 在静态模式下创建公共 IP 地址。这将确保立即分配公共 IP 地址。但是,请注意,您可能会产生额外费用。

    ii) 将依赖关系从公共 IP 地址更改为 IP 地址所附加到的虚拟机。这将确保公共 IP 地址始终可用。

于 2021-12-02T18:10:16.250 回答
-1

在输出 publicIpAddress 对象的属性时,应注意定义与输出值匹配的正确类型。

"outputs": {
    "publicIpipAddress": {
        "type": "string",
        "value": "[reference(parameters('publicIPAddresses_vmc_backupPublicIP_name'),'2020-07-01','Full').properties.ipAddress]"
    },
    "idleTimeoutInMinutes": {
        "type": "int",
        "value": "[reference(parameters('publicIPAddresses_vmc_backupPublicIP_name'),'2020-07-01','Full').properties.idleTimeoutInMinutes]"
    }
}

在此处输入图像描述

于 2021-02-10T06:22:33.823 回答