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

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

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

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

使用案例和範例

每個 Azure VM 延伸模組各有特定的使用案例。 範例包含:

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

必要條件

Azure Linux 代理程式

若要處理虛擬機器上的延伸模組,您需要安裝 Azure Linux 代理程式。 某些個別的擴充會有先決條件,例如可存取資源或相依性。

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

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

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

網路存取

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

如果您使用支援的 Azure Linux 代理程式版本,則不需要允許存取 VM 區域中的 Azure 儲存體。 您可以使用代理程式將通訊重新導向至 Azure 網狀架構控制器以進行代理程式通訊。 如果您在不支援的代理程式版本上,則必須允許從 VM 對外存取該區域中的 Azure 儲存體。

重要

如果您已使用客體防火牆來禁止存取私人 IP 位址 168.63.129.16,則即使使用支援的代理程式版本,或已設定輸出存取,延伸模組仍會失敗。

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

Azure Linux 代理程式必須有 Proxy 伺服器支援,才能重新導向代理程式流量要求。 不過,此 Proxy 伺服器支援不會套用擴充功能。 您必須個別設定每個擴充功能,才能與 Proxy 搭配使用。

探索 VM 擴充功能

許多 VM 延伸模組適用於 Azure VM。 若要查看完整清單,請使用 az vm extension image list。 下列範例列出 westus 位置中所有可用的擴充功能:

az vm extension image list --location westus --output table

執行 VM 延伸模組

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

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

Azure CLI

您可以使用 az vm extension set 命令,針對現有 VM 執行 Azure 虛擬機器延伸模組。 下列範例會針對名為 myResourceGroup 的資源群組中、名為 myVM 的虛擬機器,執行「自訂指令碼」延伸模組。 請以您自己的資訊取代範例資源群組名稱、VM 名稱以及要執行的指令碼 (https://raw.githubusercontent.com/me/project/hello.sh)。

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"fileUris": ["https://raw.githubusercontent.com/me/project/hello.sh"],"commandToExecute": "./hello.sh"}'

當擴充功能正確執行時,輸出會類似下列範例:

info:    Executing command vm extension set
+ Looking up the VM "myVM"
+ Installing extension "CustomScript", VM: "mvVM"
info:    vm extension set command OK

Azure PowerShell

您可以使用 Set-AzVMExtension 命令,針對現有 VM 執行 Azure 虛擬機器延伸模組。 下列範例會針對名為 myResourceGroup 的資源群組中、名為 myVM 的虛擬機器,執行「自訂指令碼」延伸模組。 請以您自己的資訊取代範例資源群組名稱、VM 名稱以及要執行的指令碼 (https://raw.githubusercontent.com/me/project/hello.sh)。

$Params = @{
    ResourceGroupName  = 'myResourceGroup'
    VMName             = 'myVM'
    Name               = 'CustomScript'
    Publisher          = 'Microsoft.Azure.Extensions'
    ExtensionType      = 'CustomScript'
    TypeHandlerVersion = '2.1'
    Settings          = @{fileUris = @('https://raw.githubusercontent.com/me/project/hello.sh'); commandToExecute = './hello.sh'}
}
Set-AzVMExtension @Params

當擴充功能正確執行時,輸出會類似下列範例:

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK

Azure 入口網站

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

下圖顯示如何從 Azure 入口網站安裝適用於 Linux 的自訂指令碼延伸模組:

Screenshot of the dialog for installing the Custom Script extension for Linux.

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/', concat(variables('vmName'),copyindex()))]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
    }
}

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

協助保護 VM 延伸模組資料

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

下列範例會顯示適用於 Linux 的自訂指令碼延伸模組執行個體。 要執行的命令包含一組認證。 在此範例中,要執行的命令不加密。

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ],
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

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

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ]
    },
    "protectedSettings": {
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

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

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

當有更新可用且已啟用自動更新時,只有在延伸模組變更或其他 VM 模型變更之後,才會在 VM 上安裝更新,例如:

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

發行者在不同時間提供區域可用的更新,因此,您的 VM 在不同區域中可能是不同版本。

注意

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

代理程式更新

Linux 虛擬機器代理程式在一個套件中包含「佈建代理程式程式碼」和「延伸模組處理程式碼」。 兩者無法分開。

您可以在您想要使用 cloud-init 在 Azure 上佈建時,停用佈建代理程式

支援的代理程式版本可以使用自動更新。 唯一可以更新的程式碼是「延伸模組處理程式碼」,不是佈建代理程式程式碼。 「佈建代理程式程式碼」是只會執行一次的程式碼。

延伸模組處理程式碼負責:

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

安裝代理程式時,會建立父代精靈。 然後,此父代會繁衍子處理序,用來處理延伸模組。 如果代理程式有可用的更新,則會下載該更新。 父代會停止子處理序、將其升級,然後再將其重新啟動。 如果有更新問題,父處理序會回復為上一個子系版本。

父處理序無法自動更新。 父處理序只能透過發佈套件更新來進行更新。

若要檢查您正在執行哪個版本,請檢查 waagent,如下所示:

waagent --version

輸出類似於下列範例:

WALinuxAgent-2.2.45 running on <Linux Distro>
Python: 3.6.9
Goal state agent: 2.7.1.0

在上述範例輸出中,父代 (或套件部署的版本) 是 WALinuxAgent-2.2.45Goal state agent 值是自動更新版本。

強烈建議您一律為代理程式啟用自動更新:AutoUpdate.Enabled=y。 如果您未啟用自動更新,則必須一直手動更新代理程式,且不會收到 Bug 和安全性修正。

擴充功能更新

當有延伸模組更新可用且已啟用自動更新時,在變更 VM 模型之後,Azure Linux 代理程式會下載並升級延伸模組。

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

    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },

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

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

如何識別擴充功能更新

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

您可以從 VM 模型檢查延伸模組是否以 autoUpgradeMinorVersion 佈建。 若要確認,請使用 az vm show,並提供資源群組和虛擬機器名稱,如下所示:

az vm show --resource-group myResourceGroup --name myVM

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

  "resources": [
    {
      "autoUpgradeMinorVersion": true,
      "forceUpdateTag": null,
      "id": "/subscriptions/guid/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/customScript",

識別何時發生 autoUpgradeMinorVersion 事件

若要查看系統何時執行擴充功能的更新,請在 /var/log/waagent.log 中檢閱虛擬機器的代理程式記錄。

在下列範例中,VM 已安裝 Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027 有可用的 Hotfix。

INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Expected handler state: enabled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Decide which version to use
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Use version: 2.3.9027
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Current handler state is: NotInstalled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Download extension package
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Unpack extension package
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Download, message=Download succeeded
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Initialize extension directory
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update settings file: 0.settings
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Disable extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Launch command:diagnostic.py -disable
...
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Disable, message=Launch command succeeded: diagnostic.py -disable
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Launch command:diagnostic.py -update
2017/08/14 20:21:57 LinuxAzureDiagnostic started to handle.

代理程式權限

若要執行其工作,代理程式必須以「根」權限執行。

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

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

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

  • 若要查看 Azure Linux 代理程式記錄,請在 /var/log/waagent.log 中檢視您佈建延伸模組時的活動。

  • 請在 /var/log/azure/<extensionName> 中查看實際延伸模組記錄的詳細資訊。

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

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

擴充功能失敗的常見原因

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

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

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

檢視擴充功能狀態

對虛擬機器執行虛擬機器擴充功能後,請使用 az vm get-instance-view 傳回擴充功能狀態,如下所示:

az vm get-instance-view \
    --resource-group myResourceGroup \
    --name myVM \
    --query "instanceView.extensions"

輸出類似於下列範例:

  {
    "name": "customScript",
    "statuses": [
      {
        "code": "ProvisioningState/failed/0",
        "displayStatus": "Provisioning failed",
        "level": "Error",
        "message": "Enable failed: failed to execute command: command terminated with exit status=127\n[stdout]\n\n[stderr]\n/bin/sh: 1: ech: not found\n",
        "time": null
      }
    ],
    "substatuses": null,
    "type": "Microsoft.Azure.Extensions.CustomScript",
    "typeHandlerVersion": "2.1.6"
  }

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

重新執行 VM 擴充功能

有時可能需要重新執行 VM 延伸模組。 您可以藉由移除延伸模組,然後使用您所選的執行方法重新執行延伸模組,來重新執行延伸模組。

若要移除擴充功能,請使用 az vm extension delete,如下所示:

az vm extension delete \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --name customScript

您也可以在 Azure 入口網站中移除延伸模組:

  1. 選取 VM。
  2. 選取 [擴充功能]
  3. 選取延伸模組。
  4. 選取解除安裝

常見的 VM 擴充功能參考

延伸模組名稱 描述
Linux 的自訂指令碼擴充功能 對「Azure 虛擬機器」執行指令碼。
VMAccess 延伸模組 重新取得對「Azure 虛擬機器」的存取權。 您也可以使用它來管理使用者和認證
Azure 診斷擴充功能 管理「Azure 診斷」。

下一步

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