【问题标题】:AzureRmVM - Obtaining VMs Public IP addressesAzureRmVM - 获取虚拟机公共 IP 地址
【发布时间】:2018-12-22 16:42:17
【问题描述】:

我正在尝试为我的 Azure 订阅中的所有虚拟机获取 IP 地址。虽然我获得了所有 NIC 的 IP 地址,但我似乎无法为我的 VM 获得它们。我正在使用 AzureRm 和 powershell 来获取这些信息。

如何使用 AzureRm 获取 Azure 中所有 VM 的 IP 地址?

【问题讨论】:

    标签: azure virtual-machine azure-rm


    【解决方案1】:

    您可以使用 Azure PowerShell 获取所有 VM 公共 IP,但您应该注意一些事项。

    VM 可以关联多个网络接口,每个网络接口也可以关联一个公共 Ip。

    我假设您的虚拟机在同一资源组中,并且每个虚拟机只有一个网络接口。然后 PowerShell 脚本将如下所示:

    $vms = Get-AzureRmVM -ResourceGroupName yourRGName
    foreach ($vm in $vms)
    {
        $vmName = $vm.Name
        $nic = $vm.NetworkProfile.NetworkInterfaces[0].Id.Split('/') | select -Last 1
        if ( (Get-AzureRmNetworkInterface -ResourceGroupName yourRGName -Name $nic).IpConfigurations.PublicIpAddress -eq $null )
        {
            continue
        }
        $publicIpName =  (Get-AzureRmNetworkInterface -ResourceGroupName yourRGName -Name $nic).IpConfigurations.PublicIpAddress.Id.Split('/') | select -Last 1
        $publicIpAddress = (Get-AzureRmPublicIpAddress -ResourceGroupName yourRGName -Name $publicIpName).IpAddress
        Write-Output $vmName $publicIpAddress
    }
    

    结果会是这样的:

    如果您的虚拟机在不同的资源组中,您可以先获取虚拟机信息,然后一切顺利。如果订阅中只存在您的虚拟机,您可以在登录订阅时使用 PowerShell 命令Get-azureRMVM 获取所有虚拟机。但是,如果它们不仅仅是您订阅中的虚拟机,我认为您最好通过资源组获取所有虚拟机。希望这会对你有所帮助。

    【讨论】:

      【解决方案2】:

      因为 ARM 中的 IP 地址分配给 NIC 而不是 VM。您将编写一个脚本来查看分配给 VM 的 NIC 并在这些 NIC 上查找 IP。

      【讨论】:

        【解决方案3】:

        您可以参考以下步骤来获取 Azure 订阅中的所有公共 IP 地址。

        获取订阅中的所有公共 IP 地址。

        GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Network/publicIPAddresses?api-version=2018-08-01
        

        点击尝试一下

        => 登录 => 选择一个 Azure 帐户 => 选择订阅 ID => 运行

        查看订阅中的公共 IP 地址:

        注意:只有正在运行的虚拟机才有公共 IP 地址。

        更多详情请参考“Public IP Address - List All”。

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          引用 Charles Xu 的出色回答....

          转换为使用新的'Az' powershell module

          foreach ($vm in $vms)
          {
              $vmName = $vm.Name
             $resgrpName = $vm.ResourceGroupName
              $nic = $vm.NetworkProfile.NetworkInterfaces[0].Id.Split('/') | select -Last 1
              if ( (Get-AzNetworkInterface -ResourceGroupName $resgrpName -Name $nic).IpConfigurations.PublicIpAddress -eq $null )
              {
                  continue
              }
              $publicIpName =  (Get-AzNetworkInterface -ResourceGroupName $resgrpName -Name $nic).IpConfigurations.PublicIpAddress.Id.Split('/') | select -Last 1
              $publicIpAddress = (Get-AzPublicIpAddress -ResourceGroupName $resgrpName -Name $publicIpName).IpAddress
              Write-Output $vmName $publicIpAddress
          }
          

          它非常慢,但确实有效!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-07
            • 2016-02-02
            • 1970-01-01
            • 1970-01-01
            • 2011-03-16
            • 1970-01-01
            相关资源
            最近更新 更多