跳到主要內容區塊

ntuccepaper2019

專題報導

以vSphere PowerCLI管理與佈署VM
  • 卷期:v0050
  • 出版日期:2019-09-20

作者:林子南/臺灣大學計算機及資訊網路中心作業管理組幹事


VMWare提供各種方式管理VM,如Resource Pool、HA、DRS、vApp等自動移轉或依序啟動VM,極盡可能地自動化所有管理與佈署,但都是制式化功能,對於需要另行設定或複雜叢集的系統來說稍嫌不足。

透過vSphere PowerCLI能夠達到快速佈署與管理VM,透過撰寫Script,除了能夠達到客製化的自動化,也能夠調用Guest OS的指令來進行複雜的設定,結合VMWare原生的功能,能夠更有效且方便的自動佈署與管理。

 

介紹

vSphere PowerCLI(以下簡稱PowerCLI)是VMWare提供用來管理vSphere的Powershell模組,由於VM具有容易快速佈署與管理的特性,透過PowerCLI能夠更有效地佈署VM並提供服務。

PowerCLI能夠管理所有與vSphere相關的設定,如同vSphere Client管理一般,依照階層順序可以分為:(1) 管理Datacenter、(2)管理Cluster(包含Resource Pool、HA、DRS、vApp)、(3)管理VM Host、(4)管理VM、(5)管理Guest(VM上的作業系統),搭配Powershell Script就能夠自動化管理。

 

 

本文著重在用PowerCLI管理與佈署VM和Guest,網路相關設定(IP、DNS)可以透過vApp的IP配置原則與Datacenter的IP集區自動化設定,有別於vApp和Datacenter的管理與分配網路相關設定功能,PowerCLI透過調用Guest OS的指令,能夠彌補vApp所無法達到的細節處理。

 

 

PowerCLI

vApp

設定IP

O

O

(vApp的IP配置原則與Datacenter的IP集區,由vCenter Server分配)

設定DNS

O

O

(Datacenter的IP集區)

加入Domain

O

(必須在OVF上預先設定且須搭配change SID)

佈署服務設定

O

(必須在OVF上預先設定)

加入現有服務叢集

O

X

(vApp不支援針對OS上的特定服務設定)

 

 

 

常用指令

 

 

常用指令除了connect-viserver、get-vm、get-cluster、get-datacenter等連接vCenter或取得VM的指令之外,本文著重管理與佈署VM和Guest的指令:

 

1. 佈署VM相關指令:
有別於vApp佈署VM需要使用OVF,以PowerCLI佈署VM需要先有Template或以建立好的VM,並透過套用OS Spec來設定Account、IP、DNS、變更SID、所屬Domain,最後產生新的VM:

  • New-Template
  • Get-Template
  • New-OSCustomizationSpec
  • Get-OSCustomizationSpec
  • New-OSCustomizationNicMapping
  • Get-OSCustomizationNicMapping
  • Set-OSCustomizationNicMapping
  • New-VM

2. 管理與設定VM:
在Guest OS上進行任何設定前,可以透過建立Snapshot來保留還原點,這比備份更具有彈性,可以建立Guest運作狀態的還原點,不同於一般的備份還原需要經過冷啟動,還原時也不需要重新開機,透過設定VM能及時還原到建立Snapshot的時間點:

  • Get-Snapshot
  • New-Snapshot
  • Set-VM

 

3. 監控校能:
有鑑於Cluster的HA與DRS已經能夠有效地依效能搬遷VM到適合的VM Host上,主要需要監控校能是為了適當地增加VM來分散單一台VM的壓力,由於VM無法在”開啟電源狀態(PoweredOn)”下調整Memory和CPU,當服務壓力大時(CPU或Memory耗竭)或預期服務壓力將會過大時,可以適當地增加VM來增進服務效能:

  • Get-StatType
  • Get-StatInterval
  • Get-Stat

 

4. 修改Guest OS內部設定或執行指令: "
Guest OS必須要有安裝VMWare Tools且VM必須是「開啟電源狀態(PoweredOn)」,主要可以分為( 1 )使用Guest OS的帳號或( 2 )VM Host的帳號來執行指令,因為實驗環境裡已經有Directory Server且已經建立Domain,因此以Guest OS的帳號下指令會比較適合,除了可以保持帳號行為能夠被追蹤之外,也可以確保Guest OS與VM Host之間能確實隔離(由於應用複雜需仰賴Guest OS的搭配,不適合在情境中解說):

 

Invoke-VMScript

 

情境指令

為了更好地介紹指令適合的使用時機,以下用簡略的實驗環境與情境來說明。

 

實驗環境

在PC上安裝vSphere Client和PowerCLI,並確保Powershell可以使用和與vCenter Server之間的網路有通。

 

以VM架設一個Domain(labs.local),由vApp管理這些VM,這邊為了避免vCenter Server被存取,將vApp的IP配置原則設定為「固定」 (不自動發配IP),以Windows作業系統作為Guest OS,由Load Balancer指定一組Private IP對應到一個Public IP,兩台Web Server與一台資料庫提供網頁服務,由Directory Server管理使用者帳號與服務帳號。

 

 

 

情境一

列出所有VM的作業系統版本並統計數量,篩選特定的Web Server:

 > $VMs = Get-VApp -Name "vApp" | Get-VM

 > $VMs | select Name,@{n="OS";e={$_.Guest.OSFullName}}

 > $VMs | select Name,@{n="OS";e={$_.Guest.OSFullName}} | Group-Object -Property OS

 > $vm = $VMs | Where {$_.name -like "Web Server 1"}

 

情境二

列出Web Server 1過去30天的CPU、Memory、Network Traffic並輸出到.CSV檔:

 > $vm | Get-StatType

 > $vm | Get-Stat -Stat cpu.usage.average,mem.usage.average,net.usage.average -start (Get-Date).AddDays(-30) | Export-CSV -Path "$(Get-Date -Format yyyyMMdd).csv"

 

 

情境三

在大量HTTP Request進來或預期將會有大量HTTP Request近來,導致Web Server 1和2的 CPU、Memory、File System全部占用,進而服務品質低落的情況下,透過PowerCLI參考Web Server 1的設定新增Web Server 3進Domain,以維持或提升服務的品質,由於不靠vCenter分配IP,因此需要手動設定<NEW_IP>、<NEW_MASK>、<NEW_DEFAULTGATEWAY>。

使用Customized Spec來設定Guest,在第一次開啟電源後,會自動重新開機2次與每次間隔約2分鐘,之後就能作為及時戰力使用:

 > $vm = Get-VM -Name "Web Server 1"

 > $domain_name = $vm.Guest.HostName -split "\."

 > $domain_name = $domain_name[1..$domain_name.count] -join "."

 > $os_spec = New-OSCustomizationSpec -Name "Web Server 3 Spec" -ChangeSid -OSType Windows -DnsServer $vm.ExtensionData.Guest.Net.DnsConfig.IpAddress -FullName Administrator -Domain $domain_name -TimeZone 220 -NamingScheme "VM" -orgname "test" -DomainCredent (Get-Credential)

 > $os_spec | Get-OSCustomizationNicMapping | Set-OSCustomizationNicMapping -IpMode UseStaticIP -IpAddress <NEW_IP> - SubnetMask <NEW_MASK> -DefaultGateway <NEW_DEFAULTGATEWAY> - Dns $vm.ExtensionData.Guest.Net.Dnsconfig.Ipaddress

 > New-VM -Name "Web Server 3" -VM $vm -OSCustomizationSpec $os_spec -Datastore ($vm | get-datastore).Name -Vapp $vm.VApp -VMHost ($vm | Get-VMHost)

 

 

 

 

情境四

Guest OS需要進行每月的更新,在更新以前對所有VM依年月日建立Snapshot,來保留能正常提供服務的還原點:

 > $VMs | New-Snapshot -Name "$(Get-Date -Format yyyyMMdd) before   patching"

如果發現更新導致Web Server 1服務異常時,需要還原到最新的Snapshot(由於這個情境較為簡單,因此不附圖說明):

 > $vm = $VMs | Where {$_.name -eq "Web Server 1"}

 > $vm | Set-VM -Snapshot (Get-Snapshot -VM $vm  | Sort -Property $_.Created)[0]