Vytvoření a nasazení aplikace virtuálního počítače

Aplikace virtuálního počítače je typ prostředku v galerii výpočetních prostředků Azure, která zjednodušuje publikování, nasazení, správu, sdílení a globální distribuci aplikací a skriptů pro vaše virtuální počítače. Aplikace virtuálních počítačů podporují širokou škálu scénářů, včetně vysoce škálovatelných nasazení, požadavků na nízkou latenci, odolnosti proti chybám, zabezpečených důvěryhodných zavedení, konzistence pro celou flotilu, architektur mikroslužeb a správy po nasazení. Přečtěte si další informace o aplikacích virtuálních počítačů.

Pokud chcete vytvářet a nasazovat aplikace na virtuálním počítači Azure, nejprve zabalte aplikaci a nahrajte ji do Azure Storage Účtu jako objekt blob úložiště. Pak vytvořte prostředek Azure VM application a prostředek VM application version, které odkazují na tyto objekty blob úložiště. Azure ukládá a replikuje tyto bloby v účtech regionálních spravovaného úložiště. Nakonec nasaďte aplikaci na libovolný virtuální počítač nebo na Virtual Machine Scale Sets předáním odkazu na aplikaci v applicationProfile.

Diagram znázorňující podrobný proces související s publikováním a nasazením aplikací virtuálních počítačů

Požadavky

  1. Vytvořte účet úložiště Azure a kontejner storage. Tento kontejner se používá k nahrání souborů aplikace.
  2. Vytvořte galerii výpočetních prostředků Azure pro ukládání a sdílení prostředků aplikací.
  3. Vytvořte spravovanou identitu přiřazenou uživatelem a přiřaďte do Azure Compute Gallery

Poznámka:

Vytvořte si účet úložiště se zakázaným anonymním přístupem pro lepší zabezpečení. Pomocí spravované identity přiřazené ke Azure Výpočetní galerii můžete bezpečně publikovat aplikace virtuálních počítačů bez nutnosti tokenů SAS.

Zabalení aplikace

Před publikováním prostředku aplikace virtuálního počítače v „Azure Compute Gallery“ zabalte soubory aplikace pro nahrání do účtu „Azure Storage“. Následující diagram znázorňuje možné struktury složek pro uspořádání souborů aplikace:

Snímek obrazovky znázorňující strukturu složek doporučenou k nahrání a vytváření aplikací virtuálních počítačů

1. Zabalení souborů aplikace

Aplikace virtuálního počítače vyžaduje jako balíček aplikace jeden soubor.

  • Pokud instalace aplikace vyžaduje jeden spustitelný soubor (.exe, .msi, .sh, .ps atd.), můžete ho použít jako balíček aplikace.
  • Pokud vaše aplikace vyžaduje více souborů (spustitelné soubory, závislosti, skripty, metadata atd.), archivujte je do jednoho souboru (, , ) a tento soubor použijte jako balíček aplikace.
  • U aplikace mikroslužeb můžete každou mikroslužbu zabalit a publikovat jako samostatnou aplikaci virtuálního počítače Azure. Tato modularizace usnadňuje opětovnou použitelnost aplikací, vývoj napříč týmy a sekvenční instalaci mikroslužeb pomocí vlastnosti v souboru applicationProfile.

Přečtěte si další informace o vytváření balíčků aplikací pro aplikace Azure virtuálních počítačů.

2. (Volitelné) Zabalení konfiguračního souboru aplikace

  • Konfigurační soubor můžete zadat samostatně pomocí aplikace virtuálního počítače. To snižuje náklady na přenos a uložení při archivaci a dearchivaci balíčků aplikací.
  • Konfigurační soubory je možné předat také během nasazování aplikací pomocí vlastnosti v rámci nasazení virtuálního počítače, která umožňuje přizpůsobenou instalaci pro každý virtuální počítač.
  • Pokud jsou nastaveny obě vlastnosti, přepíše konfiguraci předanou pomocí .

3. Vytvoření instalačního skriptu

Po stažení aplikace a objektu blob konfigurace na virtuálním počítači Azure spustí zadaný instalační skript pro instalaci aplikace. Instalační skript je k dispozici jako řetězec a má maximální limit znaků 4 096 znaků. Příkazy instalace by se měly zapsat za předpokladu, že balíček aplikace a konfigurační soubor jsou v aktuálním adresáři.

V instalačním skriptu může být potřeba provést několik operací.

  • (volitelné) Použijte správný interpret příkazů Výchozí interpret příkazů používaný Azure jsou /bin/bash v operačním systému Linux a cmd.exe v operačním systému Windows. Pokud je na počítači nainstalovaný, můžete použít jiný interpret, například Chocolatey nebo PowerShell. Zavolejte spustitelný soubor a předejte mu příkazy. Například: . Pokud používáte PowerShell, musíte použít verzi 3.11.0 modulu Az.Storage.

  • (volitelné) Přejmenování objektu blob aplikace a objektu blob konfigurace Azure nemůže zachovat původní název objektu blob a přípony souborů. Azure stáhne soubor aplikace s názvem prostředku aplikace virtuálního počítače publikovaného v galerii Azure Compute. Pokud je tedy název aplikace virtuálního počítače "VMApp1", soubor stažený na virtuálním počítači má název VMApp1 bez přípony. Konfigurační soubor má výchozí název "VMApp1-config" bez přípony souboru.

    Soubor s příponou souboru můžete přejmenovat pomocí instalačního skriptu nebo můžete také předat názvy a vlastnosti prostředku verze aplikace virtuálního počítače. Azure tyto názvy používá místo výchozích názvů při stahování souborů.

  • Zrušení archivace objektu blob aplikace Pro archivované balíčky aplikací je potřeba před instalací aplikace zrušit archivaci. Použijte .zip nebo .tar, protože většina operačního systému má integrovanou podporu pro zrušení archivace těchto formátů. V případě jiných formátů se ujistěte, že hostovaný operační systém podporuje.

  • Převeďte skript na řetězec Instalační skript je předán jako řetězec pro vlastnost install ve verzi prostředku aplikace virtuálního počítače Azure publishingProfile.

  • Nainstalujte aplikace tiše a synchronně bez výzev uživatelského rozhraní. Vzhledem k tomu, že instalace běží na virtuálním počítači, kde vstup zákazníka není dostupný, musíte použít skryté nebo bezobslužné příznaky instalace. Kromě toho, pokud instalační program aplikace vytváří procesy na pozadí nebo podřízené procesy nebo běží asynchronně, nadřazený skript se může vrátit před dokončením instalace. Pokud chcete zajistit, aby se úplná instalace dokončila, než Azure označí operaci jako úspěšnou, použijte čekací příznaky nebo blokovací příkazy. Tento přístup pomáhá, když instalace zahrnuje několik kroků, které běží asynchronně, nebo je potřeba ověřit dokončení instalace před zahájením následné aplikace v posloupnosti .

    K běžným příkladům patří:

    • Windows .msi: start /wait msiexec /i app.msi /quiet /qn
    • Windows .exe: start /wait app.exe /silent nebo start /wait app.exe /quiet nebo start /wait app.exe /S
    • PowerShell:
    • Linux .sh: (skripty prostředí se ve výchozím nastavení spouštějí synchronně)
    • Linux .deb: (spouští se synchronně ve výchozím nastavení)
    • Linux .rpm: (spouští se synchronně ve výchozím nastavení)
  • (Volitelné) Nastavení zásad a oprávnění pro správné spuštění Po zrušení archivace je možné obnovit oprávnění k souborům. Před spuštěním souborů je vhodné nastavit správná oprávnění.

  • (Volitelné) Nastavení podrobného spuštění a protokolování Aplikace virtuálních počítačů automaticky zachytí veškerý výstup z instalačního skriptu a uloží ho do souboru stdout na virtuálním počítači. Pomocí této funkce můžete protokolovat průběh instalace, chyby ladění a ověřit úspěšná nasazení.

    • Povolte podrobný režim pro zaznamenání protokolů instalačního programu aplikace. Bash: , PowerShell: , Cmd: .
    • Přidejte vlastní zprávy ke sledování průběhu skriptu. Bash: , PowerShell: , Cmd:

    Tyto protokoly můžete načíst pomocí funkce Run Command nebo připojením k virtuálnímu počítači. Soubory a soubory se nacházejí v následující cestě:

    • Linux:
    • Windows: C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<application name>\<application version>/
  • (volitelné) Přesuňte aplikaci a objekt blob konfigurace do příslušného umístění Azure stáhne objekt blob aplikace a objekt blob konfigurace do následujících umístění. Instalační skript musí soubory v případě potřeby přesunout do příslušných umístění.

    Linux:

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

Tady je několik ukázkových instalačních skriptů podle přípony souboru aplikačního blobu. Pokud jsou vlastnosti uvedené v názvu a příponě souboru, odeberte kód pro přejmenování souborů v následujících skriptech.

  • .TAR
  • .ZIP
  • .EXE
  • .MSI
  • .DEB
  • . RPM
  • .SH
  • .PS1

Nahraďte názvem aplikace virtuálního počítače v balíčku aplikace (VMApp1) a konfiguračním souborem (VMApp1-config). Nahraďte požadovaným názvem aplikace. Nahraďte požadovaným názvem konfigurace.

Instalace pomocí Bash bez konfiguračního souboru:

mv VMApp1 app.tar && tar -xf app.tar && chmod -R +xr . && bash ./install.sh
mv VMApp1 app.tar && tar -xf app.tar && chmod -R +xr . && sudo DEBIAN_FRONTEND=noninteractive dpkg -i ./app.deb

Instalace pomocí Bash s konfiguračním souborem:

mv VMApp1 app.tar && mv VMApp1-config config.yaml && tar -xf app.tar && chmod -R +xr . && bash ./install.sh --config config.yaml

Pokud je konfigurační soubor zabalený v souboru tar

mv VMApp1 app.tar && tar -xf app.tar && chmod -R +xr . && sudo debconf-set-selections < config.cfg && sudo DEBIAN_FRONTEND=noninteractive dpkg -i ./app.deb

4. Vytvoření skriptu pro odebrání

Skript umožňuje definovat operace pro odebrání aplikace. Skript je k dispozici jako řetězec a má maximální limit znaků 4 096 znaků. Za předpokladu, že balíček aplikace a konfigurační soubor jsou v aktuálním adresáři, napište příkazy. Během operace odinstalace Azure spustí odinstalační skript a pak odstraní všechny soubory z úložiště.

Existuje několik operací, které musí skript provést.

  • Odinstalace aplikace: Správně odinstalujte aplikaci z virtuálního počítače. Například:
  • CMD
  • PowerShell
  • Bash

CMD na Windows:

start /wait uninstall.exe /quiet
start /wait python.exe /uninstall /quiet
start /wait msiexec /x app.msi /quiet /qn
  • Odebrání zbytkových souborů: Pokud instalace aplikace vytvoří soubory v jiných částech systému souborů, odeberte tyto soubory.

Nahrání souborů aplikace do Azure účtu úložiště

Důležité

Před nahráním souborů nebo generováním adres URL SAS přiřaďte role uživateli, instančnímu objektu nebo spravované identitě, které provádějí tyto operace s cílovým účtem úložiště nebo kontejnerem:

  • Přispěvatel dat v objektech blob služby Storage nebo Vlastník dat objektů blob služby Storage: Vyžaduje se nahrání, úprava nebo odstranění objektů blob.
  • Pro generování SAS s Azure AD (například pomocí --auth-mode přihlášení v rozhraní příkazového řádku nebo PowerShellu) musíte přiřadit delegátora objektu Blob úložiště v oboru účtu úložiště.

1. Instalujte aplikaci a konfigurační soubory do kontejner v účtu úložiště Azure.

Nahrajte zabalenou aplikaci a volitelný konfigurační soubor jako objekty blob. Blobové objekty bloku fungují ve většině scénářů.

Volitelně, pokud potřebujete použít objekty blob stránky, můžete soubory před nahráním bajtově zarovnat pomocí jednoho z následujících skriptů:

  • Rozhraní příkazového řádku
  • PowerShell
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. Vygenerování adresy URL SAS nebo objektu blob pro balíček aplikace a konfigurační soubor

Jakmile se aplikace a konfigurační soubory nahrají do účtu úložiště, musíte pro tyto objekty blob vygenerovat adresu URL objektu blob nebo adresu URL SAS s oprávněním ke čtení. Tyto adresy URL se pak zadají jako referenční informace při vytváření prostředku verze aplikace virtuálního počítače.

Poznámka:

Pro lepší zabezpečení a ochranu osobních údajů důrazně doporučujeme používat adresu URL objektu blob se spravovanou identitou.

Použijte URL objektu blob:

Použijte adresu URL SAS:

  • Pokud je účet úložiště zakázaný pro anonymní přístup a spravovaná identita není přiřazená ke službě Azure Compute Gallery.

cs-CZ: Adresa URL objektu blob = https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${BLOB_NAME} Adresa URL SAS = https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${BLOB_NAME}?${SAS_TOKEN}

  • Rozhraní příkazového řádku pomocí URL blobu
  • CLI s využitím adresy URL SAS
  • PowerShell s použitím URL adresy objektu blob
  • PowerShell s využitím adresy URL SAS
  • Portál

Pokud je spravovaná identita přiřazena ke službě Azure Compute Gallery, použijte následující skript. Tento přístup používá adresy URL objektů blob bez tokenů SAS.

#!/bin/bash
set -euo pipefail

# === CONFIGURATION ===
STORAGE_ACCOUNT="your-storage-account-name"
CONTAINER_NAME="your-container-name"
APP_FILE="./path/to/your-app-file"           # Path to your application payload file        
CONFIG_FILE="./path/to/your-config-file"     # Path to your configuration file (optional)   

# === 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 APPLICATION FILE ===
APP_BLOB_NAME=$(basename "$APP_FILE")
az storage blob upload \
  --account-name "$STORAGE_ACCOUNT" \
  --container-name "$CONTAINER_NAME" \
  --name "$APP_BLOB_NAME" \
  --file "$APP_FILE" \
  --auth-mode login \
  --overwrite \
  --only-show-errors

# === UPLOAD CONFIG FILE (optional) ===
if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
  CONFIG_BLOB_NAME=$(basename "$CONFIG_FILE")
  az storage blob upload \
    --account-name "$STORAGE_ACCOUNT" \
    --container-name "$CONTAINER_NAME" \
    --name "$CONFIG_BLOB_NAME" \
    --file "$CONFIG_FILE" \
    --auth-mode login \
    --overwrite \
    --only-show-errors
fi

# === GENERATE BLOB URLs ===
echo "Generating Blob URLs..."

APP_BLOB_URL="https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${APP_BLOB_NAME}"
echo "Application file: $APP_BLOB_URL"

if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
  CONFIG_BLOB_URL="https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${CONFIG_BLOB_NAME}"
  echo "Configuration file: $CONFIG_BLOB_URL"
fi

Vytvoření aplikace virtuálního počítače

Pokud chcete vytvořit aplikaci virtuálního počítače, nejprve vytvořte prostředek aplikace virtuálního počítače, který popisuje aplikaci. Potom v něm vytvořte prostředek verze aplikace VM, který obsahuje aplikační obsah VM a skripty pro instalaci, aktualizaci a odstranění aplikace. Datová část se dodává pomocí adresy URL objektu blob nebo adresy URL SAS kontejneru objektů blob v Azure Storage účtu.

Další informace o jednotlivých vlastnostech najdete ve schématu pro aplikaci virtuálního počítače a verzi prostředku aplikace.

Pomocí následující šablony ARM vytvořte Azure Compute Gallery, aplikaci pro virtuální počítače a verzi aplikace pro virtuální počítače. Tato šablona ukazuje klíčové vlastnosti a možnosti konfigurace pro publikování balíčku aplikace.

{
  "$schema": "https://schema.management.azure.com/schemas/2020-06-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "galleryName": {
      "type": "string"
    },
    "applicationName": {
      "type": "string"
    },
    "versionName": {
      "type": "string",
      "metadata": {
        "description": "Must follow the format: major.minor.patch (Example: 1.0.0)"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "West US"
    },
    "supportedOSType": {
      "type": "string",
      "allowedValues": ["Windows", "Linux"]
    },
    "endOfLifeDate": {
      "type": "string",
      "metadata": {
        "description": "Optional. This property is for information only and doesn't block app deployment."
      }
    },
    "description": {
      "type": "string",
      "defaultValue": "Description of the application"
    },
    "eula": {
      "type": "string",
      "defaultValue": ""
    },
    "privacyStatementUri": {
      "type": "string",
      "defaultValue": ""
    },
    "releaseNoteUri": {
      "type": "string",
      "defaultValue": ""
    },
    "mediaLink": {
      "type": "string"
    },
    "configLink": {
      "type": "string"
    },
    "appConfigFileName": {
      "type": "string"
    },
    "appPackageFileName": {
      "type": "string"
    },
    "replicaRegion1": {
      "type": "string",
      "defaultValue": "East US"
    },
    "replicaRegion2": {
      "type": "string",
      "defaultValue": "South Central US"
    },
    "installScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to install the application. Example: echo 'Installing application...'"
      }
    },
    "updateScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to update the application. Example: echo 'Updating application...'"
      }
    },
    "removeScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to delete the application. Example: echo 'Deleting application...'"
      }
    },
    "storageAccountType": {
      "type": "string",
      "allowedValues": ["PremiumV2_LRS", "Premium_LRS", "Standard_LRS", "Standard_ZRS"],
      "defaultValue": "Standard_LRS"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Compute/galleries",
      "apiVersion": "2024-03-03",
      "name": "[parameters('galleryName')]",
      "location": "[parameters('location')]",
      "properties": {
        "identifier": {}
      }
    },
    {
      "type": "Microsoft.Compute/galleries/applications",
      "apiVersion": "2024-03-03",
      "name": "[format('{0}/{1}', parameters('galleryName'), parameters('applicationName'))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Compute/galleries', parameters('galleryName'))]"
      ],
      "properties": {
        "supportedOSType": "[parameters('supportedOSType')]",
        "endOfLifeDate": "[parameters('endOfLifeDate')]",
        "description": "[parameters('description')]",
        "eula": "[if(equals(parameters('eula'), ''), json('null'), parameters('eula'))]",
        "privacyStatementUri": "[if(equals(parameters('privacyStatementUri'), ''), json('null'), parameters('privacyStatementUri'))]",
        "releaseNoteUri": "[if(equals(parameters('releaseNoteUri'), ''), json('null'), parameters('releaseNoteUri'))]"
      }
    },
    {
      "type": "Microsoft.Compute/galleries/applications/versions",
      "apiVersion": "2024-03-03",
      "name": "[format('{0}/{1}/{2}', parameters('galleryName'), parameters('applicationName'), parameters('versionName'))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Compute/galleries/applications', parameters('galleryName'), parameters('applicationName'))]"
      ],
      "properties": {
        "publishingProfile": {
          "source": {
            "mediaLink": "[parameters('mediaLink')]",
            "defaultConfigurationLink": "[parameters('configLink')]"
          },
          "manageActions": {
            "install": "[parameters('installScript')]",
            "remove": "[parameters('removeScript')]",
            "update": "[parameters('updateScript')]"
          },
          "settings": {
            "scriptBehaviorAfterReboot": "Rerun",
            "configFileName": "[parameters('appConfigFileName')]",
            "packageFileName": "[parameters('appPackageFileName')]"
          },
          "targetRegions": [
            {
              "name": "[parameters('location')]",
              "regionalReplicaCount": 3,
              "storageAccountType": "[parameters('storageAccountType')]"
            },
            {
              "name": "[parameters('replicaRegion1')]",
              "regionalReplicaCount": 1,
              "storageAccountType": "[parameters('storageAccountType')]"
            },
            {
              "name": "[parameters('replicaRegion2')]"
            },
          ],
          "excludeFromLatest": false,
          "replicaCount": 2,
          "storageAccountType": "[parameters('storageAccountType')]"
        },
        "safetyProfile": {
          "allowDeletionOfReplicatedLocations": true
        },
        "endOfLifeDate": "[parameters('endOfLifeDate')]"
      }
    }
  ]
}

Nasazení aplikací virtuálních počítačů

Na jednu nebo více aplikací virtuálních počítačů lze nyní odkazovat v rámci Azure virtual machine nebo sady Škálovací sady virtuálních počítačů Azure. Azure pak načte datovou část aplikace virtuálního počítače a nainstaluje ji na každý virtuální počítač pomocí poskytnutého instalačního skriptu. Vlastnost definuje sekvenční pořadí, ve kterém jsou na virtuálním počítači nainstalovány aplikace virtuálních počítačů.

Další informace o jednotlivých vlastnostech najdete ve schématu applicationProfile virtuálního počítače / Virtual Machine Scale Sets.

  • Template
  • REST
  • Rozhraní příkazového řádku
  • PowerShell
  • Portál

Pomocí následující šablony ARM nasaďte aplikaci pro virtuální počítače na virtuální počítač Azure nebo sadu škálování virtuálních počítačů Azure. Tato šablona ukazuje klíčové vlastnosti a možnosti konfigurace pro nasazení aplikace virtuálního počítače.

Nasaďte aplikaci VM na sady škálování virtuálních počítačů

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmssName": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "subscriptionId": {
      "type": "string"
    },
    "resourceGroupName": {
      "type": "string"
    },
    "galleryName": {
      "type": "string"
    },
    "applicationName1": {
      "type": "string"
    },
    "applicationVersion1": {
      "type": "string",
      "defaultValue": "latest"
    },
    "configurationReference1": {
      "type": "string",
      "metadata": {
        "description": "Optional path to configuration file from Storage Account. Overrides default configuration file."
      }
    },
    "applicationName2": {
      "type": "string"
    },
    "applicationVersion2": {
      "type": "string",
      "defaultValue": "latest"
    }
  },
  "variables": {
    "packageReferenceId1": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/galleries/{2}/applications/{3}/versions/{4}', parameters('subscriptionId'), parameters('resourceGroupName'), parameters('galleryName'), parameters('applicationName1'), parameters('applicationVersion1'))]",
    "packageReferenceId2": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/galleries/{2}/applications/{3}/versions/{4}', parameters('subscriptionId'), parameters('resourceGroupName'), parameters('galleryName'), parameters('applicationName2'), parameters('applicationVersion2'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachineScaleSets",
      "apiVersion": "2024-03-03",
      "name": "[parameters('vmssName')]",
      "location": "[parameters('location')]",
      "properties": {
        "virtualMachineProfile": {
          "applicationProfile": {
            "galleryApplications": [
              {
                "order": 1,
                "packageReferenceId": "[variables('packageReferenceId1')]",
                "configurationReference": "[parameters('configurationReference1')]",
                "treatFailureAsDeploymentFailure": true
              },
              {
                "order": 2,
                "packageReferenceId": "[variables('packageReferenceId2')]",
                "treatFailureAsDeploymentFailure": false
              }
            ]
          }
        }
      }
    }
  ]
}

Deploy VM Application on Azure VM

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmName": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "subscriptionId": {
      "type": "string"
    },
    "resourceGroupName": {
      "type": "string"
    },
    "galleryName": {
      "type": "string"
    },
    "applicationName1": {
      "type": "string"
    },
    "applicationVersion1": {
      "type": "string",
      "defaultValue": "latest"
    },
    "configurationReference1": {
      "type": "string",
      "metadata": {
        "description": "Optional path to configuration blob for application 1"
      }
    },
    "applicationName2": {
      "type": "string"
    },
    "applicationVersion2": {
      "type": "string",
      "defaultValue": "latest"
    }
  },
  "variables": {
    "packageReferenceId1": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/galleries/{2}/applications/{3}/versions/{4}', parameters('subscriptionId'), parameters('resourceGroupName'), parameters('galleryName'), parameters('applicationName1'), parameters('applicationVersion1'))]",
    "packageReferenceId2": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/galleries/{2}/applications/{3}/versions/{4}', parameters('subscriptionId'), parameters('resourceGroupName'), parameters('galleryName'), parameters('applicationName2'), parameters('applicationVersion2'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2024-07-01",
      "name": "[parameters('vmName')]",
      "location": "[parameters('location')]",
      "properties": {
        "applicationProfile": {
          "galleryApplications": [
            {
              "order": 1,
              "packageReferenceId": "[variables('packageReferenceId1')]",
              "configurationReference": "[parameters('configurationReference1')]",
              "treatFailureAsDeploymentFailure": true
            },
            {
              "order": 2,
              "packageReferenceId": "[variables('packageReferenceId2')]",
              "treatFailureAsDeploymentFailure": false
            }
          ]
        }
      }
    }
  ]
}

Další kroky