作者:林子南/臺灣大學計算機及資訊網路中心作業管理組幹事
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]
|