检索 Azure VM 的 Public IP 地址的更简单方法

Easier way of retrieving an Azure VM's Public IP address

使用特定 VM 的 name/resource 组,我正在尝试获取 VM 的 public IP 地址。

此代码有效,但与其他 AzureRM cmdlet 相比,它似乎笨拙。

$VM = Get-AzureRmVM -ResourceGroupName MyResourceGroup -Name MyVMName
$NIC = $VM.NetworkProfile.NetworkInterfaces[0].Id -replace '.*\/'
$NI = Get-AzureRmNetworkInterface -Name $NIC -ResourceGroupName MyResourceGroup
$NIIC = Get-AzureRmNetworkInterfaceIpConfig -NetworkInterface $NI
$PIP = $NIIC.PublicIpAddress.Id -replace '.*\/'
$PIP = Get-AzureRmPublicIpAddress -Name $PIP -ResourceGroupName MyResourceGroup
$PIP.IpAddress

是否有 quicker/easier/shorter 访问此信息的方式?

据我所知,PowerShell 还没有。但是你可以使用 Azure CLI

az vm list-ip-addresses -n <VMName> -g <ResourceGroup> | grep publicIpAddresses

尝试 Azure CLI 命令:

az vm list-ip-addresses -g groupName -n vmName --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" -o tsv

或者 PowerShell 命令仅使用您的虚拟机名称进行过滤:

$ipAddress= (Get-AzureRmPublicIpAddress -ResourceGroupName groupName | Where-Object { $_.IpConfiguration.Id -like "*vmName*" }
)
$ipAddress.IpAddress

我获取 Linux VM 值的方式是使用以下代码。

Get-AzureRmPublicIpAddress -ResourceGroupName <yourRG> -Name <yourVMName> | Select-Object {$_.IpAddress}

这将 return 是这样的:

$_.IpAddress
------------
52.170.56.60

有可能。此脚本将列出 Azure 云中的所有 VM PIP。

$VM_int = Get-AzureRmResource -ODataQuery "`$filter=resourcetype 'Microsoft.Compute/virtualMachines'"
foreach($int in $VM_int){
$vmName = $int.Name
$ipAddress= (Get-AzureRmPublicIpAddress -ResourceGroupName $int.ResourceGroupName | Where-Object { $_.IpConfiguration.Id -like "*$vmName*" })
$vmName + ' --- ' + $ipAddress.IpAddress
}

更新

不幸的是,Get-AzVM 不提供 VM 的 Public IP 地址,但我们可以抓取其网络接口名称并通过所有分配的 Public IP 对其进行通配符搜索NIC 名称匹配。 速度不快,但会提供正确的结果。

$array = @()
foreach ($vm in Get-AzVM) {
    $vmNicName = $vm.NetworkProfile.NetworkInterfaces.Id.Split("/")[8]
    $ipAddress = Get-AzPublicIpAddress | Where-Object {$_.IpConfiguration.Id -like "*$vmNicName*"}
    if ($null -ne $ipAddress) {
        $pipInput = New-Object psobject -Property @{
            VM       = $vm.Name
            PublicIP = $ipAddress.IpAddress
        }
        $array += $pipInput
    }
}

这会输出一些信息,但是 public IP 地址在那里。

Get-AzPublicIpAddress -ResourceGroupName MyResourceGroup | Where-Object {$_.name -like "*MyVMName*" }

或者您可以这样做来获取 IP 地址:

Get-AzPublicIpAddress -ResourceGroupName MyResourceGroup | Where-Object {$_.name -like "*MyVMName*" } | Select-Object { $_.IpAddress }

输出如下:

$_.IpAddress 
--------------
13.255.162.33