共用方式為


使用 Azure PowerShell 建立 DevTest Labs VM

本文說明如何使用 Azure PowerShell,在實驗室中建立Azure DevTest Labs 虛擬機器 (VM)。 您可以使用 PowerShell 指令碼將實驗室 VM 建立自動化。

必要條件

您需要下列必要條件才能完成本文的步驟:

PowerShell VM 建立指令碼

PowerShell Invoke-AzResourceAction Cmdlet 會使用實驗室的資源識別碼和 VM 參數來叫用 createEnvironment 動作。 參數位於包含所有 VM 屬性的雜湊表中。 每個類型 VM 的屬性均不同。 若要取得您想要的 VM 類型屬性,請參閱取得 VM 屬性

此範例指令碼會建立 Windows Server 2019 Datacenter VM。 此範例也包含屬性,才能在 dataDiskParameters 下方新增第二個資料磁碟。

[CmdletBinding()]

Param(
[Parameter(Mandatory = $false)]  $SubscriptionId,
[Parameter(Mandatory = $true)]   $LabResourceGroup,
[Parameter(Mandatory = $true)]   $LabName,
[Parameter(Mandatory = $true)]   $NewVmName,
[Parameter(Mandatory = $true)]   $UserName,
[Parameter(Mandatory = $true)]   $Password
)

pushd $PSScriptRoot

try {
    if ($SubscriptionId -eq $null) {
        $SubscriptionId = (Get-AzContext).Subscription.SubscriptionId
    }

    $API_VERSION = '2016-05-15'
    $lab = Get-AzResource -ResourceId "/subscriptions/$SubscriptionId/resourceGroups/$LabResourceGroup/providers/Microsoft.DevTestLab/labs/$LabName"

    if ($lab -eq $null) {
       throw "Unable to find lab $LabName resource group $LabResourceGroup in subscription $SubscriptionId."
    }

    $virtualNetwork = @(Get-AzResource -ResourceType  'Microsoft.DevTestLab/labs/virtualnetworks' -ResourceName $LabName -ResourceGroupName $lab.ResourceGroupName -ApiVersion $API_VERSION)[0]

    #The preceding command puts the VM in the first allowed subnet in the first virtual network for the lab.
    #If you need to use a specific virtual network, use | to find the network. For example:
    #$virtualNetwork = @(Get-AzResource -ResourceType  'Microsoft.DevTestLab/labs/virtualnetworks' -ResourceName $LabName -ResourceGroupName $lab.ResourceGroupName -ApiVersion $API_VERSION) | Where-Object Name -EQ "SpecificVNetName"

    $labSubnetName = $virtualNetwork.properties.allowedSubnets[0].labSubnetName

    #Prepare all the properties needed for the createEnvironment call.
    # The properties are slightly different depending on the type of VM base.
    # The virtual network setup might also affect the properties.

    $parameters = @{
       "name"      = $NewVmName;
       "location"  = $lab.Location;
       "properties" = @{
          "labVirtualNetworkId"     = $virtualNetwork.ResourceId;
          "labSubnetName"           = $labSubnetName;
          "notes"                   = "Windows Server 2019 Datacenter";
          "osType"                  = "windows"
          "expirationDate"          = "2022-12-01"
          "galleryImageReference"   = @{
             "offer"     = "WindowsServer";
             "publisher" = "MicrosoftWindowsServer";
             "sku"       = "2019-Datacenter";
             "osType"    = "Windows";
             "version"   = "latest"
          };
          "size"                    = "Standard_DS2_v2";
          "userName"                = $UserName;
          "password"                = $Password;
          "disallowPublicIpAddress" = $true;
          "dataDiskParameters" = @(@{
            "attachNewDataDiskOptions" = @{
                "diskName" = "adddatadisk"
                "diskSizeGiB" = "1023"
                "diskType" = "Standard"
                }
          "hostCaching" = "ReadWrite"
          })
       }
    }

    #The following line has the same effect as invoking the
    # https://azure.github.io/projects/apis/#!/Labs/Labs_CreateEnvironment REST API

    Invoke-AzResourceAction -ResourceId $lab.ResourceId -Action 'createEnvironment' -Parameters $parameters -ApiVersion $API_VERSION -Force -Verbose
}
finally {
   popd
}

將上述指令碼儲存在名為 Create-LabVirtualMachine.ps1 的檔案中。 使用下列命令執行指令碼。 在預留位置中輸入您自己的值。

.\Create-LabVirtualMachine.ps1 -ResourceGroupName '<lab resource group name>' -LabName '<lab name>' -userName '<VM administrative username>' -password '<VM admin password>' -VMName '<VM name to create>'

取得 VM 屬性

本節說明如何取得您想要建立 VM 類型的特定屬性。 您可以從 Azure 入口網站取得 Azure Resource Manager (ARM) 範本的屬性,或呼叫 DevTest Labs Azure REST API。

使用 Azure 入口網站來取得 VM 屬性

在 Azure 入口網站中建立 VM 會產生 Azure Resource Manager (ARM) 範本,用於顯示 VM 的屬性。 選擇 VM 基底之後,您可以查看 ARM 範本並取得屬性,無須實際建立 VM。 如果您還沒有該類型的實驗室 VM,則此方法是取得 JSON VM 描述的最簡單方式。

  1. Azure 入口網站的實驗室 [概觀] 頁面上,選取頂端工具列上的 [新增]

  2. 在 [選擇基底] 頁面上,選取您想要的 VM 類型。 視實驗室設定而定,VM 基底可以是 Azure Marketplace映像、自訂映像、公式或環境。

  3. 在 [建立實驗室資源] 頁面上,可選擇性新增 Artifacts,並在 [基本設定] 與 [進階設定] 索引標籤上設定其他任何您要的設定。

  4. 在 [進階設定]索引標籤上,選取頁面底部的 [檢視 ARM 範本]

  5. 在 [檢視 Azure Resource Manager 範本] 頁面上,檢閱 JSON 範本以建立 VM。 [資源] 區段具有 VM 屬性。

    例如,下列 resources 區段具有 Windows Server 2022 Datacenter VM 的屬性:

      "resources": [
           {
                "apiVersion": "2018-10-15-preview",
                "type": "Microsoft.DevTestLab/labs/virtualmachines",
                "name": "[variables('vmName')]",
                "location": "[resourceGroup().location]",
                "properties": {
                     "labVirtualNetworkId": "[variables('labVirtualNetworkId')]",
                     "notes": "Windows Server 2022 Datacenter: Azure Edition Core",
                     "galleryImageReference": {
                          "offer": "WindowsServer",
                          "publisher": "MicrosoftWindowsServer",
                          "sku": "2022-datacenter-azure-edition-core",
                          "osType": "Windows",
                          "version": "latest"
                     },
                     "size": "[parameters('size')]",
                     "userName": "[parameters('userName')]",
                     "password": "[parameters('password')]",
                     "isAuthenticationWithSshKey": false,
                     "labSubnetName": "[variables('labSubnetName')]",
                     "disallowPublicIpAddress": true,
                     "storageType": "Standard",
                     "allowClaim": false,
                     "networkInterface": {
                          "sharedPublicIpAddressConfiguration": {
                               "inboundNatRules": [
                                    {
                                         "transportProtocol": "tcp",
                                         "backendPort": 3389
                                    }
                               ]
                          }
                     }
                }
           }
      ],
    
  6. 複製並儲存範本以在未來的 PowerShell 自動化中使用,並將屬性傳送至 PowerShell VM 建利指令碼。

使用 DevTest Labs Azure REST API 來取得 VM 屬性

您也可以呼叫 DevTest Labs REST API,以取得現有實驗室 VM 的屬性。 您可以使用這些屬性來建立更多相同類型的實驗室 VM。

  1. 在 [虛擬機器 - 清單] 頁面上,選取第一個程式碼區塊上方的 [試用]
  2. 在 [REST API 試用] 頁面上:
    • 在 [labName] 下輸入您的實驗室名稱。
    • 在 [labResourceGroup] 下輸入實驗室資源群組名稱。
    • 在 [subscriptionId]下選取實驗室的 Azure 訂用帳戶。
  3. 選取執行
  4. 在 [本文] 下的 [回應] 區段檢視實驗室中所有現有 VM 的屬性。

設定 VM 到期日

在訓練、示範和試用案例中,您可以藉由在特定日期自動刪除 VM 來避免不必要的成本。 您可以在建立 VM 時設定 VM 的 expirationDate 屬性。 本文稍早的 PowerShell VM 建立指令碼會在 properties 底下設定到期日:

  "expirationDate": "2022-12-01"

您也可以使用 PowerShell 在現有的 VM 上設定到期日。 如果現有實驗室 VM 還沒有到期日,可使用下列 PowerShell 指令碼設定到期日:

# Enter your own values:
$subscriptionId = '<Lab subscription Id>'
$labResourceGroup = '<Lab resource group>'
$labName = '<Lab name>'
$VmName = '<VM name>'
$expirationDate = '<Expiration date, such as 2022-12-16>'

# Sign in to your Azure account

Select-AzSubscription -SubscriptionId $subscriptionId
$VmResourceId = "subscriptions/$subscriptionId/resourcegroups/$labResourceGroup/providers/microsoft.devtestlab/labs/$labName/virtualmachines/$VmName"

$vm = Get-AzResource -ResourceId $VmResourceId -ExpandProperties

# Get the Vm properties
$VmProperties = $vm.Properties

# Set the expirationDate property
If ($VmProperties.expirationDate -eq $null) {
    $VmProperties | Add-Member -MemberType NoteProperty -Name expirationDate -Value $expirationDate -Force
} Else {
    $VmProperties.expirationDate = $expirationDate
}

Set-AzResource -ResourceId $VmResourceId -Properties $VmProperties -Force

下一步

Az.DevTestLabs PowerShell 參考