Search code examples
azurepowershellazure-rm

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


Using the name/resource group of a specific VM, I'm trying to get the VM's public IP address.

This code works but it seems unwieldy in comparison to other AzureRM cmdlets.

$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

Is there a quicker/easier/shorter way of accessing this information?


Solution

  • It's possible. This script will list all VMs PIP in your Azure cloud.

    OLD

    $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
    }
    

    UPDATE

    Unfortunately, Get-AzVM doesn't provide the Public IP address of VM, but we can scrape its Network Interface Name and make a wildcard search of it through all assigned Public IPs which NIC name are matched. It's not fast but will provide with correct results.

    $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
        }
    }