[Azure][PowerShell]透過 PowerShell 快速大量的建立 VM 補充說明

把增加資料磁碟和繁體中文語言套件給加入

繼前幾天整理的「透過 PowerShell 快速大量的建立 VM (1/2)」和 「透過 PowerShell 快速大量的建立 VM (2/2)」這兩篇之後,陸續因為開課和測試,都有一些建立 VM 的處理,但雖然前面兩篇可以建立好 VM ,但是並沒有建立資料磁碟和安裝繁體中文語言套件,因此就感覺有點不足,因此就整理一下這幾天的測試,把這兩個部份給加上。


首先是增加資料磁碟,這個腳本就比較簡單一點,基本上搭配 New-AzDiskConfig、New-AzDisk 去處理就可以了,因此設定起來蠻容易的。

$resourceGroup = "TEST"   # 資源群組
$location = "EastAsia"    # 區域
$diskcount = 1            # VM 數量  

# 設定資料磁碟的規格
$diskconfig = New-AzDiskConfig -Location $location -DiskSizeGB 64 -AccountType Standard_LRS -CreateOption Empty 

$allvms = Get-AzVM -ResourceGroupName $resourceGroup

foreach ($vm in $allvms) {
    $name = $vm.Name.SubString(0,$vm.Name.Length-3) 

    for($i = 0; $i -lt $diskcount  ; $i++)  
    {
        $diskname = $name + '-datadisk' + ([string]$i).PadLeft(2,'0')
        $disk = New-AzDisk -ResourceGroupName $vm.ResourceGroupName -DiskName $diskname -Disk $diskconfig    
        $vm = Add-AzVMDataDisk -VM $vm -Name $diskname -CreateOption Attach -ManagedDiskId $disk.Id -Lun $i -Caching ReadWrite   
    }    
    Update-AzVM -VM $vm -ResourceGroupName $vm.ResourceGroupName -AsJob
}

原本我是在每個 VM 增加八個資料磁碟,但利用等量磁碟合併成一個大磁碟的時候,效能因為 VM 等級,並沒有太多的提升,因此後來我就乾脆只開一個,反正就只是單純測試。但如果您的 VM 是比較高的等級的時候,倒是可以利用等量磁碟的方式來磁碟 I/O 的速度。


至於安裝中文語系套件,這一點就有點小麻煩,因此在網路上爬文之後,利用安裝「延伸模組」 (Custom Extend ) 的方式來進行。

在下面的腳本 serverbuild.ps1 中,會用到一個設定檔 TWRegion.xml 繁體中文語言套件 x64fre_Server_zh-tw_lp.cab,設定檔我就把它放在 github 上面,而語言套件因為檔案比較大,所以我就放在 Azure Storage 上面,搭配 CDN 來下載使用。

# Script to define regional settings on Azure Virtual Machines deployed from the market place
# Author: Alexandre Verkinderen
# Modifier : James Fu
#
######################################33

#variables
$regionalsettingsURL = "https://raw.githubusercontent.com/5L2FStudio/Azure/master/101-ServerBuild/TWRegion.xml"
$RegionalSettings = "D:\TWRegion.xml"

$languagepackURL = "https://a1cdnpoint.azureedge.net/tools/windows2016/x64fre_Server_zh-tw_lp.cab"
$LanguagePack = "D:\x64fre_Server_zh-tw_lp.cab"

#downdload regional settings file
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::TLS12
$webclient = New-Object System.Net.WebClient
$webclient.DownloadFile($regionalsettingsURL,$RegionalSettings)
$webclient.DownloadFile($languagepackURL,$LanguagePack)

# Install Language Pack
Dism /online /Add-Package /PackagePath:$LanguagePack

# Set Locale, language etc. 
& $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"$RegionalSettings`""

# Set languages/culture. Not needed perse.
Set-WinSystemLocale zh-TW
Set-WinUserLanguageList -LanguageList zh-TW -Force
Set-Culture -CultureInfo zh-TW
Set-WinHomeLocation -GeoId 237
Set-TimeZone -Name "Taipei Standard Time"

# restart virtual machine to apply regional settings to current user. You could also do a logoff and login.
Start-sleep -Seconds 40
Restart-Computer

當有上面的腳本和設定檔,都放在 github 上面之後,那麼接下來就要在 Cloud Shell 上面,指定 VM 來套用

$resourceGroup = "TEST"   # 資源群組
$location = "EastAsia"    # 區域

$allvms = Get-AzVM -ResourceGroupName $resourceGroup

foreach ($vm in $allvms) {
  $vm| Start-AzVM

  Set-AzVMCustomScriptExtension -ResourceGroupName $resourceGroup `
    -VMName $vm.Name `
    -Location $location `
    -FileUri "https://raw.githubusercontent.com/5L2FStudio/Azure/master/101-ServerBuild/serverbuild.ps1" `
    -Run "serverbuild.ps1" `
    -Name TaiwanLanguagePack
}

透過上述的處理,會花比較長的時間,主要是安裝中文語言套件會比較慢一點。

原本我希望安裝好之後,可以預設為繁體中文,但這個部分都還是沒有辦法順利,因此我在第一次登入 VM 之後,就還需要開啟 DOS 視窗來執行以下的指令

PowerShell

Set-WinUILanguageOverride -Language zh-TW

Restart-Computer

這樣下次開起的時候就會是繁體中文的環境了。


ps. 謝謝 lucas 的提醒, 原本的程式碼內 Set-WinHomeLocation 的時候 , 台灣地區的代碼應該是 237 , 修改的時候沒有注意到 , 謝謝朋友的提醒。