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。 不過,任何後續的更新作業都需要有效的 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
檔案以建立封存,作為應用程式封裝使用。
- 例如,若要建立 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
- 檢查 Depends 行的輸出,其中列出下列封裝:
Depends: libc6, lib32gcc-s1, 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.
- 使用
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 lib32gcc-s1
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 lib32gcc-s1
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 lib32gcc-s1
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
- 此 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
一般而言, start
命令會在批次腳本內呼叫。 如果搭配 /wait
參數使用,呼叫腳本將會暫停,直到呼叫的進程終止為止。 完成之後,批次腳本會檢查 命令所設定的errorlevel
start
變數,然後結束,如下所示:
start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log
if %errorlevel% neq 0 exit /b %errorlevel%
...
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
。 您可以在 PowerShell 或 CLI 中設定 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 等。 |
資源庫應用程式版本必須遵循指定格式。 |
下一步
- 了解如何建立和部署 VM 應用程式封裝。