簡體   English   中英

Azure Powershell (Az模塊) 公開IP地址

[英]Azure Powershell (Az module) get public IP address

對於 Azure 的新 Az 模塊,是否有人知道使用該名稱獲取 Azure VM 的公共 IP 地址的語法? commandlet Get-AzPublicIpAddress沒有 VM 名稱參數,只有 IP object 名稱

這有效,但我在這里沒有使用機器名稱,它是 IP object 本身的名稱:

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

我不知道如何從 VM object 獲取它,即這不起作用:

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

據我所知,僅通過一個帶有 VM 名稱的 PowerShell Get-AzPublicIpAddress VM 公共 IP 是不可能的。 Azure 中的公共 IP 是與網絡接口關聯的單個資源,而不是 VM。

如您所見,該文檔中沒有用於獲取公共 IP 的 VM 名稱參數。 但是您可以通過 PowerShell 腳本獲取公共 IP,只需使用 VM 名稱和資源組名稱。 該腳本顯示如下:

$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

我認為這是一個更徹底的答案,因為它使用 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 模塊如何,它都是一個很好的腳本。

這是我對 Andrew Harris 的回答的看法,它過濾掉了未連接到機器的網絡接口和沒有公共 IP 的 VM 的帳戶:

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

這是該線程前面 Mark Wragg 腳本的更正版本:

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
        $PublicIpAddressConfig = $Interface.IpConfigurations.publicIpAddress
        
        $PublicIP = $null
        $pconfigname = $null
        if ($PublicIpAddressConfig) {
            $pconfigname = $PublicIpAddressConfig.Id.Split('/')[-1]
            $PublicIP = (Get-AzPublicIpAddress -Name $pconfigname).IpAddress
        }     
    
        [PSCustomObject]@{
            VMName    = $VMName
            RGName    = $Interface.ResourceGroupName
            PrivateIP = $PrivateIP
            PublicIP  = $PublicIP
        }
    }
}

}

接受的答案使用 AzureRM PowerShell 模塊,該模塊現已被 Az 模塊廢棄:

$VM = Get-AzVM -ResourceGroupName $ResourceGroupName -VMName $VMName
$NetworkInterfaceName = $VM.NetworkProfile.NetworkInterfaces[0].Id.Split('/')[-1]
$NetworkInterface = Get-AzNetworkInterface -ResourceGroupName $VM.ResourceGroupName -Name $NetworkInterfaceName
$PublicIpAddressName = $NetworkInterface.IpConfigurations.PublicIpAddress.Id.Split('/')[-1]
$PublicIpAddress = Get-AzPublicIpAddress -ResourceGroupName $VM.ResourceGroupName -Name $PublicIpAddressName
Write-Host "IP: $($PublicIpAddress.IpAddress), FQDN: $($PublicIpAddress.DnsSettings.Fqdn)"

腳本的范圍在 Azure 訂閱內。

下面是一個單行腳本,它返回 Name、PublicIpAllocaitonMethod(它基本上是 IP 地址的類型,無論是靜態 IP 還是公共 IP)和訂閱中所有網絡接口的 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 地址的網絡接口的所有屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM