PowerCLI 教程:管理 VMware 基础设施

PowerCLI由VMWare成为了ESXi支持的硬件的虚拟化管理员的通用接口。学习如何通过PowerShell和PowerCLI管理VMware是您工具包的重要补充。在这个PowerCLI教程中,您将学习如何做到这一点。

在本教程中,您将学习到:

  • 使用PowerCLI连接到VMware基础架构的基础知识
  • 熟悉用于处理VMware对象的cmdlet
  • 通过知识赋予自己探索的能力
  • 通过PowerCLI进一步管理VMware

让我们开始吧!

您需要具备的知识和技能

在您深入学习这个PowerCLI教程之前,确保您和我都在同一页面上是非常重要的。对于本文,我将假设:

  • 您具有基本的PowerShell经验。您不必是PowerShell专家,但您对PowerShell有任何熟悉都会对您有所帮助。
  • 您有一个用于连接和测试的VMware ESXi主机或vCenter应用程序
  • 您正在使用Windows(或Mac / Linux)工作站
  • 您已经安装了PowerCLI并已连接。如果没有,请查看这篇PowerCLI安装文章。

I’ll be using PowerCLI v 11.4.0. I will be working from a Windows 10 workstation with Windows PowerShell 5.1, but you’re welcome to use PowerShell 6 instead as there’s feature parity for this tutorial.

使用PowerCLI收集有关ESXi主机的信息

在您深入了解我们的 vSphere 环境的虚拟层之前,审查物理硬件层是一个好主意。VMware PowerCLI 提供了一个专门用于此目的的 cmdlet,用于收集称为 Get-VMHost 的详细信息。

当您连接到您的 vCenter 服务器或 ESXi 主机时,请运行以下 cmdlet。

PS51> Get-VMHost
Get-VMHost

由于我连接到管理两个单独 ESXi 主机的 vCenter Server Appliance,因此我提供了一些有关正在管理的主机的基本信息。 Get-VMHost 允许您查看虚拟化主机的硬件功能。但是,默认情况下,Get-VMHost 不会返回所有可能的信息。

如果您将 Get-VMHost cmdlet 管道传输到 Format-List,您将获得有关给定主机的所有信息的控制台输出。

Get-VMHost | Format-List

或者,您可以更加挑剔,只选择您正在处理的 VMHost 对象上的单个属性,例如:

PS51> Get-VMHost | format-list -Property State,LicenseKey,Version

利用这种更详细的输出将提供对运行虚拟工作负载的底层硬件的更大视图。特别是,一些信息可能是:

  • 许可证验证信息
  • CPU/内存总数
  • 硬件供应商型号
  • DNS 主机名

审查后,这些信息可以编译成一个 CSV 文件,也许可以使用 Export-CSV cmdlet

使用 PowerCLI 检查 VM

让我们现在深入了解PowerCLI教程中的另一个主题,通过审查虚拟主机来查看当前在给定的ESXi主机上存在哪些虚拟机。

Get-VM命令是一个方便的命令,您可以使用它来查看VM信息。

PS51> Get-VMHost -Name <Host FQDN> | Get-VM

此cmdlet的输出将类似于以下内容:

PS51> Get-VMHost -Name | Get-VM

上面的输出提供了关于给定主机上当前运行的所有VM的完整状态列表。如果您选择不指定单个主机,就像我上面所做的那样,您将收到每个后续主机及其上的VM信息的信息表。

如果您正在解决问题并需要知道给定主机上的虚拟机数量,或者需要使用VMware PowerCLI收集ESXi主机信息,您可以从现在开始使用这些cmdlet。您可以随时使用您手边的报告功能进行扩展!

使用PowerCLI检查虚拟交换机

对于负责配置或管理vCenter集群虚拟网络的人员,有一整套网络cmdlet可用于任何用例。如果您希望查看在您的vSphere环境中配置的虚拟交换机,您将使用以下命令:

PS51> Get-VirtualSwitch

根据您拥有的虚拟网络和虚拟交换机的数量,您的结果列表可能相当大。在我的案例中,如您下面所见,我有一个单独的DSwitch,这是一个分布式虚拟交换机

在企业 vSphere 实施中,当集群中有许多 ESXi 主机时,分布式交换机简化了在多个具有相同配置的主机上部署虚拟交换机和端口组的过程。这样可以节省在每台主机上手动创建相同网络配置的工作量,并且是扩展集群的好方法!

Get-VirtualSwitch

使用 PowerCLI 查找连接到虚拟网络的 VM

在尝试缩小问题范围时,您可能想知道哪些 VM 连接到了哪些网络。为了弄清楚这一点,您可以使用 Get-VirtualPortGroup 命令。让我们在本 PowerCLI 教程中学习一下这个命令。

A port group is essentially a virtual network. To display all port groups, run Get-VirtualPortGroup without any parameters. You should then see a listing of all virtual port groups present in your vSphere environment.

Get-VirtualPortGroup

要查找所有连接到该端口组(DPortGroup)内的 VM,请运行以下脚本。请务必将值 DPortGroup 替换为您的虚拟端口组的名称。

PS51> Get-VM | Where-Object { ($PSItem | Get-NetworkAdapter | where {$_.networkname -match "DPortgroup"})}

在这个单行命令中,我们正在获取存在于此 vCenter 应用程序中的所有虚拟机列表,然后使用 Where-Object 命令过滤出仅具有与我们的端口组名称匹配的网络名称的 VM。

Getting VMs with only a specific port group

通过此输出,您将能够确定连接和配置为每个网络的机器。

当被要求定位并分析连接到 VMware 中特定网络的哪些 VM 时,您现在将能够提供 PowerCLI 报告解决这个问题。

使用 PowerCLI 获取 VM 的操作系统版本信息

大部分在VMware内部进行的管理工作都是在虚拟机级别完成的。您可能会收到无数类似检索VM硬盘大小列表或获取所有服务器的Guest OS版本等任务的请求。

这些任务在大规模下可能会很繁琐。PowerCLI能够通过一些重要的cmdlet简化这些任务,让我们在这个PowerCLI教程中了解它们。

在某个时刻,您可能被问到:“我们在VMware集群中有多少个Ubuntu服务器?”然后,您可能会花费太多时间在vCenter中寻找答案。PowerCLI可以通过查看vCenter中的VM对象并对输出应用一些PowerShell魔法来简化此过程。

看一下下面的脚本,它汇总了VM信息。此代码片段使用Get-View命令,稍后我们将详细介绍它,但现在您应该知道它是检索VMware对象属性的高级方法。在这种情况下,我们正在收集最容易使用此方法检索的嵌套属性。

PS51> Get-VM | 
      Sort-Object -Property Name |
      Get-View -Property @("Name", "Config.GuestFullName", "Guest.GuestFullName") |
      Select-Object -Property Name, @{N="Configured OS";E={$_.Config.GuestFullName}}, @{N="Running OS";E={$_.Guest.GuestFullName}}

上面的代码通过PowerCLI Get-VM cmdlet检索虚拟机列表,使用PowerShell Sort-Object cmdlet对列表进行排序,然后使用PowerCLI Get-View cmdlet检索一些对象属性。

在我的环境中运行此代码会产生下面的结果。您可以看到vCenter中VM的名称,Configured OS表示VMware虚拟硬件如何解释客户操作系统,以及实际的Running OS表示实际的操作系统。

Finding VMs based on various criteria

在集群中关闭了VMs replicantScriptrunner,您将无法查看它们的Running OS值。操作系统是通过VMware Tools服务收集的。如果不可用,PowerCLI将无法获取操作系统信息。

使用PowerCLI创建CSV报告

VMware Tools是Windows和Linux VMs的一项客户端服务,为虚拟机监视程序提供额外信息和管理功能。最常见的是提供干净的关闭、操作系统信息和虚拟机的更高分辨率控制台查看。

A convenient way to report on and provide this information would be to pipe the above script into the Export-CSV  cmdlet. Export-Csv will create a CSV file with the same information you see in the console.

PS51> Get-VM | Sort-Object -Property Name | Get-View -Property @("Name", "Config.GuestFullName", "Guest.GuestFullName") |
Select -Property Name, @{N="Configured OS";E={$_.Config.GuestFullName}}, @{N="Running OS";E={$_.Guest.GuestFullName}} | Export-CSV C:\report.csv -NoTypeInformation 

运行上述代码后,您应该能够使用Excel打开CSV文件以查看报告。

CSV file of VM information

使用PowerCLI检查虚拟硬盘

Get-Harddisk命令是另一个有用的命令。Get-HardDisk cmdlet允许您检查连接到VMs的虚拟硬盘的信息。

例如,要查询连接到exchange1 VM的虚拟硬盘的信息,您可以运行以下命令:

PS51> Get-VM -Name exchange1 | Get-HardDisk | Format-List
Querying information about the virtual hard disk attached to the exchange1 VMs

部分信息可能是冗余的,比如以KB为单位的容量与GB为单位的容量。但了解StorageFormat(thin/thick provisioning类型)也是有价值的。以及知道VMDK文件名称。

例如,如果您看到一个常见问题,并且所有VM硬盘驻留在相同的数据存储卷上,这种知识可能加速故障排除。

使用PowerCLI检查虚拟网络适配器

除了查看虚拟机的硬盘信息之外,您可能还想检查虚拟网络适配器。要检查单个虚拟机的这些属性,您可以使用Get-NetworkAdpter cmdlet。

PS51> Get-NetworkAdapter -VM myVM

虽然您之前曾在此端口中搜索位于同一网络中的所有虚拟机,但这次您只想查看连接到特定虚拟机的适配器。

Get-NetworkAdapter

如果要排除具有多个网络适配器连接的虚拟机的故障,这将非常有用。您可以快速地查看这些适配器是否连接到了正确的网络。

在虚拟机中运行 PowerShell 脚本,使用 Invoke-VMScript

通过使用Invoke-VMScript,您还可以直接在虚拟机内部运行 PowerShell 代码;无需网络连接。如果您曾在 Hyper-V 环境中使用过PowerShell Direct,那么这将是一个类似的体验。

与创建 PowerShell 远程会话或通过网络使用Invoke-Command cmdlet不同,Invoke-VMScript cmdlet可以直接将命令发送到虚拟机,而无需正常的 WinRM 或 SSH 连接。

例如,也许您想要在名为exchange1的虚拟机上执行一个简单的目录列表。要执行此操作,您将dir C:\作为ScriptText参数的值,如下所示。

PS51> Invoke-VMScript -VM exchange1 -ScriptText "dir C:\"

结果就好像您从VM控制台本身运行命令一样。然后,Invoke-VMScript会传递在VM上运行的命令返回的所有输出。

Invoke-VMScript

虽然这只是一个基本示例,但您可以按照您喜欢的方式进行复杂化。这个PowerCLI cmdlet允许您在ScriptText参数中指定批处理、PowerShell或Bash类型。

您也可以进行更高级的操作。下面您可以看到如何使用Invoke-VMScript来使用单独的$script变量运行PowerShell代码,作为ScriptText参数输入。这样我们就可以为VM创建更定制的脚本输入。

PS51> $script = 'Get-Disk'

$guestCredential = Get-Credential

Invoke-VMScript -ScriptText $script -VM VM -GuestCredential $guestCredential  -ScriptType Powershell

ScriptText参数值需要是一个字符串。这就是为什么$script变量需要单引号作为必要性的原因。

您可能还注意到了GuestCredential参数的使用。此参数用于对VM操作系统进行身份验证。如果您想以不同的帐户运行脚本,此参数尤其有用。

您的脚本执行后应该会产生类似以下的输出。

Running a script on a VM with Invoke-VMScript

这个脚本的结果为我们提供了VM的磁盘信息。基于此,您应该知道这是一个远程VM,因为驱动器的友好名称为VMware Virtual Disk

使用Get-View进行高级操作

您可能已经看到一些基本的 cmdlet 返回一个名为 ExtensionData 的属性。您可以通过将许多 PowerCLI cmdlet 导向 PowerShell Get-Member cmdlet 来找到此属性。如果您想知道那是什么,现在就是您找出的机会。

这个冒险的下一步是理解 Get-View cmdlet。VMware PowerCLI 利用许多不同的查询来获取 VM 的信息,以便提供 Get-VM 的漂亮且简单的输出。但是,在幕后有很多内容只能通过使用 Get-View cmdlet 访问。

您可能会看到很多脚本使用这个 cmdlet。花一些时间适应看到这个 cmdlet 的运行方式是很值得的。为了熟悉它,请使用 Get-View cmdlet 获取一些虚拟机信息(在此示例中是 exchange1)。

您可以看到此 cmdlet 的 Filter 选项需要使用 PowerShell 哈希表而不是单个字符串值。在编写自己的独特脚本时,请注意!

PS51> Get-View -ViewType VirtualMachine -Filter @{"Name" = "myVMName"}

上述命令的结果是大量嵌套的配置信息和方法选项,用于执行针对 VM 的操作或获取对象属性。

Get-View

如果您使用上述相同的脚本并将输出发送到一个变量,您可以使用点符号表示法检查这些嵌套选项。在这里,您可以查看并检索所有额外的客户操作系统信息,这些信息可能是您想通过 PowerCLI 报告的。

PS51> $VM = Get-View -ViewType VirtualMachine -Filter @{"Name" = "myVMName"}
PS51> $VM.Guest
Using Get-View with the Filter Parameter

也许您想选择一个单独的属性。如果是这样,您可以运行以下命令来缩小单个值的范围。

PS51> $VM.Guest.GuestFullName

有许多Get-View选项适用于所有类型的VMware对象。随时探索所有这些选项,并查阅这篇VMware的信息文章,深入了解这个强大的cmdlet!

VMware代码捕获-从您的点击中学习

如果您想利用PowerCLI,但不想通过键入来构建代码,那么vCenter中的代码捕获为您提供了帮助。代码捕获是一个新的开发人员工具,其功能类似于Active Directory管理中心。让我们在这个PowerCLI教程中介绍一下代码捕获。

此工具记录您在GUI中执行的所有操作。然后,它会转换所有这些操作,并为您提供PowerCLI脚本。

默认情况下,代码捕获未启用。要启用它,请打开您的vCenter设备,并转到如下所示的菜单 -> 开发人员中心

Navigating to the Developer Center menu item in vSphere

一旦在开发人员中心选项卡上,切换启用代码捕获选项。

Enabling code capture

启用代码捕获后,您将在vCenter页眉中看到一个红色记录按钮。一旦启用,每当您希望记录并将其转换为PowerCLI输出的操作时,您必须通过点击记录按钮来记录GUI活动。

Code capture enabled indicator

红色的记录按钮将出现在您登录的vCenter用户部分旁边,以便您随时记录。

展示 Code Capture,通过 新建虚拟机 向导。

  1. 点击 录制 按钮开始录制。这将导致红色 录制 按钮开始闪烁。
  2. 右键单击您的 VMware 主机,然后 创建新虚拟机。按照生成的向导运行,使用所有默认值创建新虚拟机。
  3. 虚拟机创建完成后,点击录制按钮停止录制。

生成的输出可能比预期的更详细。输出甚至包括创建 VM 前在 GUI 中浏览的所有操作。但您应该看到在注释中以 CreateVM_Task 开头的部分。这是代码开始创建 VM 的地方。

以下是通过 Code Capture 在 GUI 中进行 创建 VM 任务 过程的 新建 VM 向导 输出的一部分:

Developer Center generated code

这个输出可能有点压倒,但它直接向您展示了可用于虚拟机的配置选项数量。根据您自己的需求,您现在有能力在自己的脚本中进行调整并进行自定义。

Code Capture 实用程序不仅限于 VM 创建。它还可以构建用于网络更改、小型 VM 修改或主机配置更改的代码。通过能够查看 GUI 操作的 PowerCLI 输出,您可以在将基础设施部署为代码的过程中节省时间。

PowerCLI 教程摘要

在这篇文章中,你涉及了很多内容。做得好!我希望你已经意识到 PowerCLI 带来的管理 VMware 基础设施的强大功能。

PowerCLI 中有很多 cmdlet,涵盖了广泛的产品基础,但在这里我们只涵盖了一些。请继续关注这个博客,以获取有关这个强大工具的更多文章!

更多阅读

Source:
https://adamtheautomator.com/powercli-tutorial/