[Azure][PowerShell]透過 PowerShell 快速大量的建立 VM (1/2)

都有需要透過指令一次批次產生許多類似的 VM ,透過 Azure Cloud Shell zure Cloud Shell 下利用 PowerShell 來建立效果蠻好的。

這一陣子剛好有需要教一些 SQL Server 的管理,但上課環境的電腦因為已經有先安裝一些其他東西,又不方便移除,因此想說是否可以讓大家使用 Azure VM zure VM 來練習呢 ? 原本是想採用 Azure Lab Services,但可能是我資質太笨了,一值沒有辦法順利的來建立合適的環境,剛好看到 Azure Code Shell,測試一下還蠻不錯的,因此就先拿這個來試試看了。

因為整個 Script 會稍微有點多,所以我將文章切成兩個部分,在這個部份我先說明一下我會使用到的指令和使用的 Cloud Shell Shell,而在下一次就會把這篇文章的指令串起來,利用迴圈的方式整批建立、開啟和關閉。

在這裡我使用一個 Azure 新的服務 - Cloud Shell,您可以登入這個服務之後,透過互動的方式來執行PowerShell 的指令,快速地透過指令來管理 Azure。既然要使用,那我們就要先透過 https://shell.azure.com/powershell 這個網址來做登入。

如果您是第一次使用的話,在輸入帳號和密碼之後,會出現以下的畫面,再您的訂閱下去建立一個存放您的專屬環境的 Storage,如果您有特別要去指定使用哪個資源群組或儲存體名稱,可以透過進階設定去調整,這裡我就不做改變,直接選「Create Storage」的按鈕去處理。由於在建立 Storage 之後,Cloud Shell 會去建立一個大約 6GB 的檔案在 File 內,因此會需要花上一點時間去建立。

基本上建立好之後,後續登入就不會有這個步驟,速度就會很快了。


建立一個 Azure VM 需要好幾個步驟,我大致整理一下

下面我會先直接在 Cloud Shell 下面去用指令先去建立一個 VM,用來確定相關指令是否都可以正常使用。

1. 因為在 Azure Resource Management 的模式下,因此我們要先建立「資源群組」,然後建立「連線規則」的設定 ( 這個不能單獨存在,因此只能先設定好規則,建立網路安全群組的時候套用此項設定 ),建立好之後在建立「網路安全群組」,並且搭配剛剛建立的連線規則。所以我們會分別用到三個指令來建立

New-AzResourceGroup 

New-AzNetworkSecurityRuleConfig

New-AzNetworkSecurityGroup

2. 接著測試用指令來建立「虛擬網路」,因此這裡會先設定好一組「子網路設定 」( 跟連線規則一樣,只是先設定好子網路,然後建立虛擬網路的時候套用此項設定 ),然後再用指令去建立「虛擬網路」,因此這個部分我們會需要用到兩個 PowerShell 的指令來進行

New-AzVirtualNetworkSubnetConfig

New-AzVirtualNetwork

3. 接下來就要建立「公用 IP」和「虛擬網卡」,在建立公用 IP 的時候,因為懶得寄每一個 VM 的 IP 位置,所以會指定網域名稱,但要記住這個部分只能使用小寫字母和數字。這個部分主要會用到以下兩個指令

New-AzPublicIpAddress

New-AzNetworkInterface

4. 前面建立完相關資源之後,接下來就要來預備要建立的 VM,下面會透過一些指令,準備好我們要產生的 VM 的規格,但還沒有正式去建立。這一段要用到的指令會比較雜一點,我們先從前面建立 VM 登入的認證資訊,這裡先透過 PCCredential 這個函數,將帳號和密碼合併成為一個認證,放到 VM 的設定檔內。而在產生 VM 設定的時候,一開始我們先只有指定它的名稱和大小 ( 透過 New-AzVMConfig ),接著就將前面產生的認證加入 ( 透過 Set-AzVMOperatingSystem ),然後指定 VM 的 Image mage 要用甚麼樣的版本,這裡我們指定使用 Windows 2016 DataCenter 的版本 ( 透過 Set-AzVMSourceImage ),接著將前面第 3 步驟所建立的虛擬網卡指定到 VM 內 ( 透過 Set-AzVMNetworkInterface ),接著指定 VM 開機的時候不儲存開機偵測 ( 透過 Set-AzVMBootDiagnostic ),最後則是指定我們的磁碟是採用受控磁碟,並且存放在 HDD 的規格上 ( Set-AzVMBootDiagnostic ),因此在這一個部分我們會用到比較多的指令來做處理。

5. 最後一個步驟,就是建立 VM 出來,這裡最主要是透過 New-AzVM ,並且指定剛剛前面第 4 步驟所設定的參數,來進行建立,因此這個最後一個步驟會花上比較多的時間。因此要是沒有特別意外的話,應該就可以順利地建立起 VM 了。

我們最後透過 Azure Portal 檢查一下,果然相關資源都順利給建好了

最後我把相關的指令都整理一下

# 建立資源群組
New-AzResourceGroup -ResourceGroupName TEST -Location EastAsia

# 建立可允許連線規格
$rdpRule = New-AzNetworkSecurityRuleConfig -Name rdp-rule -Description "Allow RDP" `
   -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 `
   -SourceAddressPrefix Internet -SourcePortRange * `
   -DestinationAddressPrefix * -DestinationPortRange 3389


# 建立安全性群組
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName TEST `
  -Location eastasia -Name TEST-NSG -SecurityRules $rdpRule


# 設定子網路參數
$subnet = New-AzVirtualNetworkSubnetConfig -Name TEST-vmSubnet `
    -AddressPrefix "10.0.1.0/25" -NetworkSecurityGroup $nsg -WarningAction SilentlyContinue

# 建立虛擬網路
$vnet = New-AzVirtualNetwork -Name Test-VNet -ResourceGroupName Test `
    -Location EastAsia -AddressPrefix "10.0.1.0/24" -Subnet $subnet `
    -WarningAction SilentlyContinue

# 建立公用 IP
$pip = New-AzPublicIpAddress -ResourceGroupName TEST -Location EastAsia  `
  -Name TEST-ip -AllocationMethod Static -DomainNameLabel testvm20191124

# 建立虛擬網卡
$nic = New-AzNetworkInterface -ResourceGroupName TEST -Location EastAsia  `
  -Name TEST-nic -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id

# 建立認證資料
$pwd='Pa$$w0rd123456'| ConvertTo-SecureString -Force -AsPlainText # Admin 密碼
$cred=New-Object PSCredential("vmadmin",$pwd)

# 設立 VM 相關參數
$vmConfig = New-AzVMConfig -VMName TEST-vm -VMSize Standard_DS2_V2 
$vmConfig | Set-AzVMOperatingSystem -Windows -ComputerName TEST -Credential $cred -TimeZone "Taipei Standard Time" 
$vmConfig | Set-AzVMSourceImage -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2016-Datacenter -Version latest
$vmConfig | Add-AzVMNetworkInterface -Id $nic.Id 
$vmConfig | Set-AzVMBootDiagnostic -Disable 
$vmConfig | Set-AzVMOSDisk -Name TEST-osdisk -Caching ReadWrite -StorageAccountType "Standard_LRS" -CreateOption FromImage 

# 建立 VM
New-AzVM  -ResourceGroupName TEST -Location EastAsia  `
 -VM $vmConfig