Permalink
Switch branches/tags
Nothing to show
Find file Copy path
ecd78ee Jul 20, 2016
1 contributor

Users who have contributed to this file

224 lines (193 sloc) 8.17 KB
Function Get-AzureRmVmPublicIP {
<#
.SYNOPSIS
Correlate AzureRM VMs, NetworkInterfaces, and Public IPs
.DESCRIPTION
Correlate AzureRM VMs, NetworkInterfaces, and Public IPs
Prerequisites:
* You have the AzureRM module
* You're authenticated
* You're running PowerShell 4 or later
.PARAMETER ResourceGroupName
Query this resource group
.PARAMETER VMName
One or more VM names to include. Accepts wildcards. Defaults to all.
.PARAMETER IncludeObjects
If specified, include VM, NIC, and PIP (Public IP) properties on each entry
.PARAMETER VMStatus
If specified, the VM property from IncludeObjects will include data from Get-AzureRmVm '-Status'
Using this switch will trigger IncludeObjects
.EXAMPLE
Login-AzureRmAccount
Get-AzureRmVmPublicIP -ResourceGroupName 'my-resource-group'
# VMName NICName PublicIP
# ------ ------- --------
# VM-2 VM-2-NIC 23.96.1.2
# VM-3 VM-3-NIC 23.96.1.3
# VM-4 VM-4-NIC 168.61.2.1
# VM-16 VM-16-NIC 168.61.10.27
# VM-17 VM-17-NIC 23.96.17.56
# VM-18 VM-18-NIC 23.96.19.71
# VM-1 VM-1-NIC Not Assigned
# List VMs, NICS, and Public IPs in 'my-resource-group'
.EXAMPLE
Login-AzureRmAccount
Get-AzureRmVmPublicIP -ResourceGroupName 'my-resource-group' -VMName VM-1* -IncludeObjects
# ...
# VMName : VM-18
# NICName : VM-18-NIC
# PublicIP : 23.96.19.71
# VM : Microsoft.Azure.Commands.Compute.Models.PSVirtualMachine
# NIC : Microsoft.Azure.Commands.Network.Models.PSNetworkInterface
# PIP : Microsoft.Azure.Commands.Network.Models.PSPublicIpAddress
# VMName : VM-1
# NICName : VM-1-NIC
# PublicIP : Not Assigned
# VM : Microsoft.Azure.Commands.Compute.Models.PSVirtualMachine
# NIC : Microsoft.Azure.Commands.Network.Models.PSNetworkInterface
# PIP : Microsoft.Azure.Commands.Network.Models.PSPublicIpAddress
# Get VMs, NICs, and Public IPs in 'my-resource-group'
# with name like VM-1*
# Include the VM, Network Interface (NIC), and Public IP (PIP) objects properties
.EXAMPLE
$Details = Get-AzureRmVmPublicIP -ResourceGroupName 'my-resource-group' -VMStatus
$Details[0]
# VMName : VM-18
# NICName : VM-18-NIC
# PublicIP : 23.96.19.71
# VM : Microsoft.Azure.Commands.Compute.Models.PSVirtualMachineInstanceView <<<<
# NIC : Microsoft.Azure.Commands.Network.Models.PSNetworkInterface
# PIP : Microsoft.Azure.Commands.Network.Models.PSPublicIpAddress
# All sorts of data to explore in the VM property. Output from Get-AzureRmVm -Name <ThisVm> -Status
$Details[0].VM.VMAgent.ExtensionHandlers
# Type TypeHandlerVersion Status
# ---- ------------------ ------
# Microsoft.Azure.Diagnostics.IaaSDiagnostics 1.7.1.0 Microsoft.Azure.Management.Compute.Models.InstanceViewStatus
# Microsoft.Compute.BGInfo 2.1 Microsoft.Azure.Management.Compute.Models.InstanceViewStatus
# Microsoft.Compute.CustomScriptExtension 1.8 Microsoft.Azure.Management.Compute.Models.InstanceViewStatus
.EXAMPLE
Get-AzureRmVmPublicIP -ResourceGroupName $ResourceGroup -VMName VM-18 -VMStatus |
Select -Property VMName,
PublicIP,
@{ label = "PrivateIP"; expression = {$_.NIC.IpConfigurations.PrivateIpAddress} },
@{ label = "VMAgentStatus"; expression = {$_.VM.VMAgent.Statuses[0].DisplayStatus} }
# VMName PublicIP PrivateIP VMAgentStatus
# ------ -------- --------- -------------
# VM-18 23.96.19.71 10.1.2.5 Ready
# Pull details from VM-18,
# extract private IP from the NIC, and the first VMAgent status we find from the VM
.FUNCTIONALITY
Azure
#>
[cmdletbinding()]
param(
[string[]]$ResourceGroupName,
[string[]]$VMName,
[switch]$IncludeObjects,
[switch]$VMStatus
)
foreach($ResourceGroup in $ResourceGroupName)
{
# Here's an absurd snippet of code to extract all VMs, NICs, and Public IPs, and correlate them together.
# From what I can tell, the Azure team didn't provide the usual pipeline support...
# This method will skip public IPs that aren't bound to a NIC, or NICs that aren't bound to a VM
Try
{
$AllVMs = @( Get-AzureRMVm -ResourceGroupName $ResourceGroup -ErrorAction Stop )
}
Catch
{
Write-Error $_
Write-Error "Could not extract VMs from resource group '$ResourceGroup'"
continue
}
Try
{
$NICS = @( Get-AzureRmNetworkInterface -ResourceGroupName $ResourceGroup -ErrorAction Stop )
}
Catch
{
Write-Error $_
Write-Error "Could not extract network interfaces from resource group '$ResourceGroup'"
continue
}
Try
{
$PublicIPS = @( Get-AzureRmPublicIpAddress -ResourceGroupName $ResourceGroup -ErrorAction Stop)
}
Catch
{
Write-Error $_
Write-Error "Could not extract public IPs from resource group '$ResourceGroup'"
continue
}
# Allow wildcard support for each name in array... filter dupes
$TheseVMs = foreach($VM in $AllVMs)
{
if($VMName)
{
foreach($Name in $VMName)
{
if($VM.Name -like $Name)
{
$VM
}
}
}
else
{
$VM
}
}
$TheseVMs = @( $TheseVMs | Sort Name -Unique )
# Correlate. Uses PS4 language.
Foreach($nic in $nics)
{
$VMs = $null
$VMs = $TheseVMs.Where({$_.Id -eq $nic.virtualmachine.id})
$PIPS = $null
$PIPS = $PublicIPS.Where({$_.Id -eq $nic.IpConfigurations.publicipaddress.id})
foreach($VM in $VMs)
{
if($VMStatus)
{
Try
{
$VMDetail = Get-AzureRMVm -ResourceGroupName $ResourceGroup -Status -Name $VM.Name -ErrorAction stop
}
Catch
{
Write-Error $_
Write-Error "Could not extract '-Status' details from $($VM.Name) in resource group $ResourceGroup. Falling back to non detailed"
$VMDetail = $VM
}
if(-not $IncludeObjects)
{
$IncludeObjects = $True
}
}
else
{
$VMDetail = $VM
}
foreach($PIP in $PIPS)
{
# Include VM, NIC, Public IP (PIP) raw objects if desired
$Output = [ordered]@{
ResourceGroupName = $ResourceGroup
VMName = $VM.Name
NICName = $nic.Name
PublicIP = $PIP.IpAddress
}
if($IncludeObjects)
{
$Output.Add('VM', $VMDetail)
$Output.Add('NIC', $NIC)
$Output.Add('PIP', $PIP)
}
[pscustomobject]$Output
}
}
}
}
}