Azure 虚拟机扩展是小型应用程序,可在Azure 虚拟机上提供部署后配置和自动化任务。 例如,如果虚拟机要求安装软件、防病毒保护或进行 Docker 配置,便可以使用 VM 扩展来完成这些任务。 可以使用 Azure CLI、PowerShell、Azure Resource Manager 模板和 Azure 门户运行 Azure VM 扩展。 扩展可与新虚拟机部署捆绑在一起,或者针对任何现有系统运行。
本文档提供虚拟机扩展的概述、使用虚拟机扩展的先决条件,以及有关如何检测、管理和删除虚拟机扩展的指南。 由于有许多 VM 扩展可用,每个扩展可能具有唯一的配置,因此本文档提供通用信息。 扩展特定的详细信息可在每个特定于单个扩展的文档中找到。
用例和示例
有许多不同的 Azure VM 扩展可用,每个都有特定用例。 一些示例用例包括:
- 使用适用于 Windows 的 DSC 扩展将 PowerShell 所需状态配置应用于虚拟机。 有关详细信息,请参阅 Azure Desired State configuration extension(Azure Desired State Configuration 扩展)。
- 使用 Datadog 扩展配置 Azure 基础结构监视功能。 有关详细信息,请参阅 Datadog 博客。
- 使用 Chef 配置 Azure 虚拟机。 有关详细信息,请参阅使用 Chef 自动执行 Azure 虚拟机部署。
除了进程特定的扩展外,自定义脚本扩展也可用于 Windows 和 Linux 虚拟机。 适用于 Windows 的自定义脚本扩展允许在虚拟机上运行任何 PowerShell 脚本。 在设计需要本机 Azure 工具无法提供的配置的 Azure 部署时,这很有用。 有关详细信息,请参阅 Windows VM 自定义脚本扩展。
先决条件
每个虚拟机扩展可能都有其自己的一组先决条件。 例如,Docker VM 扩展有支持的 Linux 分发的先决条件。 特定于扩展的文档中详细介绍了单个扩展的要求。
Azure VM 代理
Azure VM 代理可管理 Azure 虚拟机与 Azure 结构控制器之间的交互。 VM 代理负责部署和管理 Azure 虚拟机的许多功能层面,包括运行 VM 扩展。 Azure VM 代理预先安装在 Azure 应用商店映像上,并可安装在支持的操作系统上。
有关受支持的操作系统以及安装说明的信息,请参阅 Azure 虚拟机代理。
发现 VM 扩展
有许多不同的 VM 扩展可与 Azure 虚拟机配合使用。 若要查看完整列表,请使用 Azure Resource Manager PowerShell 模块运行以下命令。 运行此命令时请确保指定所需的位置。
Get-AzureRmVmImagePublisher -Location ChinaNorth | `
Get-AzureRmVMExtensionImageType | `
Get-AzureRmVMExtensionImage | Select Type, Version
运行 VM 扩展
Azure 虚拟机扩展可以在现有虚拟机上运行,当需要在已部署的 VM 上进行配置更改或恢复连接时,这很有用。 VM 扩展还可以与 Azure Resource Manager 模板部署捆绑。 在 Resource Manager 模板中使用扩展,可以在不进行部署后干预的情况下部署和配置 Azure 虚拟机。
可使用以下方法针对现有虚拟机运行扩展。
PowerShell
存在多个用于运行单个扩展的 PowerShell 命令。 若要查看列表,请运行以下 PowerShell 命令。
get-command Set-AzureRM*Extension* -Module AzureRM.Compute
此命令的输出如下所示:
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Set-AzureRmVMAccessExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMADDomainExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMAEMExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMBackupExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMBginfoExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMChefExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMCustomScriptExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMDiagnosticsExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMDiskEncryptionExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMDscExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMExtension 2.2.0 AzureRM.Compute
Cmdlet Set-AzureRmVMSqlServerExtension 2.2.0 AzureRM.Compute
以下示例使用自定义脚本扩展从 GitHub 存储库将脚本下载到目标虚拟机上,并运行该脚本。 有关自定义脚本扩展的详细信息,请参阅自定义脚本扩展概述。
Set-AzureRmVMCustomScriptExtension -ResourceGroupName "myResourceGroup" `
-VMName "myVM" -Name "myCustomScript" `
-FileUri "https://raw.githubusercontent.com/neilpeterson/nepeters-azure-templates/master/windows-custom-script-simple/support-scripts/Create-File.ps1" `
-Run "Create-File.ps1" -Location "China North"
在此示例中,VM 访问扩展用于重置 Windows 虚拟机的管理密码。 有关 VM 访问扩展的详细信息,请参阅重置 Windows VM 中的远程桌面服务。
$cred=Get-Credential
Set-AzureRmVMAccessExtension -ResourceGroupName "myResourceGroup" -VMName "myVM" -Name "myVMAccess" `
-Location ChinaNorth -UserName $cred.GetNetworkCredential().Username `
-Password $cred.GetNetworkCredential().Password -typeHandlerVersion "2.0"
Set-AzureRmVMExtension
命令可用于启动任何 VM 扩展。 有关详细信息,请参阅 Set-AzureRmVMExtension 参考。
Azure 门户
可通过 Azure 门户将 VM 扩展应用到现有虚拟机。 为此,请选择要使用的虚拟机,选择“扩展”,然后单击“添加”。 这会提供可用扩展的列表。 选择所需的扩展,并按照向导中的步骤进行操作。
下图显示了从 Azure 门户安装 Microsoft 反恶意软件扩展。
Azure Resource Manager 模板
VM 扩展可添加到 Azure Resource Manager 模板,并在部署模板的过程中执行。 使用模板部署扩展对于创建完全配置的 Azure 部署很有用。 例如,以下 JSON 取自一个 Resource Manager 模板,该模板将在每个 VM 上部署一组负载均衡虚拟机和一个 Azure SQL 数据库,并安装一个 .NET Core 应用程序。 VM 扩展负责安装软件。
有关详细信息,请参阅完整的 Resource Manager 模板。
{
"apiVersion": "2015-06-15",
"type": "extensions",
"name": "config-app",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', variables('vmName'),copyindex())]",
"[variables('musicstoresqlName')]"
],
"tags": {
"displayName": "config-app"
},
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.4",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
]
},
"protectedSettings": {
"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File configure-music-app.ps1 -user ',parameters('adminUsername'),' -password ',parameters('adminPassword'),' -sqlserver ',variables('musicstoresqlName'),'.database.chinacloudapi.cn')]"
}
}
}
有关详细信息,请参阅使用 Windows VM 扩展创作 Azure Resource Manager 模板。
保护 VM 扩展数据
运行 VM 扩展时,可能需要提供敏感信息,例如凭据、存储帐户名称和存储帐户访问密钥。 许多 VM 扩展包括用于对数据进行加密,并且仅在目标虚拟机内对数据进行解密的受保护配置。 每个扩展都有特定的受保护配置架构,在特定于扩展的文档中会详细介绍此架构。
以下示例显示适用于 Windows 的自定义脚本扩展的实例。 请注意,要执行的命令包含一组凭据。 在此示例中,不会加密要执行的命令。
{
"apiVersion": "2015-06-15",
"type": "extensions",
"name": "config-app",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', variables('vmName'),copyindex())]",
"[variables('musicstoresqlName')]"
],
"tags": {
"displayName": "config-app"
},
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.4",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
],
"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File configure-music-app.ps1 -user ',parameters('adminUsername'),' -password ',parameters('adminPassword'),' -sqlserver ',variables('musicstoresqlName'),'.database.chinacloudapi.cn')]"
}
}
}
将要执行的命令属性移动到受保护的配置,以保护执行字符串。
{
"apiVersion": "2015-06-15",
"type": "extensions",
"name": "config-app",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', variables('vmName'),copyindex())]",
"[variables('musicstoresqlName')]"
],
"tags": {
"displayName": "config-app"
},
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.4",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
]
},
"protectedSettings": {
"commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File configure-music-app.ps1 -user ',parameters('adminUsername'),' -password ',parameters('adminPassword'),' -sqlserver ',variables('musicstoresqlName'),'.database.chinacloudapi.cn')]"
}
}
}
排查 VM 扩展的问题
每个 VM 扩展都有特定的故障排除步骤。 例如,使用自定义脚本扩展时,可在运行该扩展的本地虚拟机上找到脚本执行详细信息。 任何特定于扩展的故障排除步骤均在特定于扩展的文档中详细说明。
以下故障排除步骤适用于所有虚拟机扩展。
查看扩展状态
针对虚拟机运行虚拟机扩展后,使用以下 PowerShell 命令返回扩展状态。 请将示例参数名称替换成自己的值。 Name
参数采用执行时提供给扩展的名称。
Get-AzureRmVMExtension -ResourceGroupName myResourceGroup -VMName myVM -Name myExtensionName
输出如下所示:
ResourceGroupName : myResourceGroup
VMName : myVM
Name : myExtensionName
Location : chinanorth
Etag : null
Publisher : Microsoft.Azure.Extensions
ExtensionType : DockerExtension
TypeHandlerVersion : 1.0
Id : /subscriptions/mySubscriptionIS/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/myExtensionName
PublicSettings :
ProtectedSettings :
ProvisioningState : Succeeded
Statuses :
SubStatuses :
AutoUpgradeMinorVersion : False
ForceUpdateTag :
此外,还可以在 Azure 门户中找到扩展执行状态。 如果要查看扩展的状态,请选择虚拟机,选择“扩展” ,并选择所需的扩展。
重新运行 VM 扩展
在某些情况下,可能需要重新运行虚拟机扩展。 可以通过删除扩展,并使用所选执行方法重新运行扩展来执行此操作。 若要删除扩展,请使用 Azure PowerShell 模块运行以下命令。 请将示例参数名称替换成自己的值。
Remove-AzureRmVMExtension -ResourceGroupName myResourceGroup -VMName myVM -Name myExtensionName
此外,还可以使用 Azure 门户删除扩展。 为此,请执行以下操作:
- 选择虚拟机。
- 选择“扩展” 。
- 选择所需的扩展。
- 选择“卸载” 。
常见 VM 扩展参考
扩展名称 | 说明 | 详细信息 |
---|---|---|
适用于 Windows 的自定义脚本扩展 | 针对 Azure 虚拟机运行脚本 | 适用于 Windows 的自定义脚本扩展 |
适用于 Windows 的 DSC 扩展 | PowerShell DSC (Desired State Configuration) 扩展 | 适用于 Windows 的 DSC 扩展 |
Azure 诊断扩展 | 管理 Azure 诊断 | Azure 诊断扩展 |
Azure VM 访问扩展 | 管理用户和凭据 | 适用于 Linux 的 VM 访问扩展 |
立即访问http://market.azure.cn