適用於 Windows 的虛擬機器擴充功能和功能

Azure 虛擬機器 (VM) 延伸模組是小型應用程式,可在 Azure VM 上提供部署後設定和自動化工作。 例如,如果虛擬機器需要軟體安裝、防毒保護,或能夠執行 VM 其中的指令碼,您可以使用 VM 擴充功能。

您可以使用 Azure CLI、PowerShell、Azure Resource Manager (ARM) 範本及 Azure 入口網站來執行 Azure VM 擴充功能。 您可以將延伸模組與新的 VM 部署搭配使用,或在任何現有的系統上加以執行。

本文提供 Azure VM 擴充功能的概觀,包括使用前的必要條件,以及如何偵測、管理和移除擴充功能的指導。 因為可用的 VM 延伸模組很多,本文提供通用的資訊。 每個擴充功能可能有唯一的設定及其自己的文件。

使用案例和範例

每個 Azure VM 延伸模組各有特定的使用案例。 以下列出一些範例:

除了處理序特定擴充功能,自訂指令碼延伸模組適用於 Windows 和 Linux 虛擬機器。 適用於 Windows 的自訂指令碼擴充功能可讓任何 PowerShell 指令碼在 VM 上執行。 自訂指令碼對於設計需要超過原生 Azure 工具可提供之設定的 Azure 部署很有用。

必要條件

檢閱下列使用 Azure VM 擴充功能的必要條件。

Azure VM 代理程式

若要處理 VM 上的擴充功能,您需要安裝適用於 Windows 的 Azure 虛擬機器代理程式。 此代理程式也稱為 Azure VM 代理程式或 Windows 客體代理程式。 當您準備安裝擴充功能時,請記住,某些擴充功能具有個別的必要條件,例如資源或相依性的存取權限。

Azure VM 代理程式管理 Azure VM 與 Azure 網狀架構控制器之間的互動。 代理程式負責有關部署和管理 Azure VM 的許多功能層面,包括執行 VM 延伸模組。

Azure VM 代理程式預先安裝在 Azure Marketplace 映像上。 也可以手動將代理程式安裝在支援的作業系統上。

代理程式在多個作業系統上執行。 不過,延伸模組架構對於延伸模組使用的作業系統有限制。 某些延伸模組並非在所有作業系統上都支援,可能發出錯誤碼 51 (「不支援的 OS」)。 請查看個別的擴充功能文件以了解支援度。

網路存取

延伸模組套件可從 Azure 儲存體延伸模組存放庫下載。 延伸模組狀態上傳會公佈至 Azure 儲存體。

如果您使用支援的 Azure VM 代理程式版本,則不需要允許存取 VM 區域中的 Azure 儲存體。 ECesv5您可以使用代理程式,將通訊重新導向 Azure 網狀架構控制器,以實現代理程式通訊 (在私人 IP 168.63.129.16 上經過特殊權限通道的 HostGAPlugin 功能)。 如果您在不支援的 VM 代理程式版本上,則必須允許從 VM 對外存取該區域中的 Azure 儲存體。

重要

如果您使用客體防火牆或透過 Proxy 封鎖 IP 位址 168.63.129.16 的存取,擴充功能會失敗。 即使您使用支援的 VM 代理程式版本或設定輸出存取,還是會發生失敗。 需要連接埠 80 和 32526。

代理程式只能用來下載擴充功能套件和報告狀態。 例如,如果延伸模組安裝需要從 GitHub 下載指令碼 (自訂指令碼延伸模組),或需要存取 Azure 儲存體 (Azure 備份),則您必須開放其他的防火牆或網路安全性群組 (NSG) 連接埠。 擴充功能本身就是應用程式,不同的擴充功能有不同的需求。 如果擴充功能需要存取 Azure 儲存體或 Microsoft Entra ID,您可以使用 Azure NSG 服務標籤來允許存取。

Azure VM 代理程式不提供 Proxy 伺服器支援,以啟用代理程式流量要求的重新導向。 Azure VM 代理程式依賴自訂 Proxy (如果有),以透過 IP 位址 168.63.129.16 存取網際網路或主機上的資源。

探索 VM 擴充功能

許多 VM 延伸模組適用於 Azure VM。 若要查看完整清單,請使用 Get-AzVMExtensionImage PowerShell Cmdlet。

下列命令列出美國西部區域位置中所有可用的 VM 擴充功能:

Get-AzVmImagePublisher -Location "West US" |
Get-AzVMExtensionImageType |
Get-AzVMExtensionImage | Select Type, Version

此命令提供類似如下的輸出:

Type                Version
----                -------
AcronisBackup       1.0.33
AcronisBackup       1.0.51
AcronisBackupLinux  1.0.33
AlertLogicLM        1.3.0.1
AlertLogicLM        1.3.0.0
AlertLogicLM        1.4.0.1

執行 VM 延伸模組

Azure 虛擬機器擴充功能可以在現有的虛擬機器上執行,這在需要進行組態變更或復原已部署虛擬機器上的連線時很有用。 VM 延伸模組也可以隨附於 ARM 範本部署。 延伸模組和 ARM 範本一起使用可讓您部署和設定 Azure VM,而且不需要在部署後介入。

您可以使用下列方法在現有的 VM 上執行延伸模組。

注意

下列部分範例會在命令中使用 "<placeholder>" 參數值。 執行每個命令之前,請務必以設定的特定值取代任何 "<placeholder>" 值。

PowerShell

有數個 PowerShell 命令可用來執行個別的擴充功能。 若要查看清單,請使用 Get-Command 命令並對擴充功能進行篩選:

Get-Command Set-Az*Extension* -Module Az.Compute

此命令提供類似如下的輸出:

CommandType     Name                                          Version    Source
-----------     ----                                          -------    ------
Cmdlet          Set-AzVMAccessExtension                       4.5.0      Az.Compute
Cmdlet          Set-AzVMADDomainExtension                     4.5.0      Az.Compute
Cmdlet          Set-AzVMAEMExtension                          4.5.0      Az.Compute
Cmdlet          Set-AzVMBackupExtension                       4.5.0      Az.Compute
Cmdlet          Set-AzVMBginfoExtension                       4.5.0      Az.Compute
Cmdlet          Set-AzVMChefExtension                         4.5.0      Az.Compute
Cmdlet          Set-AzVMCustomScriptExtension                 4.5.0      Az.Compute
Cmdlet          Set-AzVMDiagnosticsExtension                  4.5.0      Az.Compute
Cmdlet          Set-AzVMDiskEncryptionExtension               4.5.0      Az.Compute
Cmdlet          Set-AzVMDscExtension                          4.5.0      Az.Compute
Cmdlet          Set-AzVMExtension                             4.5.0      Az.Compute
Cmdlet          Set-AzVMSqlServerExtension                    4.5.0      Az.Compute
Cmdlet          Set-AzVmssDiskEncryptionExtension             4.5.0      Az.Compute

下列範例使用自訂指令碼延伸模組,從 GitHub 存放庫將指令碼下載至目標虛擬機器,然後執行指令碼。

Set-AzVMCustomScriptExtension -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 "<myVMregion>"

下列範例中使用 VMAccess 延伸模組,將 Windows VM 的系統管理密碼重設為暫時密碼。 執行此程式碼之後,您應該在第一次登入時重設密碼。

$cred=Get-Credential

Set-AzVMAccessExtension -ResourceGroupName "myResourceGroup" -VMName "myVM" -Name "myVMAccess" `
    -Location "myVMregion" -UserName $cred.GetNetworkCredential().Username `
    -Password $cred.GetNetworkCredential().Password -typeHandlerVersion "2.0"

您可以使用 Set-AzVMExtension 命令來啟動任何 VM 延伸模組。

Azure 入口網站

您可以透過 Azure 入口網站將 VM 延伸模組套用至現有的 VM。 在入口網站中選取 VM,選取 [擴充功能 + 應用程式],然後選取 [+ 新增]。 從可用的延伸模組清單中選擇您要的延伸模組,然後遵循精靈中的指示。

下列範例顯示從 Azure 入口網站安裝 Microsoft 反惡意程式碼擴充功能:

Screenshot of the dialog for installing the Microsoft Antimalware extension.

Azure Resource Manager 範本

您可以將 VM 延伸模組新增至 ARM 範本,然後隨著部署範本一起執行。 當您使用範本部署擴充功能時,可以建立完全設定的 Azure 部署。

下列 JSON 範例來自於 ARM 範本,可部署一組平衡負載的 VM 和 Azure SQL 資料庫,然後在每個 VM 上安裝 .NET Core 應用程式。 VM 擴充功能會處理軟體安裝。

{
    "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.9",
    "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.windows.net')]"
    }
    }
}

如需有關建立 ARM 範本的詳細資訊,請參閱 ARM 範本中的虛擬機器

協助保護 VM 延伸模組資料

執行 VM 延伸模組時,可能需要包含敏感性資訊,例如認證、儲存體帳戶名稱和存取金鑰。 許多虛擬機器擴充功能包含受保護的組態,其會加密資料並只在目標虛擬機器內加以解密。 每個擴充功能有特定受保護的組態結構描述,每個結構描述都會在擴充功能特定文件中詳細說明。

下列 JSON 範例會顯示適用於 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.9",
    "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.windows.net')]"
    }
    }
}

commandToExecute 屬性移至 protected 設定有助於保護執行字串,如下列範例所示:

{
    "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.9",
    "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.windows.net')]"
    }
    }
}

在使用延伸模組的 Azure 基礎結構即服務 (IaaS) VM 上,在憑證主控台,您可能會看到主旨為 Windows Azure CRP Certificate Generator 的憑證。 在傳統 RedDog 前端 (RDFE) VM 上,這些憑證的主旨名稱為 Windows Azure Service Management for Extensions

在傳輸延伸模組使用的受保護設定 (密碼和其他認證) 期間,這些憑證保護 VM 及其主機之間的通訊。 Azure 網狀架構控制器建立憑證,並傳遞至 Azure VM 代理程式。 如果您每天停止和啟動 VM,網狀架構控制器可能會建立新憑證。 憑證儲存在電腦的個人憑證存放區。 您可以刪除這些憑證。 Azure VM 代理程式會視需要重新建立憑證。

如何更新代理程式和延伸模組

代理程式和延伸模組共用相同的自動更新機制。

當有更新可用且已啟用自動更新時,只有在擴充功能或其他 VM 模型變更之後,才會在 VM 上安裝更新。 變更可能包括:

  • 資料磁碟
  • 擴充
  • 延伸模組標籤
  • 開機診斷容器
  • 客體作業系統祕密
  • VM 大小
  • 網路設定檔

發行者會在各種時間提供區域更新。 您可以在不同版本的不同區域中有 VM。

注意

有些更新可能需要額外的防火牆規則。 如需詳細資訊,請參閱網路存取

列出部署至 VM 的擴充功能

您可以使用下列命令來列出部署至 VM 的擴充功能:

$vm = Get-AzVM -ResourceGroupName "<myResourceGroup>" -VMName "<myVM>"
$vm.Extensions | select Publisher, VirtualMachineExtensionType, TypeHandlerVersion

此命令所產生的輸出與下列範例類似:

Publisher             VirtualMachineExtensionType          TypeHandlerVersion
---------             ---------------------------          ------------------
Microsoft.Compute     CustomScriptExtension                1.9

代理程式更新

Azure VM 代理程式只包含「延伸模組處理程式碼」。 「Windows 佈建程式碼」另外提供。 您可以解除安裝 Azure VM 代理程式。 您無法停用 Azure VM 代理程式的自動更新。

擴充功能處理程式碼負責下列作業:

  • 與 Azure 網狀架構通訊
  • 處理 VM 擴充功能作業,例如安裝、報告狀態、更新個別擴充功能,以及移除擴充功能。 更新項目包含「延伸模組處理程式碼」的安全性修正程式、Bug 修正程式和增強功能。

若要查看您執行的版本,請參閱偵測 Azure VM 代理程式

擴充功能更新

當有擴充功能更新可用且已啟用自動更新時,如果有 VM 模型變更,Azure VM 代理程式會下載並升級擴充功能。

自動延伸模組更新分為「次要」或「Hotfix」兩種。 當您佈建延伸模組時,您可以接受或拒絕次要更新。 下列範例示範如何使用 "autoUpgradeMinorVersion": true, 參數,以自動升級 ARM 範本中的次要版本:

    "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.9",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
        ]
    },

若要取得最新的次要版本 Bug 修正程式,強烈建議您在延伸模組部署中一律選取自動更新。 您無法拒絕含有安全性或重大 Bug 修正程式的 Hotfix 更新。

如果您停用自動更新,或需要升級主要版本,請使用 Set-AzVMExtension 命令並指定目標版本。

如何識別擴充功能更新

有幾種方式可以識別擴充功能的更新。

在 VM 上識別延伸模組是否設定了 autoUpgradeMinorVersion

您可以檢視 VM 模型,以判斷擴充功能是否已使用 autoUpgradeMinorVersion 參數布建。 若要查看 VM 模型,請使用 Get-AzVM 令命,並提供資源群組和 VM 名稱,如下所示:

 $vm = Get-AzVm -ResourceGroupName "myResourceGroup" -VMName "myVM"
 $vm.Extensions

下列範例輸出顯示 autoUpgradeMinorVersion 參數設定為 true

ForceUpdateTag              :
Publisher                   : Microsoft.Compute
VirtualMachineExtensionType : CustomScriptExtension
TypeHandlerVersion          : 1.9
AutoUpgradeMinorVersion     : True

識別何時發生 autoUpgradeMinorVersion 事件

若要查看擴充功能何時更新,請在 VM 的 C:\WindowsAzure\Logs\WaAppAgent.log 中檢閱代理程式記錄。

下列範例顯示已安裝 Microsoft.Compute.CustomScriptExtension 版本 1.8 的 VM,以及適用於版本 1.9的 Hotfix。

[INFO]  Getting plugin locations for plugin 'Microsoft.Compute.CustomScriptExtension'. Current Version: '1.8', Requested Version: '1.9'
[INFO]  Auto-Upgrade mode. Highest public version for plugin 'Microsoft.Compute.CustomScriptExtension' with requested version: '1.9', is: '1.9'

代理程式權限

若要執行其作業,Azure VM 代理程式必須以本機系統的形式執行。

針對 VM 擴充功能進行疑難排解

每個 VM 延伸模組可能有特定的疑難排解步驟。 例如,當您使用自訂指令碼擴充功能時,您可以在執行擴充功能的 VM 本機上找到指令碼執行詳細資料。

下列疑難排解步驟適用於所有 VM 延伸模組:

  • 若要查看 Azure VM 代理程式記錄,請在 C:\WindowsAzure\Logs\WaAppAgent.log 中查看佈建延伸模組時的活動。

  • 在 C:\WindowsAzure\Logs\Plugins<extensionName> 中查看延伸模組記錄,以取得更多詳細資訊。

  • 如需錯誤碼、已知問題及延伸模組特有的其他資訊,請參閱延伸模組特有文件中的疑難排解章節。

  • 查看系統記錄。 檢查有無其他作業干擾延伸模組,例如,需要獨佔存取套件管理員的另一個應用程式安裝太久。

  • 在 VM 中,如果現有的擴充功能發生佈建失敗狀態,則無法安裝其他任何新的擴充功能。

擴充功能失敗的常見原因

以下是擴充功能可能會失敗的一些常見原因:

  • 延伸模組可執行 20 分鐘。 (例外狀況是自訂指令碼、Chef 和 DSC,其有 90 分鐘。)如果您的部署超過此時間,則會將其標示為逾時。 此問題可能是因為 VM 的資源不足,或當擴充功能嘗試佈建時,其他 VM 設定或啟動工作耗用大量資源。

  • 不符合最低必要條件。 某些擴充功能具有對虛擬機器 SKU 的相依性,例如 HPC 映像。 延伸模組可能有特定的網路存取需求,例如與 Azure 儲存體或公用服務進行通訊。 其他例子包括存取封裝存放庫、磁碟空間不足或安全性限制。

  • 獨佔存取套件管理員。 在某些情況下,長時間執行的 VM 設定和延伸模組安裝都需要獨佔存取套件管理員,可能發生衝突。

檢視擴充功能狀態

在 VM 上執行 VM 擴充功能之後,請使用 Get-AzVM 命令來傳回擴充功能狀態。 Substatuses[0] 結果顯示擴充功能佈建成功,表示已成功部署至 VM。 如果出現 Substatuses[1] 結果,表示在 VM 內執行擴充功能失敗。

Get-AzVM -ResourceGroupName "myResourceGroup" -VMName "myVM" -Status

輸出類似於下列範例:

Extensions[0]           :
  Name                  : CustomScriptExtension
  Type                  : Microsoft.Compute.CustomScriptExtension
  TypeHandlerVersion    : 1.9
  Substatuses[0]        :
    Code                : ComponentStatus/StdOut/succeeded
    Level               : Info
    DisplayStatus       : Provisioning succeeded
    Message             : Windows PowerShell \nCopyright (C) Microsoft Corporation. All rights reserved.\n
  Substatuses[1]        :
    Code                : ComponentStatus/StdErr/succeeded
    Level               : Info
    DisplayStatus       : Provisioning succeeded
    Message             : The argument 'cseTest%20Scriptparam1.ps1' to the -File parameter does not exist. Provide the path to an existing '.ps1' file as an argument to the

-File parameter.
  Statuses[0]           :
    Code                : ProvisioningState/failed/-196608
    Level               : Error
    DisplayStatus       : Provisioning failed
    Message             : Finished executing command

您也可以在 Azure 入口網站中查明延伸模組執行狀態。 選取 VM,選取 [延伸模組],然後選取所需的延伸模組。

重新執行 VM 擴充功能

在某些情況下,您可能需要重新執行 VM 擴充功能。 您可以藉由移除擴充功能,然後使用您所選的執行方法重新執行擴充功能,來重新執行擴充功能。 若要移除擴充功能,請使用 Remove-AzVMExtension 命令,如下所示:

Remove-AzVMExtension -ResourceGroupName "myResourceGroup" -VMName "myVM" -Name "myExtensionName"

您也可以在 Azure 入口網站中移除擴充功能。 選取 VM,選取 [擴充功能],然後選取所需的擴充功能。 選取解除安裝

常見的 VM 擴充功能參考

下表提供 VM 擴充功能的一些常見參考。

延伸模組名稱 描述
Windows 的自訂指令碼延伸模組 對「Azure 虛擬機器」執行指令碼。
適用於 Windows 的 DSC 延伸模組 將 PowerShell Desired State Configuration 套用至虛擬機器。
Azure 診斷擴充功能 管理「Azure 診斷」。
VMAccess 延伸模組 管理使用者和認證。

下一步

如需 VM 延伸模組的詳細資訊,請參閱 Azure 虛擬機器延伸模組和功能