【问题标题】:PowerCLI - Finding Virtual Machine via VM IPPowerCLI - 通过 VM IP 查找虚拟机
【发布时间】:2015-05-02 13:51:27
【问题描述】:

我正在尝试根据 PowerCLI 中的 IP 地址定位特定 VM。我在网上找到了这个脚本Grabbing VM ipaddress via PowerCLI

最初的问题解释了我遇到的问题,答案看起来可以解决这些问题,但是当我运行这样的脚本时:

Get-View -ViewType VirtualMachine | Select @{N='IP';E={[string]::Join(',',$_.Guest.net.IPAddress)}}

我得到的只是以下输出:

IP
--

就是这样...我是否缺少输入,例如指定集群或 DC,这对其他人有用吗?

【问题讨论】:

  • 尝试删除 select 部分,看看你会得到什么。 VM 对象是否具有属性 VM.Guest.net.IPAddress

标签: powershell vmware powercli


【解决方案1】:

Get-View

正如KERR 所指出的,bxm's answer 中的代码比我下面的替代解决方案中的代码要快。 [对于我来说,它始终快 4 倍,而不是 KERR 声称的快 10 倍;但仍然更快。]

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

这是 bxm 代码的单行(调整)版本:

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

这是一个应该检查所有 NIC 地址的版本:

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

其中"1.2.3.4" 是您要为其查找对应 VM 的 IP 地址。

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

Get-VM

这是我在StackUser_py's answer提供的链接上改编的代码:

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

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

【讨论】:

  • @KERR 感谢您的帮助!请在此处删除您的 cmets(因为它们与现在的答案不再相关)。
  • 情节变厚了——虽然 Get-View 方法更快,但它只返回(搜索)VM 的第一个 IP 地址。 Get-VM 方法适用于具有多个 IP 的 VM。
  • @KERR 我的一台虚拟机通过Get-View 的IP 地址用于VPN,甚至不是两个网卡之一! Get-VM 只返回了两个网卡的地址。在该 VM 的视图对象的其他任何地方,我都找不到 VPN IP 地址或相关网络连接的任何其他信息。
【解决方案2】:

我对所使用的对象进行了一些小调整,使该命令起作用,如下所示:

$list = Get-View -ViewType VirtualMachine |选择名称,@{N='IP';E={[string]::Join(',',$_.Guest.ipaddress)}}
$列表 | ?{ $_.ip -eq "1.2.3.4" }

【讨论】:

  • 您也可以通过用分号分隔命令来将其用作单行,例如。 $list = 获取视图 -ViewType 虚拟机 |选择名称,@{N='IP';E={[string]::Join(',',$_.Guest.ipaddress)}} ; $列表 | ?{ $_.ip -eq "1.2.3.4" }
  • $_.Guest.ipaddress 是一个(单个)字符串,而不是一个数组,因此不需要“字符串连接”表达式。
  • 仅供参考,此方法只会列出和查询 VM 的第一个 IP。
【解决方案3】:

虽然我不确定为什么上述方法仍然不起作用,但我发现以下内容可能对人们有所帮助。对于大型 VM 环境非常有用。 (这是我最初尝试从上面编写的脚本)。

Using PowerCLI to Find a Specific Guest IP

【讨论】:

    【解决方案4】:

    或者,你可以这样去做。

    Get-VM | Where-Object {$_.Guest.IPAddress -eq '1.1.1.2'}
    

    【讨论】:

    • 这不一定适用于具有多个 NIC 的 VM。
    【解决方案5】:

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

    PowerCLI 5.8(IP 字段为空):

    PowerCLI 6.3(已填充 IP 字段):

    终于找到了一种在具有多个 IP(包括 IPv6)的 VM 中使用 Get-View AND 搜索的方法:

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

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 2016-10-18
      相关资源
      最近更新 更多