DevTest Labs の VM に成果物を追加する
この記事では、Azure DevTest Labs の仮想マシン (VM) に "成果物" を追加する方法について説明します。 成果物では、Windows PowerShell スクリプトの実行、Bash コマンドの実行、ソフトウェアのインストールなど、VM をプロビジョニングするためのアクションが指定されています。 パラメーターを使用することで、独自のニーズに合わせて成果物をカスタマイズできます。
DevTest Labs の成果物は、パブリックな DevTest Labs Git リポジトリまたはプライベートの Git リポジトリから取得できます。 独自のカスタム成果物を作成してリポジトリに格納するには、カスタム成果物の作成に関する記事をご覧ください。 ラボのユーザーがカスタム成果物にアクセスできるよう、成果物リポジトリをラボに追加するには、「DevTest Labs でラボにアーティファクト リポジトリを追加する」をご覧ください。
DevTest Labs のラボの所有者は、ラボのすべての VM にインストールする必須の成果物を作成時に指定できます。 詳しくは、「Azure DevTest Labs のラボに対する必須成果物を指定する」をご覧ください。
VM の作成時に必須の成果物を変更または削除することはできませんが、利用できる個々の成果物を追加することはできます。 この記事では、Azure portal または Azure PowerShell を使って、使用可能な成果物を VM に追加する方法について説明します。
Azure portal から VM に成果物を追加する
VM の作成時に成果物を追加したり、ラボの既存の VM に成果物を追加したりできます。
VM の作成時に成果物を追加するには:
ラボのホーム ページで、[追加] を選びます。
[ベースの選択] ページで、目的の VM の種類を選びます。
[ラボ リソースの作成] 画面で、[成果物を追加または削除] を選びます。
[成果物の追加] ページで、VM に追加する各成果物の横にある矢印を選びます。
[成果物の追加] の各ペインで、必須と省略可能のパラメーターの値を入力して、[OK] を選びます。 成果物が [選択した成果物] の下に表示され、構成されている成果物の数が更新されます。
追加した後で成果物を変更できます。
- 既定では、成果物は追加した順序でインストールされます。 順序を調整するには、[選択した成果物] の一覧の成果物の横にある省略記号 [...] を選んでから、[上へ移動]、[下へ移動]、[先頭へ移動]、または [一番下へ移動] を選びます。
- 成果物のパラメーターを編集するには、[編集] を選んで [成果物の追加] ペインをもう一度開きます。
- [選択した成果物] の一覧から成果物を削除するには、[削除] を選びます。
成果物の追加と調整が済んだら、[OK] を選びます。
[ラボ リソースの作成] 画面に、追加された成果物の数が表示されます。 VM を作成する前に成果物を追加、編集、再配置、または削除するには、もう一度 [成果物を追加または削除] を選びます。
VM を作成すると、インストールされた成果物が VM の [成果物] ページに表示されます。 各成果物のインストールに関する詳細を見るには、成果物名を選びます。
既存の VM に成果物をインストールするには:
ラボのホーム ページで、[自分の仮想マシン] の一覧から VM を選びます。
VM ページで、上部のメニュー バーまたは左側のナビゲーションの [成果物] を選びます。
[成果物] ページで、[成果物の適用] を選びます。
[成果物の追加] ページで、新しい VM の場合と同じように成果物を選んで構成します。
成果物の追加が済んだら、[インストール] を選びます。 すぐに成果物が VM にインストールされます。
Azure PowerShell を使用して VM に成果物を追加する
Note
Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を始めるには、Azure PowerShell のインストールに関する記事をご覧ください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。
次の PowerShell スクリプトでは、Invoke-AzResourceAction コマンドレットを使用して成果物が VM に適用されます。
#Requires -Module Az.Resources
param
(
[Parameter(Mandatory=$true, HelpMessage="The ID of the subscription that contains the lab")]
[string] $SubscriptionId,
[Parameter(Mandatory=$true, HelpMessage="The name of the lab that has the VM")]
[string] $DevTestLabName,
[Parameter(Mandatory=$true, HelpMessage="The name of the VM")]
[string] $VirtualMachineName,
[Parameter(Mandatory=$true, HelpMessage="The repository where the artifact is stored")]
[string] $RepositoryName,
[Parameter(Mandatory=$true, HelpMessage="The artifact to apply to the VM")]
[string] $ArtifactName,
[Parameter(ValueFromRemainingArguments=$true)]
$Params
)
# Set the appropriate subscription
Set-AzContext -SubscriptionId $SubscriptionId | Out-Null
# Get the lab resource group name
$resourceGroupName = (Get-AzResource -ResourceType 'Microsoft.DevTestLab/labs' | Where-Object { $_.Name -eq $DevTestLabName}).ResourceGroupName
if ($resourceGroupName -eq $null) { throw "Unable to find lab $DevTestLabName in subscription $SubscriptionId." }
# Get the internal repository name
$repository = Get-AzResource -ResourceGroupName $resourceGroupName `
-ResourceType 'Microsoft.DevTestLab/labs/artifactsources' `
-ResourceName $DevTestLabName `
-ApiVersion 2016-05-15 `
| Where-Object { $RepositoryName -in ($_.Name, $_.Properties.displayName) } `
| Select-Object -First 1
if ($repository -eq $null) { "Unable to find repository $RepositoryName in lab $DevTestLabName." }
# Get the internal artifact name
$template = Get-AzResource -ResourceGroupName $resourceGroupName `
-ResourceType "Microsoft.DevTestLab/labs/artifactSources/artifacts" `
-ResourceName "$DevTestLabName/$($repository.Name)" `
-ApiVersion 2016-05-15 `
| Where-Object { $ArtifactName -in ($_.Name, $_.Properties.title) } `
| Select-Object -First 1
if ($template -eq $null) { throw "Unable to find template $ArtifactName in lab $DevTestLabName." }
# Find the VM in Azure
$FullVMId = "/subscriptions/$SubscriptionId/resourceGroups/$resourceGroupName`
/providers/Microsoft.DevTestLab/labs/$DevTestLabName/virtualmachines/$virtualMachineName"
$virtualMachine = Get-AzResource -ResourceId $FullVMId
# Generate the artifact id
$FullArtifactId = "/subscriptions/$SubscriptionId/resourceGroups/$resourceGroupName`
/providers/Microsoft.DevTestLab/labs/$DevTestLabName/artifactSources/$($repository.Name)`
/artifacts/$($template.Name)"
# Handle the input parameters to pass through
$artifactParameters = @()
# Fill the artifact parameter with the additional -param_ data and strip off the -param_
$Params | ForEach-Object {
if ($_ -match '^-param_(.*)') {
$name = $_ -replace '^-param_'
} elseif ( $name ) {
$artifactParameters += @{ "name" = "$name"; "value" = "$_" }
$name = $null #reset name variable
}
}
# Create a structure to pass the artifact data to the action
$prop = @{
artifacts = @(
@{
artifactId = $FullArtifactId
parameters = $artifactParameters
}
)
}
# Apply the artifact
if ($virtualMachine -ne $null) {
# Apply the artifact by name to the virtual machine
$status = Invoke-AzResourceAction -Parameters $prop -ResourceId $virtualMachine.ResourceId -Action "applyArtifacts" -ApiVersion 2016-05-15 -Force
if ($status.Status -eq 'Succeeded') {
Write-Output "##[section] Successfully applied artifact: $ArtifactName to $VirtualMachineName"
} else {
Write-Error "##[error]Failed to apply artifact: $ArtifactName to $VirtualMachineName"
}
} else {
Write-Error "##[error]$VirtualMachine was not found in the DevTest Lab, unable to apply the artifact"
}