PowerCLI - 通过虚拟机IP查找虚拟机

8
我正在尝试使用PowerCLI根据IP地址查找特定的虚拟机。我在网上找到了这个脚本Grabbing VM ipaddress via PowerCLI
最初的问题解释了我遇到的问题,而答案似乎可以解决这些问题,但是当我运行这样的脚本时:
Get-View -ViewType VirtualMachine | Select @{N='IP';E={[string]::Join(',',$_.Guest.net.IPAddress)}}

我只得到以下输出:
IP
--

就是这样...我是否遗漏了指定集群或DC等输入,这对其他人有效吗?


1
尝试移除_select_部分并查看结果。VM对象是否具有属性_VM.Guest.net.IPAddress_? - user2226112
6个回答

8

Get-View

KERR所指出的那样,在bxm的答案中的代码比我下面的替代方案的代码更快。[对我来说,它一直比KERR声称的快10倍,但仍然更快。]

但请注意,对于Get-View返回的视图对象,Guest.IPAddress属性由单个地址组成,甚至可能不是NIC的地址(例如,它可能是VPN连接的地址)。

这里是bxm代码的一行版本(微调过):

Get-View -ViewType VirtualMachine | ?{ $_.Guest.IPAddress -eq "1.2.3.4" }

这里有一个版本,可以检查所有网卡地址:

Get-View -ViewType VirtualMachine | ?{ ($_.Guest.Net | %{ $_.IpAddress }) -contains "1.2.3.4" }

在这里,"1.2.3.4" 是你想要查找相应虚拟机的 IP 地址。

请注意,我的版本与 bxm 的略有不同。bxm 的版本有效地确保任何匹配的虚拟机 有指定的 IP 地址被分配 而没有其他的(或者更准确地说,如果 Guest.IPAddress 属性是一个数组的话)。我的版本只确保该虚拟机具有指定的地址,而不管它是否分配了其他任何 IP 地址。

Get-VM

这是我根据 StackUser_py 的答案提供的链接 修改的代码:

Get-VM | Where-Object -FilterScript { $_.Guest.Nics.IPAddress -contains "1.2.3.4" }

请注意,这两种解决方案返回不同的结果。第一种解决方案返回一个(数组) VirtualMachine (对象),而第二种解决方案则返回一个UniversalVirtualMachineImpl。但是,调用Get-VM并将其传递给第一个解决方案返回的虚拟机名称不会显著改变持续时间。

1
@KERR,感谢您的帮助!请删除您在此处的评论(因为它们与现在的答案不再相关)。 - Kenny Evitt
2
情节渐渐复杂了 - 虽然 Get-View 方法更快,但它只返回(搜索) VM 的第一个 IP 地址。Get-VM 方法适用于具有多个 IP 的 VM。 - KERR
@KERR 通过 Get-View 获取到的一个虚拟机的 IP 地址是 VPN 的,甚至不是其中的两个 NIC 中的一个!而 Get-VM 只返回了这两个 NIC 的地址。我无法在该虚拟机的视图对象中找到 VPN IP 地址或任何其他相关网络连接的信息。 - Kenny Evitt

2
我通过微调对象的使用,让命令正常工作,修改如下所示:
$list = Get-View -ViewType VirtualMachine | Select name,@{N='IP';E={[string]::Join(',',$_.Guest.ipaddress)}}
$list | ?{ $_.ip -eq "1.2.3.4" }

您也可以将这个命令作为一行来使用,通过分号将命令分隔开,例如: $list = Get-View -ViewType VirtualMachine | Select name,@{N='IP';E={[string]::Join(',',$.Guest.ipaddress)}} ; $list | ?{ $.ip -eq "1.2.3.4" } - KERR
$_.Guest.ipaddress 是一个(单个)字符串,而不是数组,因此“字符串连接”表达式是不必要的。 - Kenny Evitt
FYI,这个方法只会列出并查询虚拟机的第一个IP地址。 - KERR

1
或者,您可以这样做。
Get-VM | Where-Object {$_.Guest.IPAddress -eq '1.1.1.2'}

这并不一定适用于具有多个网络接口的虚拟机。 - Kenny Evitt

1

尽管我不确定为什么上述方法仍然无法正常工作,但我找到了以下内容可能会对人们有所帮助。对于大型虚拟机环境非常有用。(这就是我最初从上述脚本中尝试编写的内容)。

使用PowerCLI查找特定客户机IP


0

注意:我发现这仅适用于PowerCLI 6.3,不适用于PowerCLI 5.8。这可能是为什么 OP 没有得到任何关于“IP”的结果的原因。

PowerCLI 5.8(IP 字段为空): PowerCLI 5.8

PowerCLI 6.3(IP 字段填充): PowerCLI 6.3

最后找到了一种使用 Get-View 并在具有多个 IP 的 VM 上进行搜索(包括 IPv6)的方法:

$ip = "192.168"
$list = get-view -ViewType VirtualMachine
$list | ? {$_.guest.net.IpAddress  -match $ip } | select name, @{N='IP';E={[string]::Join(',',$_.Guest.net.IPAddress)}}

enter image description here


0

还需要注意的是,IpAddress是一个字符串数组,因此,如果你要使用除了-contains之外的任何其他操作(例如-match),那么你需要在ForEach-Object中再添加一层:

Get-View -ViewType VirtualMachine | Where-Object { ($_.Guest.Net | ForEach-Object { $_.IpAddress | ForEach-Object { $_ -match '^1\.2\.3\.4\d$' } }) -contains $true }

这会查找所有IP在1.2.3.40-1.2.3.49范围内的虚拟机


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接