借助适用于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
答案 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地址的网络接口的所有属性。