PowerCLI教程:管理VMware基礎設施

VMWare的PowerCLI正在成為ESXi支援硬體的虛擬機管理員的普遍介面。學習如何通過PowerShell和PowerCLI來管理VMware,將成為您工具包中的強大補充。在這個PowerCLI教程中,您將學習如何做到這一點。

在這個教程中,您將學習到:

  • 如何用PowerCLI連接到VMware基礎架構的基礎知識
  • 熟悉用於操作VMware對象的cmdlets
  • 擁有探索的知識來賦予自己權力
  • 進一步通過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主機名

審查完成後,可以使用Export-CSV cmdlet將其編譯成CSV文件。

使用PowerCLI檢查虛擬機

現在讓我們在這個 PowerCLI 教程中深入探討另一個主題,通過查看虛擬主機來查看目前在給定的 ESXi 主機上存在哪些虛擬機器。

您可以使用 Get-VM 命令來查看虛擬機器的信息。

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

該命令的輸出如下所示:

PS51> Get-VMHost -Name | Get-VM

上面的輸出提供了給定主機上目前正在運行的虛擬機器的完整狀態列表。如果您選擇不指定單個主機,就像我上面所做的那樣,您將收到每個後續主機以及每個主機上的虛擬機器的信息表。

如果您在解決問題或需要知道給定主機上的虛擬機器數量,或者需要使用 VMware PowerCLI 收集 ESXi 主機信息,您可以使用這些命令。您手邊擁有的報告功能正開始擴展!

使用 PowerCLI 檢查虛擬交換機

對於那些負責配置或管理 vCenter 集群虛擬網絡的人員,有一整套的網絡命令可以應對任何使用情景。如果您想查看在您的 vSphere 環境中配置的虛擬交換機,您將使用以下命令:

PS51> Get-VirtualSwitch

根據您擁有的虛擬網絡和虛擬交換機的數量,您的結果列表可能會相當大。在我的情況下,如下所示,我有一個名為 DSwitch 的分佈式虛擬交換機(Distributed Virtual Switch)。

在企業vSphere實施中,當集群中有多個ESXi主機時,DSwitches可以簡化虛擬交換機和端口組的部署。它可以在多個具有相同配置的主機之間節省手動創建相同網絡配置的工作量,是擴展集群的好方法!

Get-VirtualSwitch

使用PowerCLI查找連接到虛擬網絡的虛擬機

在嘗試縮小問題範圍時,您可能想知道哪些虛擬機連接到哪些網絡。要找出這一點,您可以使用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)中的所有虛擬機,可以運行以下腳本。請確保將DPortGroup的值替換為您的虛擬端口組的名稱。

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

在這個一行命令中,我們正在獲取存在於此vCenter設備中的所有虛擬機的列表,然後使用Where-Object命令過濾只有網絡名稱與我們的端口組相匹配的虛擬機。

Getting VMs with only a specific port group

通過這個輸出,您將能夠確定每個網絡連接和配置的機器。

當被要求定位並分析哪些虛擬機連接到VMware中的特定網絡時,現在您可以提供一個PowerCLI報告解決方案來回答這個問題。

使用PowerCLI獲取虛擬機的操作系統版本信息

VMware內部的大部分管理工作都在虛擬機層級進行。您可能會收到無數的任務請求,例如檢索所有虛擬機上硬盤大小的列表,或者獲取所有服務器的客戶操作系統版本,等等。

這些任務在大規模上是繁瑣的。PowerCLI可以通過幾個重要的命令來簡化這些任務,讓我們在這個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命令檢索虛擬機列表,使用PowerShell的Sort-Object命令對該列表進行排序,然後使用PowerCLI的Get-View命令檢索一些對象屬性。

在我的環境中運行此代碼將產生以下結果。您可以在vCenter中看到虛擬機的名稱,配置的操作系統(VMware虛擬硬件對待客戶操作系統的方式),以及實際的運行的操作系統

Finding VMs based on various criteria

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

使用 PowerCLI 创建 CSV 报告

VMware Tools 是针对 Windows 和 Linux VM 的客户端服务,为虚拟机监视程序提供附加信息和管理功能。最常见的功能包括干净关机、操作系统信息和更高分辨率的虚拟机控制台。

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。该命令允许您检查连接到虚拟机的虚拟硬盘的信息。

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

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 文件名是有价值的。

例如,如果您发现一个常见问题,所有虚拟机硬盘都位于同一数据存储卷上,这些知识可能加快故障排除速度。

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

除了查看虛擬機器的硬碟資訊之外,您可能還想檢查虛擬網路適配器的資訊。要檢查單個虛擬機器的這些屬性,您可以使用 Get-NetworkAdapter cmdlet。

PS51> Get-NetworkAdapter -VM myVM

雖然您之前在這個端口中已經查詢了所有位於同一網路中的虛擬機器,但這次您只想查看連接到特定虛擬機器的適配器。

Get-NetworkAdapter

這在疑難排解連接了多個網路適配器的虛擬機器時很有用。您可以快速且一目了然地確定這些適配器是否連接到正確的網路。

使用 Invoke-VMScript 在虛擬機器中運行 PowerShell 腳本

使用 Invoke-VMScript,您還可以直接在虛擬機器內運行 PowerShell 代碼,而無需網路連接。如果您曾在 Hyper-V 環境中使用 PowerShell 直接,這將是一個類似的體驗。

與創建 PowerShell 遠程會話或使用 Invoke-Command cmdlet 透過網路不同,Invoke-VMScript cmdlet 可以直接將命令發送到虛擬機器,而無需正常的 WinRM 或 SSH 連接。

例如,也許您想在名為 exchange1 的虛擬機器上執行一個簡單的目錄列表。為此,您將以下內容作為 ScriptText 參數的值傳遞: dir C:\

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

結果就像你從VM控制台本身運行命令一樣。Invoke-VMScript然後傳遞在VM上運行的命令返回的所有輸出。

Invoke-VMScript

雖然這只是一個基本的例子,但你可以變得復雜起來。這個PowerCLI命令允許你在ScriptText參數內指定批處理、PowerShell或Bash類型。

你也可以變得更高級。下面你可以看到如何使用Invoke-VMScript使用單獨的$script變量作為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利用许多不同的查询来提供漂亮而简单的Get-VM输出。但是,在使用Get-View cmdlet时,有很多隐藏的功能。

您可能会看到很多使用此cmdlet的脚本。花点时间熟悉一下这个命令吧。为了熟悉它,请使用Get-View cmdlet获取一些虚拟机信息(在此示例中为exchange1)。

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

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

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

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 Code Capture – 從您的點擊中學習

如果您想利用PowerCLI,但不想通過輸入代碼進行構建,vCenter中的Code Capture就是為您而設。Code Capture是一個新的開發者工具,類似於Active Directory管理中心。讓我們在這個PowerCLI教程中介紹Code Capture。

此工具記錄您在GUI中執行的所有操作。然後,它將所有這些操作轉換為PowerCLI腳本。

默認情況下,Code Capture是關閉的。要打開它,打開您的vCenter虛擬機器並導航至菜單 -> 開發者中心,如下所示。

Navigating to the Developer Center menu item in vSphere

一旦進入開發者中心選項卡,切換啟用Code Capture選項。

Enabling code capture

啟用Code Capture後,您將在vCenter標頭中看到一個紅色的記錄按鈕。啟用後,每當您希望將操作記錄並轉換為PowerCLI輸出時,必須通過點擊記錄按鈕來記錄GUI活動。

Code capture enabled indicator

紅色的記錄按鈕將出現在您的vCenter登錄用戶部分旁邊,這樣您現在可以隨時進行記錄。

要展示 Code Capture,請通過 新建虛擬機 創建嚮導。

  1. 點擊 記錄 按鈕開始錄製。這將導致紅色 記錄 按鈕開始閃爍。
  2. 右鍵點擊您的 VMware 主機,然後 創建新的虛擬機。運行生成的嚮導,使用所有默認值創建新的虛擬機。
  3. 虛擬機創建完成後,點擊記錄按鈕並停止錄製。

生成的輸出可能比預期的更冗長。該輸出甚至包括在創建虛擬機之前瀏覽 GUI 的所有操作。但您應該看到一個以 CreateVM_Task 開頭的註釋部分。這是代碼開始創建虛擬機的地方。

以下是透過 Code Capture 在 GUI 中的 新建虛擬機嚮導 過程中 CreateVM_Task 輸出的一部分:

Developer Center generated code

這個輸出可能有點讓人不知所措,但它直接暴露了您的虛擬機可用的配置選項數量。根據您自己的需求,您現在可以在自己的腳本中進行調整並自定義。

Code Capture 實用程序不僅限於虛擬機創建。它還可以為網絡更改、小型虛擬機修改或主機配置更改構建代碼。通過能夠查看 GUI 操作的 PowerCLI 輸出,您可以在通往基礎架構部署為代碼的旅程中節省時間。

PowerCLI 教程摘要

在這篇文章中,你涵蓋了很多內容。做得好!我希望你已經意識到 PowerCLI 為管理 VMware 基礎架構帶來的強大力量。

PowerCLI 中有很多命令,涵蓋了廣泛的產品範疇,但我們在這裡只涵蓋了一部分。請繼續關注本博客,以了解更多關於這個令人驚嘆的工具的文章!

進一步閱讀

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