创建和部署 VM 应用程序

VM 应用程序是 Azure 计算库中的资源类型,可简化虚拟机应用程序的管理、共享和全局分发。 详细了解 VM 应用程序

若要在 Azure VM 上创建和部署应用程序,请先打包应用程序并将其作为存储 Blob 上传到 Azure 存储帐户。 然后创建 Azure VM application 引用这些存储 Blob 的资源和资源 VM application version 。 最后,通过传入应用程序引用 applicationProfile,在任何 VM 或虚拟机规模集上部署应用程序。

先决条件

  1. 创建 Azure 存储帐户存储容器。 此容器用于上传应用程序文件。 建议使用禁用匿名访问的存储帐户,以增强安全性。
  2. 创建 用于存储和共享应用程序资源的 Azure 计算库

打包应用程序

显示用于上传和创建 VM 应用程序的文件夹结构的屏幕截图。

1.打包应用程序文件

  • 如果应用程序安装需要单个文件(.exe、.msi、.sh、.ps等),则可以按原样使用它。
  • 如果应用程序安装需要多个文件(包含配置文件、依赖项、清单文件、脚本等的可执行文件),则必须将其(使用 .zip、.tar、.tar.gz等)存档到单个文件中。
  • 对于微服务应用程序,可以将每个微服务打包并发布为单独的 Azure VM 应用程序。 这有助于使用 orderapplicationProfile 中的属性实现应用程序可重用性、跨团队开发和微服务的顺序安装。

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,需要使用 3.11.0 版的 Az.Storage 模块。

  • (可选) 重命名应用程序 Blob 和配置 blob Azure 无法保留原始文件名和文件扩展名。 因此,下载的应用程序文件和配置文件的默认名称为“MyVMApp”和“MyVMApp-config”,没有文件扩展名。 可以使用安装脚本将文件重命名为文件扩展名,也可以传递 packageFileNameconfigFileNamepublishingProfile 然后,Azure 会在下载文件时使用这些名称,而不是默认名称。

  • (可选) 将应用程序和配置 blob 移动到适当的位置 Azure 将应用程序 Blob 和配置 Blob 下载到以下位置。 安装脚本必须在必要时将文件移动到适当的位置。

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

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

  • 未存档的应用程序 Blob 对于存档的应用程序包,在安装应用程序之前,需要将其取消存档。 建议使用 .zip 或.tar,因为大多数 OS 都内置支持取消存档这些格式。 对于其他格式,请确保来宾 OS 提供支持。

  • (可选) 设置正确的执行策略和权限 取消存档后,可以重置文件权限。 在执行文件之前,最好设置正确的权限。

  • 将脚本转换为字符串安装脚本作为 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 个字符。 编写删除命令,假设应用程序包和配置文件位于当前目录中。

删除脚本必须执行的作可能很少。

  • 卸载应用程序: 从 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 中。 如果选择使用页 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 cloud set -n AzureChinaCloud
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.chinacloudapi.cn/${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": "China North 2",
    "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”创建 VM 应用程序版本

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": "China North",
          "regionalReplicaCount": 1
        },
	{
	  "name": "China North"
	}
      ]
      "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 应用

现在可以在 applicationProfile Azure VM 或 Azure 虚拟机规模集中引用一个或多个 VM 应用程序。 然后,Azure 会拉取 VM 应用程序的有效负载,并使用提供的安装脚本在每个 VM 上安装它。 该 order 属性定义 VM 应用程序在 VM 上安装的顺序。

请参阅 VM/虚拟机规模集 applicationProfile 的架构 ,详细了解每个属性。

若要将 VM 应用程序版本添加到某个 VM,请对该 VM 执行 PUT。

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": "chinanorth2",
      "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 应用程序。