你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将项目添加到开发测试实验室 VM

本文介绍如何将项目添加到 Azure 开发测试实验室虚拟机 (VM)。 项目指定预配 VM 时要执行的操作,例如运行 Windows PowerShell 脚本、运行 Bash 命令或安装软件。 可以根据自己的需要使用参数来自定义项目。

开发测试实验室项目可以来自公共开发测试实验室 Git 存储库,也可以来自专用 Git 存储库。 若要创建自己的自定义项目并将其存储在存储库中,请参阅创建自定义项目。 若要将项目存储库添加到实验室,以便实验室用户可以访问自定义项目,请参阅将项目存储库添加到实验室

开发测试实验室的实验室所有者可以在创建时指定要在所有实验室 VM 上安装的必需项目。 有关详细信息,请参阅为开发测试实验室 VM 指定必需项目

无法在 VM 创建时更改或删除必需项目,但可以添加任何可用的单个项目。 本文介绍如何使用 Azure 门户或 Azure PowerShell 将可用项目添加到 VM。

从 Azure 门户向 VM 添加项目

可以在创建 VM 的过程中添加项目,或将项目添加到现有实验室 VM。

若要在 VM 创建过程中添加项目,请执行以下操作:

  1. 在实验室的主页上,选择“添加”。

  2. 在“选择基础映像”页面上,选择所需的 VM 类型。

  3. 在“创建实验室资源”屏幕上,选择“添加或删除项目”。

  4. 在“添加项目”页面上,选择要添加到 VM 的每个项目旁边的箭头。

  5. 在每个“添加项目”窗格中,输入任何必需和可选的参数值,然后选择“确定”。 项目显示在“选定的项目”下,并且配置的项目数会更新。

    显示如何在“添加项目”窗格上添加项目的屏幕截图。

  6. 可在添加项目后对其进行更改。

    • 默认情况下,项目按其添加顺序进行安装。 若要重新排列顺序,请在“选定的项目”列表中选择项目旁边的省略号“…”,然后选择“上移”、“下移”、“移至顶部”或“移至底部”。
    • 若要编辑项目的参数,请选择“编辑”,重新打开“添加项目”窗格。
    • 若要从“选定的项目”列表中删除项目,请选择“删除”。
  7. 完成添加和排列项目后,选择“确定”。

  8. “创建实验室资源”屏幕显示添加的项目数量。 要在创建 VM 之前添加、编辑、重新排列或删除项目,请再次选择“添加或删除项目”。

创建 VM 后,已安装的项目会显示在 VM 的“项目”页面上。 若要查看有关每个项目安装的详细信息,请选择项目名称。

若要在现有 VM 上安装项目,请执行以下操作:

  1. 在实验室的主页上,从“我的虚拟机”列表中选择 VM。

  2. 在 VM 页面上,选择顶部菜单栏或左侧导航中的“项目”。

  3. 在“项目”页面上,选择“应用项目”。

    显示现有 VM 的“项目”窗格的屏幕截图。

  4. 在“添加项目”页面上,选择和配置与新 VM 相同的项目。

  5. 完成项目添加后,选择“安装”。 项目会立即安装在 VM 上。

使用 Azure PowerShell 将项目添加到 VM

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 若要开始,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

以下 PowerShell 脚本使用 Invoke-AzResourceAction cmdlet 将项目应用于 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"
}

后续步骤