この記事では、Azure PowerShell を使用してラボに Azure DevTest Labs 仮想マシン (VM) を作成する方法について説明します。 PowerShell スクリプトを使用して、ラボ VM の作成を自動化できます。
前提条件
この記事を実行するには、次の前提条件が必要です。
- DevTest Labs のラボへのアクセス。 ラボを作成するか、既存のラボを使用します。
- Azure PowerShell。 Azure PowerShell をインストールするか、Azure portal で Azure Cloud Shell を使用 します。
PowerShell VM 作成スクリプト
PowerShell Invoke-AzResourceAction コマンドレットは、ラボのリソース ID と VM パラメーターを使用して createEnvironment
アクションを呼び出します。 パラメーターは、すべての VM プロパティを含むハッシュ テーブル内にあります。 プロパティは、VM の種類ごとに異なります。 目的の VM の種類のプロパティを取得するには、「 VM のプロパティを取得する」を参照してください。
このサンプル スクリプトでは、Windows Server 2019 Datacenter VM を作成します。 このサンプルには、 dataDiskParameters
の下に 2 つ目のデータ ディスクを追加するプロパティも含まれています。
[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 Portal の Azure Resource Manager (ARM) テンプレートから取得するか、DevTest Labs Azure REST API を呼び出すことによって取得できます。
Azure portal を使用して VM のプロパティを取得する
Azure portal で VM を作成すると、VM のプロパティを示す Azure Resource Manager (ARM) テンプレートが生成されます。 VM ベースを選択すると、実際に VM を作成することなく、ARM テンプレートを表示し、プロパティを取得できます。 この方法は、その種類のラボ VM がまだない場合に、JSON VM の説明を取得する最も簡単な方法です。
Azure portal のラボの [概要] ページで、上部のツール バーの [追加] を選択します。
[ ベースの選択 ] ページで、目的の VM の種類を選択します。 ラボの設定に応じて、VM ベースには Azure Marketplace イメージ、カスタム イメージ、数式、または環境を指定できます。
[ ラボ リソースの作成 ] ページで、必要に応じて アーティファクトを追加 し、[基本設定] タブと [詳細設定] タブで必要なその他の 設定 を 構成 します。
[ 詳細設定 ] タブで、ページの下部にある [ARM テンプレートの表示 ] を選択します。
[ Azure Resource Manager テンプレートの表示 ] ページで、VM を作成するための JSON テンプレートを確認します。 resources セクションには、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 } ] } } } } ],
将来の PowerShell 自動化で使用するテンプレートをコピーして保存し、プロパティを PowerShell VM 作成スクリプトに転送します。
DevTest Labs Azure REST API を使用して VM のプロパティを取得する
DevTest Labs REST API を呼び出して、既存のラボ VM のプロパティを取得することもできます。 これらのプロパティを使用して、同じ種類のラボ VM をさらに作成できます。
- [ 仮想マシン -] リスト ページで、最初のコード ブロックの上にある [ 試してみる ] を選択します。
-
REST API の [試してみる] ページで、次の手順を実行します。
- labName で、ラボ名を入力します。
- labResourceGroup で、ラボ リソース グループ名を入力します。
- subscriptionId で、ラボの Azure サブスクリプションを選択します。
- [実行] を選択します。
- [本文] の [応答] セクションで、ラボ内のすべての既存の VM のプロパティを表示します。
VM の有効期限を設定する
トレーニング、デモ、試用版のシナリオでは、特定の日付に VM を自動的に削除することで、不要なコストを回避できます。 VM expirationDate
プロパティは、VM の作成時に設定できます。 この記事の前半の PowerShell VM 作成スクリプトでは、 properties
の有効期限を設定します。
"expirationDate": "2022-12-01"
PowerShell を使用して、既存の VM の有効期限を設定することもできます。 次の PowerShell スクリプトは、既存のラボ VM に有効期限がまだない場合に有効期限を設定します。
# 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