Azure Powershell(Az模块)获取公共IP地址

时间:2019-02-13 11:47:37

标签: azure powershell azure-powershell

借助适用于Azure的新Az模块,是否有人具有使用该名称获取Azure VM的公共IP地址的语法? commandlet Get-AzPublicIpAddress没有VM名称的参数,只有IP对象名称的参数

这可行,但是我在这里不使用机器名称,它是IP对象本身的名称:

$CurrentIp = (Get-AzPublicIpAddress -ResourceGroupName 'RG1' -Name 'MyVMname-ip').IpAddress

我想不通如何从VM对象中获取它,即,这不起作用:

Get-AzVM -ResourceGroupName 'RG1' -Name 'MyVMname' | Get-AzPublicIpAddress

4 个答案:

答案 0 :(得分:1)

据我所知,仅通过一个带有虚拟机名称的PowerShell Get-AzPublicIpAddress来获取虚拟机公共IP是不可能的。而且,Azure中的公共IP是与网络接口关联的单个资源,而不是VM。

如您所见,VM名称中没有用于获取该文档中公共IP的参数。但是您可以通过PowerShell脚本获得具有IP名称和资源组名称的公共IP。脚本显示如下:

$vm = Get-AzureRmVM -ResourceGroupName yourRG -Name vmNamme
$nic = $vm.NetworkProfile.NetworkInterfaces[0].Id.Split('/') | select -Last 1
$publicIpName =  (Get-AzureRmNetworkInterface -ResourceGroupName yourRG -Name $nic).IpConfigurations.PublicIpAddress.Id.Split('/') | select -Last 1
$publicIpAddress = (Get-AzureRmPublicIpAddress -ResourceGroupName yourRG -Name $publicIpName).IpAddress
Write-Output $vmName $publicIpAddress

或仅使用一个CLI命令即可获取公共IP,如下所示:

az vm show -d -g yourRG -n vmName --query publicIps

答案 1 :(得分:0)

我认为这是一个更彻底的答案,因为它使用PowerShell Az作为最初要使用的问题。另外,它利用Generic.List [psobject],这对于以后使用数据很有用。

$rg = 'RgName'
$Ips = Get-AzNetworkInterface -ResourceGroupName $rg
$vmDetails = New-Object "System.Collections.Generic.List[psobject]"
foreach ($instance in $Ips){
    $Vm = ($instance.VirtualMachine).Id.Split('/') | select -Last 1
    $PrivateIp = $instance.IpConfigurations.PrivateIpAddress
    $PublicIp = (Get-AzPublicIpAddress -ResourceGroupName $rg -Name ($instance.IpConfigurations.publicIpAddress.Id.Split('/') | select -Last 1)).IpAddress
    $obj = New-Object psobject -Property @{
        ResourceGroupName = $rg
        VmName = $vm
        PrivateIp = $PrivateIp
        PublicIp = $PublicIp
    }
    $vmDetails.Add($obj)
}
Write-Output $vmDetails

不幸的是,这不像Az CLI那样直接,但是不管Az模块如何,它都是一个好的脚本。

答案 2 :(得分:0)

这是我对 Andrew Harris 的回答的看法,它过滤掉了没有连接到机器的网络接口和没有公共 IP 的虚拟机的帐户:

function Get-VmIP {
    <#
    .SYNOPSIS
        Returns the IP addresses for all VMs in the current subscription.
    #>
    [cmdletbinding()]
    param()

    $Interfaces = Get-AzNetworkInterface

    foreach ($Interface in $Interfaces) {

        if ($Interface.VirtualMachine) {
            $VMName = $Interface.VirtualMachine.Id.split('/')[-1]
            $PrivateIP = $Interface.IpConfigurations.PrivateIpAddress

            $PublicIP = if ($Interface.IpConfigurations.publicIpAddress) {
                Get-AzPublicIpAddress -Name ($instance.IpConfigurations.publicIpAddress.Id.Split('/')[-1]).IpAddress
            }     
        
            [PSCustomObject]@{
                VMName    = $VMName
                RGName    = $Interface.ResourceGroupName
                PrivateIP = $PrivateIP
                PublicIP  = $PublicIP
            }
        }
    }
}

答案 3 :(得分:-1)

脚本范围在Azure订阅中。

下面是单行脚本,该脚本返回Name,PublicIpAllocaitonMethod(基本上是IP地址的类型,无论是静态IP还是公用IP)以及订阅中所有Network接口的IpAddress属性。

(Get-AzNetworkInterface ).IpConfigurations.PublicIpAddress.Id | Foreach-Object -Process {$_.Split('/')| select -Last 1} | Foreach-Object -Process {Get-AzPublicIpAddress -Name $_} | Format-List Name, PublicIpAllocationMethod,IpAddress

如果我们删除最后一条语句Format-List,它将显示具有公共IP地址的网络接口的所有属性。