共用方式為


建立和部署 VM 應用程式

VM 應用程式是 Azure Compute Gallery 中的一種資源類型,可簡化虛擬機器應用程式的管理、共用和全域散發。 深入瞭解 VM 應用程式

若要在 Azure VM 上建立和部署應用程式,請先將應用程式封裝並上傳至 Azure 儲存體帳戶做為儲存體 Blob。 然後建立 Azure VM application 資源和 VM application version 資源參考這些儲存體 Blob。 最後,將應用程式部署在任何 VM 或虛擬機器擴展集上,方法是將應用程式參考傳遞給 applicationProfile

必要條件

  1. 建立 Azure 儲存體帳戶儲存體容器。 此容器可用來上傳您的應用程式檔案。 建議使用已停用匿名存取的儲存體帳戶,以增加安全性。
  2. 建立 Azure 計算資源庫來儲存和共用應用程式資源

封裝應用程式

螢幕擷取畫面顯示建議用於上傳和建立 VM 應用程式的資料夾結構。

1.打包應用程式檔案

  • 如果您的應用程式安裝需要單一檔案(.exe、.msi、.sh、.ps等),則可以按原樣使用它。
  • 如果您的應用程式安裝需要多個檔案(包含設定檔的可執行檔、相依性、資訊清單檔案、腳本等),則必須將其封存到單一檔案中(使用 .zip、.tar、.tar.gz等)。
  • 針對微服務應用程式,您可以將每個微服務封裝並發佈為個別的 Azure VM 應用程式。 這有助於應用程式可重複使用性、跨團隊開發,以及使用 order 中的屬性來循序安裝微服務。

2.(可選)打包應用程式設定檔

  • 您可以選擇性地單獨提供組態檔。 這可減少保存和取消保存應用程式套件的額外負荷。 也可以在應用程式部署期間傳遞組態檔,以啟用每個 VM 的自訂安裝。

3. 建立安裝腳本

在 VM 上下載應用程式和組態 Blob 之後,Azure 會執行提供的安裝腳本來安裝應用程式。 安裝腳本以字串形式提供 ,字元限制上限為 4,096 個字元。 安裝命令應假設應用程式套件和組態檔位於目前目錄中。

安裝指令碼中可能需要執行的作業很少

  • (選擇性) 使用正確的命令解譯器 Azure 使用的預設命令解譯器位於 /bin/bash Linux OS 和 cmd.exe Windows OS 上。 如果機器上安裝了 Chocolatey 或 PowerShell,則可以使用不同的解譯器。 呼叫可執行檔並將命令傳遞給它。 例如,powershell.exe -command '<powershell command>'。 若使用 PowerShell,您需要使用 Azure 儲存體模組的 3.11.0 版本。

  • (選擇性) 重新命名應用程式 Blob 和組態 Blob Azure 無法保留原始檔案名稱和副檔名。 因此,下載的應用程式檔案和設定檔的預設名稱為「MyVMApp」和「MyVMApp-config」,沒有副檔名。 您可以使用安裝指令碼以副檔名重新命名檔案,也可以傳遞 configFileName名稱publishingProfile屬性。 然後,Azure 會在下載檔案時使用這些名稱,而不是預設名稱。

  • (選擇性) 將應用程式和組態 Blob 移至適當的位置 Azure 會將應用程式 Blob 和設定 Blob 下載至下列位置。 必要時,安裝指令碼必須將檔案移至適當的位置。

    Linux的: /var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<application name>/<application version>

    視窗: C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.16\Downloads\<application name>\<application version>

  • 取消封存應用程式 Blob 對於已封存的應用程式套件,在安裝應用程式之前,需要取消封存。 建議使用 .zip 或 .tar,因為大多數作業系統都內建支援取消封存這些格式。 對於其他格式,請確定客體作業系統提供支援。

  • (選擇性) 設定正確的執行原則和權限 取消封存之後,可以重設檔案權限。 在執行檔案之前設定正確的權限是一個很好的做法。

  • 指令碼轉換為字串安裝指令碼會以 Azure VM 應用程式版本資源中install屬性的publishingProfile字串形式傳遞。

以下是以應用程式 Blob 副檔名為基礎的範例安裝腳本

#!/bin/bash

# Rename blobs
mv MyVMApp app.tar
mv MyVMApp-config app-config.yaml

# Unarchive application
mkdir -p app
tar -xf app.tar -C app

# Set permissions
chmod -R +x app
chmod -R +r app

# Install the script (example: install.sh with config)
bash ./app/install.sh --config app-config.yaml

# OR Install the .deb package (example: install.deb without config)
# sudo dpkg -i ./app/install.deb

# OR Install the .rpm package (example: install.rpm without config)
# sudo rpm -ivh ./app/install.rpm

腳本作為字串:

"#!/bin/bash\nmv MyVMApp app.tar\nmv MyVMApp-config app-config.yaml\nmkdir -p app\ntar -xf app.tar -C app\nchmod -R +x app\nchmod -R +r app\nbash ./app/install.sh --config app-config.yaml\n# sudo dpkg -i ./app/install.deb\n# sudo rpm -ivh ./app/install.rpm"

4. 建立刪除指令碼

刪除指令碼可讓您定義應用程式的刪除作業。 刪除指令碼以字串形式提供,字元限制上限為 4,096 個字元。 假設應用程式套件和組態檔位於目前目錄中,請撰寫 delete 指令。

刪除指令碼必須執行的作業可能很少。

  • 卸載應用程式: 從 VM 正確解除安裝應用程式。 例如,在 Windows 或 uninstall.exe Linux 上執行sudo apt remove app

  • 刪除殘留文件: 從 VM 中刪除殘留的應用程式檔案。 例如,在 Windows 或 Remove-Item -Path "$PWD\*" -Recurse -Force -ErrorAction SilentlyContinue Linux 上執行sudo rm -rf ./* ./.??*

將應用程式檔案上傳至 Azure 儲存體帳戶

1. 將您的應用程式和組態檔上傳至Azure 儲存體帳戶中的容器

應用程式可儲存於區塊或分頁 Blob。 若選擇使用分頁 Blob,上傳前則需位元對齊檔案。 使用下列範例來位元組對齊您的檔案。

inputFile="<the file you want to pad>"

# Get the file size
fileSize=$(stat -c %s "$inputFile")

# Calculate the remainder when divided by 512
remainder=$((fileSize % 512))

if [ "$remainder" -ne 0 ]; then
    # Calculate how many bytes to pad
    difference=$((512 - remainder))
    
    # Create padding (empty bytes)
    dd if=/dev/zero bs=1 count=$difference >> "$inputFile"
fi

2. 產生應用程式套件和組態檔的 SAS URL

將應用程式和組態檔上傳至儲存體帳戶之後,您必須產生具有這些 Blob 讀取許可權的 SAS URL 。 然後,在建立 VM 應用程式版本資源時,會提供這些 SAS URL 作為參考。 對於已啟用匿名存取的儲存體帳戶,也可以使用 Blob URL。 不過,建議使用 SAS URL 來改善安全性。 若還沒有 SAS URI,您可以使用儲存體總管以快速建立。


#!/bin/bash

# === CONFIGURATION ===
STORAGE_ACCOUNT="yourstorageaccount"
CONTAINER_NAME="yourcontainer"
LOCAL_FOLDER="./your-local-folder"
SAS_EXPIRY_HOURS=24

# === LOGIN (if not already logged in) ===
az login --only-show-errors

# === CREATE CONTAINER IF NOT EXISTS ===
az storage container create \
  --name $CONTAINER_NAME \
  --account-name $STORAGE_ACCOUNT \
  --auth-mode login \
  --only-show-errors

# === UPLOAD FILES ===
az storage blob upload-batch \
  --account-name $STORAGE_ACCOUNT \
  --destination $CONTAINER_NAME \
  --source $LOCAL_FOLDER \
  --auth-mode login \
  --only-show-errors

# === GENERATE SAS URLs ===
echo "Generating SAS URLs..."
FILES=$(find $LOCAL_FOLDER -type f)

for FILE in $FILES; do
  BLOB_NAME="${FILE#$LOCAL_FOLDER/}"
  EXPIRY=$(date -u -d "+$SAS_EXPIRY_HOURS hours" '+%Y-%m-%dT%H:%MZ')

  SAS_TOKEN=$(az storage blob generate-sas \
    --account-name $STORAGE_ACCOUNT \
    --container-name $CONTAINER_NAME \
    --name "$BLOB_NAME" \
    --permissions r \
    --expiry $EXPIRY \
    --auth-mode login \
    -o tsv)

  SAS_URL="https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${BLOB_NAME}?${SAS_TOKEN}"
  echo "$BLOB_NAME: $SAS_URL"
done

建立 VM 應用程式

若要建立 VM 應用程式,請先建立描述應用程式的 VM 應用程式資源。 然後在其中建立 VM 應用程式版本資源,其中包含 VM 應用程式承載和腳本,以安裝、更新和刪除應用程式。 承載會使用 SAS URL 提供給 Azure 儲存體帳戶中的 Blob 容器。

請參閱 VM 應用程式和 VM 應用程式版本資源的架構 ,以深入瞭解每個屬性。

使用「建立資源庫應用程式 API」建立 VM 應用程式定義

PUT
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/applications/{applicationName}?api-version=2024-03-03

{
    "location": "West US",
    "name": "myApp",
    "properties": {
        "supportedOSType": "Windows | Linux",
        "endOfLifeDate": "2020-01-01",
	"description": "Description of the App",
	"eula": "Link to End-User License Agreement (EULA)",
	"privacyStatementUri": "Link to privacy statement for the application",
	"releaseNoteUri": "Link to release notes for the application"
    }
}

使用 「建立資源庫應用程式版本 API」 來建立虛擬機器應用程式版本。

PUT
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/applications/{applicationName}/versions/{versionName}?api-version=2024-03-03

{
  "location": "$location",
  "properties": {
    "publishingProfile": {
      "source": {
        "mediaLink": "$mediaLink",
        "defaultConfigurationLink": "$configLink"
      },
      "manageActions": {
        "install": "echo installed",
        "remove": "echo removed",
        "update": "echo update"
      },
      "targetRegions": [
        {
          "name": "West US",
          "regionalReplicaCount": 1
        },
	{
	  "name": "East US"
	}
      ]
      "endofLifeDate": "datetime",
      "replicaCount": 1,
      "excludeFromLatest": false,
      "storageAccountType": "PremiumV2_LRS | Premium_LRS | Standard_LRS | Standard_ZRS"
      "safetyProfile": {
	"allowDeletionOfReplicatedLocations": false
      }
      "settings": {
	"scriptBehaviorAfterReboot": "None | Rerun",
	"configFileName": "$appConfigFileName",
	"packageFileName": "$appPackageFileName"
      }
   }
}

部署 VM 應用程式

現在可以在 Azure VM 或 Azure 虛擬機器擴展集中參考 applicationProfile 一或多個 VM 應用程式。 然後,Azure 會提取 VM 應用程式的承載,並使用提供的安裝腳本將其安裝在每個 VM 上。 此 order 屬性定義虛擬機器應用程式在虛擬機器上安裝的循序順序。

請參閱 VM/虛擬機器擴展集的 applicationProfile 架構 ,以深入瞭解每個屬性。

請在 VM 上執行 PUT 以新增 VM 應用程式版本至 VM。

PUT
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{VMName}?api-version=2024-03-03

{
  "properties": {
    "applicationProfile": {
      "galleryApplications": [
        {
          "order": 1,
          "packageReferenceId": "/subscriptions/{subscriptionId}/resourceGroups/<resource group>/providers/Microsoft.Compute/galleries/{gallery name}/applications/{application name}/versions/{version | latest}",
          "configurationReference": "{path to configuration storage blob}",
          "treatFailureAsDeploymentFailure": false
        }
      ]
    }
  },
  "name": "{vm name}",
  "id": "/subscriptions/{subscriptionId}/resourceGroups/{resource group}/providers/Microsoft.Compute/virtualMachines/{vm name}",
  "location": "{vm location}"
}

若要將 VM 應用程式套用至統一擴展集:

PUT
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{VMSSName}?api-version=2024-03-03

{
  "properties": {
    "virtualMachineProfile": {
      "applicationProfile": {
        "galleryApplications": [
          {
            "order": 1,
            "packageReferenceId": "/subscriptions/{subscriptionId}/resourceGroups/<resource group>/providers/Microsoft.Compute/galleries/{gallery name}/applications/{application name}/versions/{version | latest}",
            "configurationReference": "{path to configuration storage blob}",
            "treatFailureAsDeploymentFailure": false
          }
        ]
      }
    }
  },
  "name": "{vm name}",
  "id": "/subscriptions/{subscriptionId}/resourceGroups/{resource group}/providers/Microsoft.Compute/virtualMachines/{vm name}",
  "location": "{vm location}"
}

回應將會包含完整的 VM 模型。 以下是相關的元件。

{
  "name": "{vm name}",
  "id": "{vm id}",
  "type": "Microsoft.Compute/virtualMachines",
  "location": "{vm location}",
  "properties": {
    "applicationProfile": {
      "galleryApplications": ""
    },
    "provisioningState": "Updating"
  },
  "resources": [
    {
      "name": "VMAppExtension",
      "id": "{extension id}",
      "type": "Microsoft.Compute/virtualMachines/extensions",
      "location": "centraluseuap",
      "properties": "@{autoUpgradeMinorVersion=True; forceUpdateTag=7c4223fc-f4ea-4179-ada8-c8a85a1399f5; provisioningState=Creating; publisher=Microsoft.CPlat.Core; type=VMApplicationManagerLinux; typeHandlerVersion=1.0; settings=}"
    }
  ]
}

下一步

深入瞭解 Azure VM 應用程式。 瞭解如何 管理、更新或刪除 Azure VM 應用程式。