VM 應用程式概觀

VM 應用程式為 Azure Compute Gallery 的資源類型 (先前稱為共用映像庫),可簡化虛擬機器應用程式的管理、共用和全域發布。

雖然您可以使用預先安裝的應用程式來建立 VM 的映像,但每次有應用程式變更時,您都必須更新映像。 將應用程式安裝與 VM 映像分開,表示不需要為每個程式碼變更發佈新的映像。

應用程式封裝提供其他部署和封裝方法的優點:

  • VM 應用程式支援 Azure 原則

  • 封裝的群組和版本設定

  • VM 應用程式可以全域複寫,使其更接近您的基礎結構,因此您不需要使用 AzCopy 或其他儲存體複製機制以跨 Azure 區域複製位元。

  • 透過 Azure 角色型存取控制 (RBAC) 與其他使用者共用

  • 支援虛擬機器以及彈性和統一的擴展集

  • 如果您的 VM 或擴展集上套用了網路安全性群組 (NSG) 規則,可能無法從網際網路存放庫下載封裝。 使用儲存體帳戶時,若要將封裝下載到鎖定的 VM,則需要設定私人連結。

  • 支援區塊 Blob:此功能可透過將大型檔案分成較小的可管理區塊,以有效率處理大型檔案。 適用於上傳大量資料、串流和背景上傳。

什麼是 VM 應用程式封裝?

VM 應用程式封裝使用多個資源類型:

資源 描述
Azure Compute Gallery 資源庫是用來管理和共用應用程式封裝的存放庫。 使用者可以共用資源庫的資源,而且所有子資源都能自動共用。 每個訂閱的資源庫名稱必須不同。 例如,您有一個資源庫可儲存所有 OS 映射,而另一個資源庫可儲存所有 VM 應用程式。
VM 應用程式 VM 應用程式的定義。 是一種邏輯資源,可儲存其下所有版本的通用中繼資料。 例如,您可能有 Apache Tomcat 的應用程式定義,並在其中有多個版本。
VM 應用程式版本 可部署的資源。 您可以將 VM 應用程式版本全域複寫至更接近 VM 基礎結構的目標區域。 VM 應用程式版本必須先複寫到區域,才能部署在該區域中的 VM 上。

限制

  • 每個區域不超過 3 個複本:建立 VM 應用程式版本時,每個區域的複本數目上限為三個。

  • 具有公用存取權的儲存體或具有讀取權限的 SAS URI:儲存體帳戶必須有公用層集存取權或使用具有讀取權限的 SAS URI,因為其他限制層集會造成部署失敗。

  • 重試失敗的安裝:目前重試失敗安裝的唯一方式是從設定檔中移除應用程式,然後再次加入。

  • 每個 VM 只有 25 個應用程式:任何時間點都不能部署超過 25 個應用程式到 VM。

  • 2GB 應用程式大小:應用程式版本的檔案大小上限為 2 GB。

  • 在指令碼中不保證能重新開機:如果您的指令碼需要重新開機,建議在部署期間將應用程式放在最後一個位置。 程式碼會嘗試處理重新開機,但可能會失敗。

  • 需要 VM 代理程式:VM 代理程式必須存在於 VM 上,而且能夠接收目標狀態。

  • 相同 VM 上的多個相同應用程式版本:您無法在 VM 上有多個相同應用程式的版本。

  • 目前不支援移動作業:目前不支援使用 VM 應用程式將 VM 移至其他資源群組。

注意

針對 Azure Compute Gallery 和 VM 應用程式,可在複寫之後刪除儲存體 SAS。

成本

使用 VM 應用程式封裝不需要額外費用,但您將需支付下列資源的費用:

  • 儲存體儲存每個封裝和任何複本的成本。
  • 第一個映像版本從來源區域複寫至要複寫區域的網路輸出費用。 後續複本會在區域內處理,因此不會產生額外費用。

如需網路輸出詳細資訊,請參閱 頻寬定價

VM 應用程式

VM 應用程式資源會為下列項目定義 VM 應用程式:

  • 儲存 VM 應用程式的 Azure Compute Gallery
  • 應用程式的名稱
  • 支援的作業系統類型,例如 Linux 或 Windows
  • VM 應用程式的說明

VM 應用程式版本

VM 應用程式版本是可部署的資源。 版本會以下列屬性定義:

  • 版本號碼
  • 連結到儲存體帳戶中的應用程式封裝檔案
  • 安裝用於安裝應用程式的字串
  • 移除字串,顯示如何正確移除應用程式
  • 下載至 VM 時所使用的封裝檔案名稱
  • 用來在 VM 上設定應用程式的組態檔名稱
  • VM 應用程式的組態檔連結,您可以包含授權檔案
  • 更新字串,了解如何將 VM 應用程式更新為較新的版本
  • 生命週期結束日期。 生命週期結束日期僅為參考,您仍可以部署生命週期結束日期後的 VM 應用程式版本。
  • 從最新中排除。 您可以避免某個版本被用為最新的應用程式版本。
  • 複寫的目標區域
  • 每個區域的複本計數

下載目錄

應用程式封裝和組態檔的下載位置如下:

  • Linux:/var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<appname>/<app version>
  • Windows:C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<appname>\<app version>

假設應用程式封裝和組態檔位於目前的目錄中,應寫入安裝/更新/移除命令。

檔案命名

當將應用程式檔案下載到 VM 時,便會重新命名為 "MyVmApp" (無附檔名)。 這是因為 VM 無法辨識封裝的原始名稱或副檔名。 其利用自有的唯一名稱,意即應用程式名稱本身 "MyVmApp"。

以下是幾個替代方案,可協助解決此問題:

您可修改指令碼,在執行前包含重新命名檔案的命令:

move .\\MyVmApp .\\MyApp.exe & MyApp.exe /S

您也可使用 packageFileName (和對應的 configFileName) 屬性以只是我們要重新命名檔案的內容。 例如,將其設定為 "MyApp.exe" 會讓您的安裝指令碼只需為:

MyAppe.exe /S

提示

如果您的 Blob 原始名稱為 "myApp.exe" 而不是 "myapp",則上述指令碼會正常運作,而不需要設定 packageFileName 屬性。

命令解釋器

預設命令解釋器為:

  • Linux:/bin/bash
  • Windows:cmd.exe

您可以使用 Chocolatey 或 PowerShell 等不同的解譯器 (需安裝在機器上),方法是呼叫可執行檔並將命令傳遞給解譯器。 例如,若要讓命令在 Windows 作業系統而非 CMD 上的 PowerShell 中執行,您可以傳遞 powershell.exe -Command '<powershell commmand>'

如何處理更新

當您更新 VM 或虛擬機器擴展集上的應用程式版本時,將會使用部署期間提供的更新命令。 如果更新的版本沒有更新命令,則會移除目前的版本,並安裝新的版本。

更新命令應以預期可以從任何較舊版本的 VM 應用程式編寫。

在 Linux 上建立 VM 應用程式的秘訣

Linux 的協力廠商應用程式可以透過幾種方式封裝。 讓我們探索如何處理並建立一些常見的安裝命令。

.tar 和 .gz 檔案

這些檔案是壓縮過的封存,可以解壓縮到所需的位置。 檢查原始封裝的安裝指示,確認是否需要解壓縮至特定位置。 如果.tar 和 .gz 檔案包含原始程式碼,請參閱封裝指示,了解如何從來源安裝。

在 Linux 電腦上安裝命令並安裝 golang 的範例:

sudo tar -C /usr/local -xzf go_linux

移除命令的範例:

sudo rm -rf /usr/local/go

針對具有限制內部存取的 VM,使用 .deb.rpm 和其他平台特定封裝建立應用程式封裝

您可以下載平台特定封裝管理員的個別封裝,但通常不包含所有相依性。 針對這些檔案,您也必須在應用程式封裝中包含所有相依性,或讓系統套件管理員透過 VM 適用的存放庫下載相依性。 如果您使用受限制的網際網路存取 VM,則必須自行封裝所有相依性。

要找出相依性可能有點棘手。 有協力廠商工具可以顯示整個相依性的樹狀結構。

在 Ubuntu 中,您可執行 sudo apt show <package_name> | grep Depends 以顯示在執行 sudo apt-get install <packge_name> 命令時安裝的所有封裝。 然後,您可以使用該輸出下載所有 .deb 檔案以建立封存,作為應用程式封裝使用。

  1. 例如,若要建立 VM 應用程式封裝以安裝適用於 Ubuntu 的 PowerShell,請先執行命令以啟用可從中下載 PowerShell 的存放庫,並也識別新 Ubuntu VM 上的封裝相依性。
# Download the Microsoft repository GPG keys
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
sudo rm -rf packages-microsoft-prod.deb
sudo apt update
sudo apt show powershell | grep Depends
  1. 檢查 Depends 行的輸出,其中列出下列封裝:
Depends: libc6, libgcc1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl3|libssl1.1|libssl1.0.2|libssl1.
  1. 使用 sudo apt-get download <package_name> 下載這些檔案,並使用所有檔案建立 tar 壓縮的封存。
  • Ubuntu 18.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download libgcc1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu60
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 20.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download libgcc1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu66
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 22.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download libgcc1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl3
sudo apt-get download libicu70
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  1. 此 tar 封裝是應用程式封裝檔案。
  • 在此情況下,安裝命令為:
sudo tar -xvzf powershell.tar.gz && sudo dpkg -i *.deb
  • 而移除命令為:
sudo apt remove powershell

使用 sudo apt autoremove,而不是明確嘗試移除所有相依性。 您可能已安裝具有重疊相依性的其他應用程式,在此情況下,明確移除命令將會失敗。

如果您不想自行解析相依性,而 apt 能夠連線到存放庫,您可以只安裝一個 .deb 檔案的應用程式,並讓 apt 處理相依性。

封裝安裝命令:

dpkg -i <package_name> || apt --fix-broken install -y

在 Windows 上建立 VM 應用程式的秘訣

Windows 中的大部分協力廠商應用程式都可以作為 .exe 或 .msi 安裝程式使用。 有些也提供解壓縮和執行 zip 檔案。 讓我們看看每個最佳做法。

.exe 安裝程式

安裝程式的可執行檔通常會啟動使用者介面 (UI),並要求透過 UI 選取。 如果安裝程式支援無訊息模式參數,則應該包含在您的安裝字串中。

Cmd.exe 也會預期可執行檔的副檔名為 .exe,因此您在重新命名時,必須將檔案的副檔名設為 .exe

如果我想要為 myApp.exe 建立 VM 應用程式封裝且為可執行檔,則我的 VM 應用程式命名為「myApp」,因此在撰寫命令時會假設應用程式封裝位於當前目錄中:

"move .\\myApp .\\myApp.exe & myApp.exe /S -config myApp_config"

如果安裝程式的可執行檔不支援解除安裝參數,建議可以在測試電腦上查閱登錄,以了解解除安裝程式的所在位置。

在登錄中,解除安裝字串會儲存在 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<installed application name>\UninstallString 中,以便使用內容作為移除命令:

'\"C:\\Program Files\\myApp\\uninstall\\helper.exe\" /S'

.msi 安裝程式

針對安裝程式的 .msi 命令列執行,安裝或移除應用程式的命令應該使用 msiexec。 一般而言,msiexec 會以自己的個別流程執行,而 cmd 不會等待它完成,這可能會導致安裝 VM 應用程式時發生問題。 命令 start 可以搭配 msiexec 使用,確保安裝會在命令傳回之前完成。 例如:

start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log

移除命令的範例:

start /wait %windir%\\system32\\msiexec.exe /x $appname /quiet /forcerestart /log ${appname}_uninstall.log

ZIP 檔案

對於.zip 或其他壓縮檔案,請將應用程式封裝的內容重新命名並解壓縮到所需的目的地。

封裝安裝命令:

rename myapp myapp.zip && mkdir C:\myapp && powershell.exe -Command "Expand-Archive -path myapp.zip -destinationpath C:\myapp"

移除命令的範例:

rmdir /S /Q C:\\myapp

將失敗視為部署失敗

不論安裝/更新/移除時是否有任何 VM 應用程式失敗,VM 應用程式延伸模組一律傳回「成功」。 當延伸模組或基礎結構發生問題時,VM 應用程式延伸模組只會將擴充功能狀態回報為失敗。 此行為是由「將失敗視為部署失敗」旗標觸發,預設為 $false,但可以變更為 $true。 您可以在 PowerShellCLI 中設定 false 旗標。

針對 VM 應用程式進行疑難排解

若要知道特定 VM 應用程式是否已成功新增至 VM 執行個體,請檢查 VM 應用程式延伸模組的訊息。

若要深入了解如何取得 VM 擴充功能的狀態,請參閱適用於 Linux 的虛擬機器擴充功能以及適用於 Windows 的虛擬機器擴充功能

若要取得 VM 擴充功能的狀態,請使用 Get-AzVM

Get-AzVM -name <VM name> -ResourceGroupName <resource group name> -Status | convertto-json -Depth 10

若要取得擴展集的擴充功能狀態,請使用 Get-AzVMSS

$result = Get-AzVmssVM -ResourceGroupName $rgName -VMScaleSetName $vmssName -InstanceView
$resultSummary  = New-Object System.Collections.ArrayList
$result | ForEach-Object {
    $res = @{ instanceId = $_.InstanceId; vmappStatus = $_.InstanceView.Extensions | Where-Object {$_.Name -eq "VMAppExtension"}}
    $resultSummary.Add($res) | Out-Null
}
$resultSummary | convertto-json -depth 5

錯誤訊息

訊息 描述
目前的 VM 應用程式版本 {name} 已於 {date} 被取代。 您嘗試部署已被取代的 VM 應用程式版本。 請嘗試使用 latest 而不要指定特定版本。
目前的 VM 應用程式版本 {name} 支援 {OS} 作業系統,但目前 OSDisk 的作業系統是 {OS}。 您嘗試將 Linux 應用程式部署至 Windows 執行個體,或是將 Windows 應用程式部署至 Linux 執行個體。
已超過 (max=5、current={count}) 的 VM 應用程式數量上限。 減少使用的應用程式,然後重試要求。 我們目前對每個 VM 或擴展集僅支援五個 VM 應用程式。
使用相同的 packageReferenceId 指定多個 VM 應用程式。 相同的應用程式已指定一次以上。
訂閱未獲得存取此映像的授權。 訂閱無法存取這個應用程式版本。
引數中的儲存體帳戶不存在。 此訂閱中沒有任何應用程式。
平台映射 {image} 無法使用。 驗證儲存體設定檔中的所有欄位是否都正確。 如需儲存體設定檔的詳細資訊,請參閱 https://aka.ms/storageprofile 應用程式不存在。
資源庫映像 {image} 在 {region} 區域中無法使用。 請連絡映像擁有者以複寫至此區域,或變更您所要求的區域。 資源庫應用程式版本存在,但未複寫至此區域。
SAS 對來源 URI {uri} 無效。 嘗試擷取 (either mediaLink or defaultConfigurationLink).相關資訊時,從儲存體接收到 Forbidden 錯誤。
來源 URI {uri} 所參考的 Blob 不存在。 提供給 mediaLink 或 defaultConfigurationLink 屬性的 Blob 不存在。
資源庫應用程式版本 URL {url} 無法存取,因為發生下列錯誤:找不到遠端名稱。 請確定 Blob 存在,且為可公開存取或具有讀取權限的 SAS URL。 最可能的情況是未提供具有讀取權限的 SAS URI。
資源庫應用程式版本 URL {url} 無法存取,因為發生下列錯誤:{error description}。 請確定 Blob 存在,且為可公開存取或具有讀取權限的 SAS URL。 提供的儲存體 Blob 發生問題。 錯誤描述會提供詳細資訊。
該作業在 {application} 中標示為待刪除,所以不允許對其執行作業 {operationName}。 您只能重試刪除作業 (或等候進行中的作業完成)。 嘗試更新目前正在刪除的應用程式。
參數「galleryApplicationVersion.properties.publishingProfile.replicaCount」的值 {value} 超出範圍。 值必須介於一與三 (含) 之間。 VM 應用程式版本只允許介於一到三個複本。
不允許變更「galleryApplicationVersion.properties.publishingProfile.manageActions.install」屬性。 (或更新、刪除) 您無法變更現有 VmApplication 上的任何管理動作。 必須建立新的 VmApplication 版本。
不允許變更「galleryApplicationVersion.properties.publishingProfile.settings.packageFileName」屬性。 (或 configFileName) 無法變更任何設定,例如封裝檔案名稱或組態檔名稱。 必須建立新的 VmApplication 版本。
來源 URI {uri} 所參考的 Blob 太大:大小 = {size}。 允許的 Blob 大小上限為「1 GB」。 目前 mediaLink 或 defaultConfigurationLink 所參考的 Blob 大小上限為 1 GB。
來源 URI {uri} 所參考的 Blob 是空的。 參考到空的 Blob。
{operation} 作業 不支援 Blob 型別 {type}。 僅支援分頁 Blob 和區塊 Blob。 VmApplications 僅支援分頁 Blob 和區塊 Blob。
SAS 對來源 URI {uri} 無效。 為 mediaLink 或 defaultConfigurationLink 提供的 SAS URI 不是有效的 SAS URI。
無法在目標區域中指定 {region},因為訂閱缺少必要的功能 {featureName}。 使用必要的功能註冊您的訂閱,或從目標區域清單中移除區域。 若要在特定限制區域中使用 VmApplications,必須註冊該訂閱的功能旗標。
資源庫映像版本發行設定檔的區域 {regions} 必須包含映像版本 {location} 的位置。 複寫的區域清單必須包含應用程式版本所在的位置。
目標發佈區域中不允許重複的區域。 發佈區域可能沒有重複。
資源庫應用程式版本資源目前不支援加密。 VM 應用程式不支援目標區域的加密屬性
實體名稱不符合要求 URL 中的名稱。 要求 URL 中指定的資源庫應用程式版本不符合要求本文中指定的版本。
資源庫應用程式版本的名稱無效。 應用程式版本名稱應遵循 Major(int32)。 Minor(int32)。 Patch(int32) 格式,其中 int 介於 0 與 2,147,483,647 (含) 之間。 例如,1.0.0, 2018.12.1 等。 資源庫應用程式版本必須遵循指定格式。

下一步