L'applicazione VM è un tipo di risorsa in Azure Raccolta di calcolo che semplifica la pubblicazione, la distribuzione, la gestione, la condivisione e la distribuzione globale di applicazioni e script per le macchine virtuali.
Le applicazioni VM supportano un'ampia gamma di scenari, tra cui distribuzioni su larga scala, requisiti di bassa latenza, resilienza degli errori, implementazioni attendibili sicure, coerenza a livello di flotta, architetture di microservizi e gestione post-distribuzione. Altre informazioni sulle applicazioni di macchine virtuali.
Per creare e distribuire applicazioni sulla macchina virtuale di Azure, crea prima di tutto il pacchetto e carica l'applicazione nell'account di archiviazione di Azure come blob di archiviazione. Creare quindi la risorsa Azure VM application e la risorsa VM application version che fanno riferimento a questi BLOB di archiviazione. Azure archivia e replica questi BLOB negli account di archiviazione gestiti a livello di area. Infine, distribuire l'applicazione su qualsiasi macchina virtuale o set di scalabilità di macchine virtuali passando il riferimento all'applicazione in applicationProfile.
Diagramma che illustra il processo dettagliato relativo alla pubblicazione e alla distribuzione di applicazioni di macchine virtuali.
Prerequisiti
- Creare account di archiviazione Azure e contenitore di archiviazione. Questo contenitore viene usato per caricare i file dell'applicazione.
- Creare Azure Compute Gallery per memorizzare e condividere risorse applicative.
- Creare un'identità gestita assegnata dall'utente e assegnarla ad Azure Compute Gallery
Creare un pacchetto dell'applicazione
Prima di pubblicare la risorsa applicazione VM in Azure Compute Gallery, creare un pacchetto con i file dell'applicazione da caricare nell'Azure Storage Account. Il diagramma seguente mostra le possibili strutture di cartelle per organizzare i file dell'applicazione:
Screenshot che mostra la struttura di cartelle consigliata per il caricamento e la creazione di applicazioni vm.
1. Creare un pacchetto dei file dell'applicazione
L'applicazione VM richiede un singolo file come pacchetto dell'applicazione.
- Se l'installazione dell'applicazione richiede un singolo file eseguibile (.exe, .msi, .sh, .ps e così via), è possibile usarlo come pacchetto dell'applicazione.
- Se l'applicazione richiede più file (eseguibili, dipendenze, script, metadati e così via), archiviarli in un singolo file (, , ) e usare questo file come pacchetto dell'applicazione.
- Per l'applicazione di microservizi, è possibile creare un pacchetto e pubblicare ogni microservizio come applicazione di macchina virtuale Azure separata. Questa modularizzazione facilita il riutilizzo delle applicazioni, lo sviluppo tra team e l'installazione sequenziale dei microservizi usando la proprietà nel file applicationProfile.
Scopri di più su creazione di pacchetti applicativi per le applicazioni VM di Azure.
2. (Facoltativo) Creare un pacchetto del file di configurazione dell'applicazione
- È possibile specificare il file di configurazione separatamente usando nell'oggetto dell'applicazione della macchina virtuale. In questo modo si riduce il sovraccarico dell'archiviazione e dell'eliminazione dei pacchetti dell'applicazione.
- I file di configurazione possono essere passati anche durante la distribuzione dell'app usando la proprietà della macchina virtuale che abilita l'installazione personalizzata per ogni macchina virtuale.
- Se entrambe le proprietà sono impostate, esegue l'override della configurazione passata usando .
3. Creare lo script di installazione
Dopo il download dell'applicazione e del BLOB di configurazione nella macchina virtuale, Azure esegue lo script di installazione fornito per installare l'applicazione. Lo script di installazione viene fornito come stringa e ha un limite massimo di caratteri di 4.096 caratteri. I comandi di installazione devono essere scritti presupponendo che il pacchetto dell'applicazione e il file di configurazione si trovino nella directory corrente.
Potrebbero essere necessarie poche operazioni nello script di installazione
(Facoltativo) Usare l'interprete dei comandi corretto L'interprete dei comandi predefinito usato da Azure è /bin/bash nel sistema operativo Linux e cmd.exe nel sistema operativo Windows. È possibile usare un interprete diverso, ad esempio Chocolatey o PowerShell, se installato nel computer. Chiama l'eseguibile e passa i comandi ad esso. Ad esempio: . Se si usa PowerShell, è necessario usare la versione 3.11.0 del modulo Az.Storage.
(Facoltativo) Rinominare BLOB dell'applicazione e BLOB di configurazione Azure non può conservare il nome del BLOB originale e le estensioni di file. Azure scarica il file dell'applicazione con il nome della risorsa dell'applicazione VM pubblicata nella Azure Compute Gallery. Se quindi il nome dell'app vm è "VMApp1", il file scaricato nella macchina virtuale ha il nome "VMApp1" senza un'estensione. Il file di configurazione ha un nome predefinito come "VMApp1-config" senza un'estensione di file.
È possibile rinominare il file con l'estensione del file utilizzando lo script di installazione o è possibile passare i nomi nelle proprietà e della risorsa di versione dell'applicazione VM . Azure usa questi nomi anziché i nomi predefiniti durante il download dei file.
Decomprimere il blob dell'applicazione Per i pacchetti di applicazioni archiviati, è necessario decomprimerli prima di installare l'applicazione. Usare .zip o .tar poiché la maggior parte dei sistemi operativi ha il supporto predefinito per estrarre questi formati. Per altri formati, assicurarsi che il sistema operativo guest fornisca supporto.
Converti lo script in una stringa Lo script di installazione viene passato come stringa per la proprietà install nella risorsa publishingProfile della versione dell'applicazione Azure VM.
Installare silenziosamente e sincrono Installare le applicazioni silenziosamente senza alcuna richiesta dell'interfaccia utente. Poiché l'installazione viene eseguita in una macchina virtuale in cui l'input del cliente non è disponibile, è necessario usare flag di installazione automatica o invisibile all'utente. Inoltre, se il programma di installazione dell'applicazione genera processi in background o processi figlio o viene eseguito in modo asincrono, lo script principale potrebbe concludersi prima del completamento dell'installazione. Per assicurarsi che l'installazione completa venga completata prima che Azure contrassegni l'operazione con esito positivo, usare i flag di attesa o i comandi di blocco. Questo approccio è utile quando l'installazione prevede più passaggi che vengono eseguiti in modo asincrono oppure è necessario verificare il completamento dell'installazione prima dell'inizio dell'applicazione successiva nella sequenza.
Esempi comuni prevedono:
-
Windows .msi:
start /wait msiexec /i app.msi /quiet /qn
-
Windows .exe:
start /wait app.exe /silent o start /wait app.exe /quiet o start /wait app.exe /S
- PowerShell:
- Linux .sh: (gli script della shell vengono eseguiti in modo sincrono per impostazione predefinita)
- Linux .deb: (viene eseguito in modo sincrono per impostazione predefinita)
- Linux .rpm: (viene eseguito in modo sincrono per impostazione predefinita)
(Facoltativo) Impostare correttamente i criteri di esecuzione e le autorizzazioni Dopo la decompressione, le autorizzazioni dei file potrebbero essere reimpostate. È consigliabile impostare le autorizzazioni corrette prima di eseguire i file.
(Facoltativo) L'impostazione dell'esecuzione dettagliata e la registrazione delle applicazioni della macchina virtuale consentono di acquisire automaticamente qualsiasi output dallo script di installazione e di archiviarlo in un file stdout nella macchina virtuale. Usare questa funzionalità per registrare lo stato dell'installazione, gli errori di debug e verificare le distribuzioni riuscite.
- Abilitare la modalità dettagliata per acquisire i log del programma di installazione dell'applicazione. Bash: , PowerShell: , Cmd: .
- Aggiungere messaggi personalizzati per tenere traccia dello stato dello script. Bash: , PowerShell: , Cmd:
È possibile recuperare questi log usando Esegui comando o connettendosi alla macchina virtuale. I file e si trovano nel percorso seguente
- Linux:
- Windows:
C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<application name>\<application version>/
(facoltativo) Spostare l'applicazione e il BLOB di configurazione nel percorso appropriato Azure scarica il BLOB dell'applicazione e il BLOB di configurazione nei percorsi seguenti. Lo script di installazione deve spostare i file in percorsi appropriati, se necessario.
Linux:
Windows: C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.16\Downloads\<application name>\<application version>
Ecco alcuni script di installazione di esempio basati sull'estensione di file del BLOB dell'applicazione. Se le proprietà & vengono fornite in con il nome e l'estensione del file, rimuovere il codice per rinominare i file negli script seguenti.
-
.TAR
-
.ZIP
-
.EXE
-
.MSI
-
.DEB
-
. RPM
-
.SH
-
.PS1
Sostituire con il nome dell'app della macchina virtuale nel pacchetto dell'applicazione (VMApp1) e nel file di configurazione (VMApp1-config).
Sostituire con il nome dell'app desiderato.
Sostituire con il nome di configurazione desiderato.
Eseguire l'installazione con bash senza file di configurazione:
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
Eseguire l'installazione con bash con il file di configurazione:
mv VMApp1 app.tar && mv VMApp1-config config.yaml && tar -xf app.tar && chmod -R +xr . && bash ./install.sh --config config.yaml
Se il file di configurazione viene creato in un pacchetto all'interno del file 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
Sostituire con il nome dell'app della macchina virtuale nel pacchetto dell'applicazione (VMApp1) e nel file di configurazione (VMApp1-config).
Sostituire con il nome dell'app desiderato.
Sostituire con il nome di configurazione desiderato.
Gli esempi seguenti presuppongono che l'applicazione vm installi l'applicazione Python e che il pythonInstaller.exe sia inserito in un pacchetto all'interno di app.zip.
Eseguire l'installazione con CMD senza file di configurazione:
Sostituire VMApp1 con il nome dell'app della macchina virtuale e app.zip con il nome desiderato per il file eseguibile nello script seguente.
ren VMApp1 app.zip && tar -xf app.zip && start /wait pythonInstaller.exe /quiet InstallAllUsers=1 PrependPath=1
Eseguire l'installazione con CMD con il file di configurazione:
ren VMApp1 app.zip && tar -xf app.zip && ren VMApp1-config config.json && start /wait pythonInstaller.exe --config config.json /quiet InstallAllUsers=1 PrependPath=1
Se il file di configurazione è incluso nel pacchetto .zip
ren VMApp1 app.zip && tar -xf app.zip && start /wait pythonInstaller.exe --config config.json /quiet InstallAllUsers=1 PrependPath=1
Eseguire l'installazione con PowerShell senza file di configurazione:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item VMApp1 app.zip; Expand-Archive -Path '.\app.zip' -DestinationPath '.'; Start-Process -FilePath '.\pythonInstaller.exe' -ArgumentList '/quiet','InstallAllUsers=1','PrependPath=1' -Wait -NoNewWindow"
Eseguire l'installazione con PowerShell con il file di configurazione:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item VMApp1 app.zip; Rename-Item VMApp1-config config.json Expand-Archive -Path '.\app.zip' -DestinationPath '.'; Start-Process -FilePath '.\pythonInstaller.exe' -ArgumentList '--config','config.json','/quiet','InstallAllUsers=1','PrependPath=1' -Wait -NoNewWindow"
Se il file di configurazione è incluso nel pacchetto .zip
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item VMApp1 app.zip; Expand-Archive -Path '.\app.zip' -DestinationPath '.'; Start-Process -FilePath '.\pythonInstaller.exe' -ArgumentList '--config','config.json','/quiet','InstallAllUsers=1','PrependPath=1' -Wait -NoNewWindow"
Sostituire con il nome dell'app della macchina virtuale nel pacchetto dell'applicazione (VMApp1) e nel file di configurazione (VMApp1-config).
Sostituire con il nome dell'app desiderato.
Sostituire con il nome di configurazione desiderato.
Gli esempi seguenti presuppongono che l'applicazione vm installi l'applicazione Python usando EXE.
Eseguire l'installazione con CMD senza file di configurazione:
Sostituire VMApp1 con il nome dell'app della macchina virtuale e pythonInstaller.exe con il nome desiderato per il file eseguibile.
ren VMApp1 pythonInstaller.exe && start /wait pythonInstaller.exe /quiet InstallAllUsers=1 PrependPath=1
Eseguire l'installazione con CMD con il file di configurazione:
ren VMApp1 pythonInstaller.exe && ren VMApp1-config config.json && start /wait pythonInstaller.exe --config config.json /quiet InstallAllUsers=1 PrependPath=1
Eseguire l'installazione con PowerShell senza file di configurazione:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item VMApp1 pythonInstaller.exe; Start-Process -FilePath '.\pythonInstaller.exe' -ArgumentList '/quiet','InstallAllUsers=1','PrependPath=1' -Wait -NoNewWindow"
Eseguire l'installazione con PowerShell con il file di configurazione:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item VMApp1 pythonInstaller.exe; Rename-Item VMApp1-config config.json; Start-Process -FilePath '.\pythonInstaller.exe' -ArgumentList '--config','config.json','/quiet','InstallAllUsers=1','PrependPath=1' -Wait -NoNewWindow"
Sostituire con il nome dell'app della macchina virtuale nel pacchetto dell'applicazione (VMApp1) e nel file di configurazione (VMApp1-config).
Sostituire con il nome dell'app desiderato.
Sostituire con il nome di configurazione desiderato.
Gli esempi seguenti presuppongono che l'applicazione di macchina virtuale installi un'applicazione Python utilizzando il pacchetto MSI.
Eseguire l'installazione con CMD senza file di configurazione:
Sostituire VMApp1 con il nome dell'app della macchina virtuale e pythonInstaller.msi con il nome desiderato per il file MSI.
ren VMApp1 pythonInstaller.msi && msiexec /i pythonInstaller.msi /quiet InstallAllUsers=1 PrependPath=1
Eseguire l'installazione con CMD con il file di configurazione:
ren VMApp1 pythonInstaller.msi && ren VMApp1-config config.json && msiexec /i pythonInstaller.msi CONFIGFILE=config.json /quiet InstallAllUsers=1 PrependPath=1
Eseguire l'installazione con PowerShell senza file di configurazione:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item VMApp1 pythonInstaller.msi; Start-Process -FilePath 'msiexec.exe' -ArgumentList '/i','.\pythonInstaller.msi','/quiet','InstallAllUsers=1','PrependPath=1' -Wait -NoNewWindow"
Eseguire l'installazione con PowerShell con il file di configurazione:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item VMApp1 pythonInstaller.msi; Rename-Item VMApp1-config config.json; Start-Process -FilePath 'msiexec.exe' -ArgumentList '/i','.\pythonInstaller.msi','CONFIGFILE=config.json','/quiet','InstallAllUsers=1','PrependPath=1' -Wait -NoNewWindow"
Sostituire con il nome dell'app della macchina virtuale nel pacchetto dell'applicazione (VMApp1) e nel file di configurazione (VMApp1-config).
Sostituire con il nome dell'app desiderato.
Sostituire con il nome di configurazione desiderato.
Eseguire l'installazione con bash senza file di configurazione:
mv VMApp1 app.deb && chmod +xr app.deb && sudo DEBIAN_FRONTEND=noninteractive dpkg -i ./app.deb
Eseguire l'installazione con bash con il file di configurazione:
mv VMApp1 app.deb && mv VMApp1-config config.cfg && chmod +xr app.deb && sudo debconf-set-selections < config.cfg && sudo DEBIAN_FRONTEND=noninteractive dpkg -i ./app.deb
Sostituire con il nome dell'app della macchina virtuale nel pacchetto dell'applicazione (VMApp1) e nel file di configurazione (VMApp1-config).
Sostituire con il nome dell'app desiderato.
Sostituire con il nome di configurazione desiderato.
Eseguire l'installazione con bash senza file di configurazione:
mv VMApp1 app.rpm && chmod +xr app.rpm && sudo rpm -ivh ./app.rpm
Eseguire l'installazione con bash con il file di configurazione:
mv VMApp1 app.rpm && mv VMApp1-config config.cfg && chmod +xr app.rpm && sudo rpm -ivh ./app.rpm --rcfile config.cfg
Sostituire con il nome dell'app della macchina virtuale nel pacchetto dell'applicazione (VMApp1) e nel file di configurazione (VMApp1-config).
Sostituire con il nome dello script desiderato.
Sostituire con il nome di configurazione desiderato.
Eseguire l'installazione con bash senza file di configurazione:
mv VMApp1 install.sh && chmod +xr install.sh && bash ./install.sh
Eseguire l'installazione con bash con il file di configurazione:
mv VMApp1 install.sh && mv VMApp1-config config.yaml && chmod +xr install.sh && bash ./install.sh --config config.yaml
Sostituire con il nome dell'app della macchina virtuale nel pacchetto dell'applicazione (VMApp1) e nel file di configurazione (VMApp1-config).
Sostituire con il nome dello script desiderato.
Sostituire con il nome di configurazione desiderato.
Eseguire l'installazione con PowerShell senza file di configurazione:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item -Path '.\VMApp1' -NewName 'install.ps1'; .\install.ps1"
Eseguire l'installazione con PowerShell con il file di configurazione:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Rename-Item -Path '.\VMApp1' -NewName 'install.ps1'; Rename-Item -Path '.\VMApp1-config' -NewName 'config.json'; .\install.ps1 -ConfigFile 'config.json'"
4. Creare lo script di rimozione
Lo script consente di definire le operazioni per la rimozione dell'applicazione. Lo script viene fornito come stringa e ha un limite massimo di caratteri di 4.096 caratteri. Scrivere i comandi presupponendo che il pacchetto dell'applicazione e il file di configurazione si trovino nella directory corrente. Durante l'operazione di disinstallazione, Azure esegue lo script di disinstallazione e quindi elimina tutti i file dal repository.
Esistono poche operazioni che lo script deve eseguire.
- Disinstallare l'applicazione: Disinstallare correttamente l'applicazione dalla macchina virtuale. Per esempio:
CMD su Windows:
start /wait uninstall.exe /quiet
start /wait python.exe /uninstall /quiet
start /wait msiexec /x app.msi /quiet /qn
PowerShell in Windows:
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Start-Process -FilePath '.\uninstall.exe' -ArgumentList '/quiet' -Wait -NoNewWindow"
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Start-Process -FilePath '.\python.exe' -ArgumentList '/uninstall','/quiet' -Wait -NoNewWindow"
powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "Start-Process -FilePath 'msiexec.exe' -ArgumentList '/x','.\app.msi','/quiet','/qn' -Wait -NoNewWindow"
Bash su Linux
sudo ./uninstall.sh
sudo apt remove -y app
sudo rpm -e app
- Rimuovere i file residui: Se l'installazione dell'applicazione crea file in altre parti del file system, rimuovere tali file.
Caricare i file dell'applicazione in Azure account di archiviazione
Importante
Prima di caricare file o generare URL SAS, assegnare ruoli all'utente, al principale del servizio o all'identità gestita che esegue tali operazioni sull'account di archiviazione di destinazione o sul contenitore:
- Collaboratore dati BLOB di archiviazione o Proprietario dati BLOB di archiviazione: necessario per caricare, modificare o eliminare BLOB.
- Per generare una firma di accesso condiviso con Azure AD, ad esempio usando l'accesso
--auth-mode nell'interfaccia della riga di comando/PowerShell, assegnare anche il ruolo Delegato BLOB di archiviazione a livello di ambito dell'account di archiviazione.
Caricare l'applicazione in pacchetto e il file di configurazione facoltativo come BLOB. I BLOB di blocco funzionano nella maggior parte dei casi.
(Facoltativo) Se è necessario usare BLOB di pagine, allineare i file ai byte prima di caricarli usando uno degli script seguenti:
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
$inputFile = <the file you want to pad>
$fileInfo = Get-Item -Path $inputFile
$remainder = $fileInfo.Length % 512
if ($remainder -ne 0){
$difference = 512 - $remainder
$bytesToPad = [System.Byte[]]::CreateInstance([System.Byte], $difference)
Add-Content -Path $inputFile -Value $bytesToPad -Encoding Byte
}
2. Generare l'URL SAS o l'URL Blob per il pacchetto dell'applicazione e il file di configurazione
Dopo che l'applicazione e i file di configurazione vengono caricati nell'account di archiviazione, è necessario generare un URL del blob o un URL SAS con privilegi di lettura per questo blob. Questi URL vengono quindi forniti come riferimento durante la creazione della risorsa della versione dell'applicazione della macchina virtuale.
Annotazioni
L'uso di URL BLOB con identità gestita è fortemente consigliato per migliorare la sicurezza e la privacy.
Usare l'URL del BLOB:
- Se viene assegnata un'identità gestita ad Azure Compute Gallery.
- Se l'account di archiviazione è abilitato per l'accesso anonimo. Usare questo metodo solo per i test perché non è sicuro.
Usare l'URL SAS:
- Se l'account di archiviazione è disabilitato per l'accesso anonimo e l'identità gestita è assegnata alla Raccolta di calcolo di Azure.
URL BLOB = https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${BLOB_NAME} SAS URL = https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${BLOB_NAME}?${SAS_TOKEN}
-
Interfaccia della riga di comando utilizzando URL Blob
-
CLI con URL SAS
-
PowerShell utilizzando URL Blob
-
PowerShell con URL SAS
-
Portale
Usare il seguente script se l'identità gestita è assegnata a l'Azure Compute Gallery. Questo approccio utilizza URL BLOB senza 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
Usare lo script seguente se l'account di archiviazione ha accesso anonimo disabilitato e le identità gestite non sono assegnate ad Azure Compute Gallery. Questo approccio genera token SAS limitati nel tempo.
#!/bin/bash
set -euo pipefail
# === CONFIGURATION ===
STORAGE_ACCOUNT="yourstorageaccount"
CONTAINER_NAME="yourcontainer"
APP_FILE="./your-app-file" # Path to your application payload file
CONFIG_FILE="./your-config-file" # Path to your configuration file (optional)
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 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 SAS URLs ===
# Note: Using --auth-mode login --as-user requires "Storage Blob Delegator" role at the storage account scope
echo "Generating SAS URLs..."
EXPIRY=$(date -u -d "+$SAS_EXPIRY_HOURS hours" '+%Y-%m-%dT%H:%MZ')
APP_SAS_TOKEN=$(az storage blob generate-sas \
--account-name "$STORAGE_ACCOUNT" \
--container-name "$CONTAINER_NAME" \
--name "$APP_BLOB_NAME" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
APP_SAS_URL="https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${APP_BLOB_NAME}?${APP_SAS_TOKEN}"
echo "Application file: $APP_SAS_URL"
if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
CONFIG_SAS_TOKEN=$(az storage blob generate-sas \
--account-name "$STORAGE_ACCOUNT" \
--container-name "$CONTAINER_NAME" \
--name "$CONFIG_BLOB_NAME" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
CONFIG_SAS_URL="https://${STORAGE_ACCOUNT}.blob.core.windows.net/${CONTAINER_NAME}/${CONFIG_BLOB_NAME}?${CONFIG_SAS_TOKEN}"
echo "Configuration file: $CONFIG_SAS_URL"
fi
Usare lo script seguente se l'identità gestita viene assegnata ad "Azure Compute Gallery". Questo approccio utilizza URL blob senza token SAS.
# === CONFIGURATION ===
$subscriptionId = "your-subscription-id"
$resourceGroupName = "yourresourcegroup"
$storageAccountName = "yourstorageaccount"
$containerName = "yourcontainer"
$appFile = "C:\path\to\your-app-file" # Path to your application payload file
$configFile = "C:\path\to\your-config-file" # Path to your configuration file (optional, set to $null if not needed)
$sasExpiryHours = 24
# === LOGIN (if not already logged in) ===
Connect-AzAccount -Subscription $subscriptionId
# === GET STORAGE CONTEXT ===
$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName
$context = $storageAccount.Context
# === CREATE CONTAINER IF NOT EXISTS ===
$container = Get-AzStorageContainer -Name $containerName -Context $context -ErrorAction SilentlyContinue
if (-not $container) {
New-AzStorageContainer -Name $containerName -Context $context -Permission Off
}
# === UPLOAD APPLICATION FILE ===
$appBlobName = Split-Path -Leaf $appFile
Set-AzStorageBlobContent `
-File $appFile `
-Container $containerName `
-Blob $appBlobName `
-Context $context `
-Force
# === UPLOAD CONFIG FILE (optional) ===
if ($configFile -and (Test-Path $configFile)) {
$configBlobName = Split-Path -Leaf $configFile
Set-AzStorageBlobContent `
-File $configFile `
-Container $containerName `
-Blob $configBlobName `
-Context $context `
-Force
}
# === GENERATE BLOB URLs ===
Write-Host "`nGenerating Blob URLs..."
$appBlobUrl = "https://$storageAccountName.blob.core.windows.net/$containerName/$appBlobName"
Write-Host "Application file: $appBlobUrl"
if ($configFile -and (Test-Path $configFile)) {
$configBlobUrl = "https://$storageAccountName.blob.core.windows.net/$containerName/$configBlobName"
Write-Host "Configuration file: $configBlobUrl"
}
Usare lo script seguente se l'account di archiviazione ha accesso anonimo disabilitato e identità gestita non venga assegnata ad Azure Compute Gallery. Questo approccio genera token di firma di accesso condiviso (SAS) con limitazioni temporali.
# === CONFIGURATION ===
$subscriptionId = "your-subscription-id"
$resourceGroupName = "yourresourcegroup"
$storageAccountName = "yourstorageaccount"
$containerName = "yourcontainer"
$appFile = "C:\path\to\your-app-file" # Path to your application payload file
$configFile = "C:\path\to\your-config-file" # Path to your configuration file (optional, set to $null if not needed)
$sasExpiryHours = 24
# === LOGIN (if not already logged in) ===
Connect-AzAccount -Subscription $subscriptionId
# === GET STORAGE CONTEXT ===
$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName
$context = $storageAccount.Context
# === CREATE CONTAINER IF NOT EXISTS ===
$container = Get-AzStorageContainer -Name $containerName -Context $context -ErrorAction SilentlyContinue
if (-not $container) {
New-AzStorageContainer -Name $containerName -Context $context -Permission Off
}
# === UPLOAD APPLICATION FILE ===
$appBlobName = Split-Path -Leaf $appFile
Set-AzStorageBlobContent `
-File $appFile `
-Container $containerName `
-Blob $appBlobName `
-Context $context `
-Force
# === UPLOAD CONFIG FILE (optional) ===
if ($configFile -and (Test-Path $configFile)) {
$configBlobName = Split-Path -Leaf $configFile
Set-AzStorageBlobContent `
-File $configFile `
-Container $containerName `
-Blob $configBlobName `
-Context $context `
-Force
}
# === GENERATE SAS URLs ===
Write-Host "`nGenerating SAS URLs..."
$expiryTime = (Get-Date).AddHours($sasExpiryHours)
$appSasToken = New-AzStorageBlobSASToken `
-Container $containerName `
-Blob $appBlobName `
-Permission r `
-ExpiryTime $expiryTime `
-Context $context
$appSasUrl = "https://$storageAccountName.blob.core.windows.net/$containerName/$appBlobName$appSasToken"
Write-Host "Application file: $appSasUrl"
if ($configFile -and (Test-Path $configFile)) {
$configSasToken = New-AzStorageBlobSASToken `
-Container $containerName `
-Blob $configBlobName `
-Permission r `
-ExpiryTime $expiryTime `
-Context $context
$configSasUrl = "https://$storageAccountName.blob.core.windows.net/$containerName/$configBlobName$configSasToken"
Write-Host "Configuration file: $configSasUrl"
}
- Nel portale Azure passare all'account di archiviazione e selezionare Containers.
- Selezionare il contenitore (o crearne uno), quindi selezionare Carica.
- Passare al pacchetto dell'applicazione e ai file di configurazione, selezionarli e selezionare Carica.
- Al termine del caricamento, selezionare ogni BLOB e copiare l'URL. Generare token SAS se l'identità gestita non è collegata alla raccolta di calcolo o se l'accesso anonimo è disabilitato.
Per i passaggi dettagliati, vedere Caricare BLOB in Azure Storage tramite il portale.
Creare l'applicazione vm
Per creare l'applicazione vm, creare prima di tutto la risorsa applicazione vm , che descrive l'applicazione. Creare la risorsa Versione applicazione della macchina virtuale al suo interno, che contiene il payload dell'applicazione della macchina virtuale e gli script per installare, aggiornare ed eliminare l'applicazione. Il payload viene fornito usando un URL BLOB o un URL della firma di accesso condiviso al contenitore BLOB nell'account di archiviazione di Azure.
Per altre informazioni su ogni proprietà, consultare lo schema per l'applicazione VM e la risorsa della versione dell'applicazione VM.
Usare il modello ARM seguente per creare una Raccolta di calcolo di Azure, un'applicazione della macchina virtuale e una versione dell'applicazione della macchina virtuale. Questo modello illustra le proprietà chiave e le opzioni di configurazione per la pubblicazione del pacchetto dell'applicazione.
{
"$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')]"
}
}
]
}
Creare la definizione dell'applicazione VM usando l'API 'create gallery application API'
- Si sta creando una definizione di applicazione vm denominata myApp.
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": "2030-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"
}
}
Creare una versione dell'applicazione della macchina virtuale usando l'API "crea versione applicazione raccolta".
Verrà quindi creata la versione all'interno della definizione dell'applicazione. Utilizza l'URL BLOB/SAS creato nel passaggio precedente per prelevare il blob dell'applicazione e della configurazione dall'account di archiviazione.
- Aggiorna "mediaLink", installa e rimuovi le proprietà per la tua applicazione.
- (Facoltativo) Aggiornare defaultConfigurationLink per passare il file di configurazione.
- (Facoltativo) Aggiornare packageFileName e configFileName abilitando Azure per scaricare i file con questo nome. Queste proprietà eliminano la necessità di rinominare i file scaricati nello script di installazione.
PUT
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/applications/{applicationName}/versions/{versionName}?api-version=2024-03-03
{
"location": "West US",
"properties": {
"publishingProfile": {
"source": {
"mediaLink": "Blob or SAS URL of application blob",
"defaultConfigurationLink": "Blob or SAS URL of configuration blob. Optional"
},
"manageActions": {
"install": "Install script for application as string",
"remove": "Uninstall script for application as string",
"update": "Update script for application as string. Optional "
},
"targetRegions": [
{
"name": "West US",
"regionalReplicaCount": 1
},
{
"name": "East US. Optional"
}
]
"endofLifeDate": "2030-01-01",
"replicaCount": 1,
"excludeFromLatest": false,
"storageAccountType": "PremiumV2_LRS | Premium_LRS | Standard_LRS | Standard_ZRS",
"safetyProfile": {
"allowDeletionOfReplicatedLocations": false
},
"settings": {
"scriptBehaviorAfterReboot": "None | Rerun",
"configFileName": "Name for downloaded configuration file on the VM",
"packageFileName": "Name for downloaded application file on the VM"
}
}
}
Creare la definizione dell'applicazione vm usando 'az sig gallery-application create'.
- Si sta creando una definizione di applicazione vm denominata myApp per le macchine virtuali basate su Linux.
- Le applicazioni vm richiedono Azure CLI versione 2.30.0 o successiva.
application_name="myApp"
gallery_name="myGallery"
resource_group="myResourceGroup"
location="East US"
os_type="Linux"
az sig gallery-application create \
--application-name "$application_name" \
--gallery-name "$gallery_name" \
--resource-group "$resource_group" \
--os-type "$os_type" \
--location "$location"
Creare una versione dell'applicazione vm usando 'az sig gallery-application version create'.
Verrà quindi creata la versione all'interno della definizione dell'applicazione. Utilizza l'URL blob/SAS creato nel passaggio precedente per recuperare il blob dell'applicazione dall'account di archiviazione.
- Aggiorna package_url, install_command, remove_command per l'applicazione.
- (Facoltativo) Rimuovere il commento e aggiornare config_url e il collegamento default-configuration-file-link per passare facoltativamente il file di configurazione.
- (Facoltativo) Aggiornare package_file_name e config_file_name. Azure scarica i file con questo nome eliminando la necessità di rinominare i file scaricati nello script di installazione.
version_name="1.0.0"
package_url="Blob or SAS URL for application blob"
package_file_name="Name to give for downloaded application file on VM"
# config_url="Blob or SAS URL for configuration"
# config_file_name="Name to give for downloaded config file on VM"
install_command="install script for your application"
remove_command="uninstall script for you application"
target_regions='[
{"name": "South Central US", "regionalReplicaCount": 2},
{"name": "West Europe", "regionalReplicaCount": 1}
]'
az sig gallery-application version create \
--version-name "$version_name" \
--application-name "$application_name" \
--gallery-name "$gallery_name" \
--location "$location" \
--resource-group "$resource_group" \
--package-file-link "$package_url" \
--package-file-name "$package_file_name" \
--install-command "$install_command" \
--remove-command "$remove_command" \
--target-regions "$target_regions"
# --default-configuration-file-link "$config_url" \
# --config-file-name "$config_file_name" \
Creare la definizione dell'applicazione vm usando 'New-AzGalleryApplication'.
- Verrà creata un'app Linux denominata myApp nel gruppo di risorse myGallery Azure e nella raccolta di risorse myGallery.
- Sostituire i valori per le variabili in base alle esigenze.
$galleryName = "myGallery"
$rgName = "myResourceGroup"
$applicationName = "myApp"
$description = "Backend Linux application for finance."
$location = "East US"
New-AzGalleryApplication `
-ResourceGroupName $rgName `
-GalleryName $galleryName `
-Location $location `
-Name $applicationName `
-SupportedOSType Windows `
-Description $description
Creare una versione dell'applicazione vm usando 'New-AzGalleryApplicationVersion'.
Verrà quindi creata la versione all'interno della definizione dell'applicazione. Usa l'URL BLOB/SAS creato nel passaggio precedente per eseguire il pull del BLOB dell'applicazione dall'account di archiviazione.
- Aggiorna package_url, install_command, remove_command per la tua applicazione.
- (Facoltativo) Rimuovere il commento e aggiornare config_url e il collegamento default-configuration-file-link per passare facoltativamente il file di configurazione.
- (Facoltativo) Aggiornare package_file_name e config_file_name. Azure scarica i file con questo nome eliminando la necessità di rinominare i file scaricati nello script di installazione.
$galleryName = "myGallery"
$rgName = "myResourceGroup"
$location = "East US"
$applicationName = "myApp"
$version = "1.0.0"
$package_url = "Blob or SAS URL for application blob in storage account"
$package_file_name="Name to give for downloaded application file on VM"
# $config_url = "Blob or SAS URL for configuration blob in storage account"
# $config_file_name="Name to give for downloaded config file on VM"
$install_command = "Install script for your application"
$remove_command = "Uninstall script for your application"
$target_regions = @(
@{ Name = "South Central US"; RegionalReplicaCount = 2 },
@{ Name = "West Europe"; RegionalReplicaCount = 1 }
)
New-AzGalleryApplicationVersion `
-ResourceGroupName $rgName `
-GalleryName $galleryName `
-GalleryApplicationName $applicationName `
-Name $version `
-PackageFileLink $package_url `
-PackageFileName $package_file_name `
-Location $location `
-Install $install_command `
-Remove $remove_command `
-TargetRegion $target_regions
# -DefaultConfigFileLink $config_url `
# -ConfigFileName $config_file_name `
- Passare al portale di Azure, quindi cercare e selezionare Azure Compute Gallery.
- Selezionare la raccolta da usare nell'elenco.
- Nella pagina della raccolta selezionare Aggiungi nella parte superiore della pagina, quindi selezionare Definizione dell'applicazione della macchina virtuale nell'elenco a discesa. Verrà visualizzata la pagina Creare una definizione di applicazione della macchina virtuale.
- Nella scheda Basics immettere un nome per l'applicazione e scegliere se l'applicazione è per le macchine virtuali che eseguono Linux o Windows.
- Selezionare la scheda Opzioni di pubblicazione se si vuole specificare una delle impostazioni facoltative seguenti per la definizione dell'applicazione vm:
- Descrizione della definizione dell'applicazione vm.
- Data di scadenza
- Collegamento a un contratto di licenza con l'utente finale
- URI di un'informativa sulla privacy
- URI per le note sulla versione
- Al termine, selezionare Rivedi e crea.
- Al termine della convalida, selezionare Crea per distribuire la definizione.
- Al completamento della distribuzione, selezionare Vai alla risorsa.
- Nella pagina dell'applicazione selezionare Creare una versione dell'applicazione della macchina virtuale. Verrà visualizzata la pagina Creare una versione dell'applicazione della macchina virtuale.
- Immettere un numero di versione come 1.0.0.
- Selezionare l'area in cui vengono caricati i pacchetti dell'applicazione.
- In Pacchetto dell'applicazione di origine selezionare Sfoglia. Selezionare l'account di archiviazione, quindi il contenitore in cui si trova il pacchetto. Selezionare il pacchetto dall'elenco, quindi selezionare Seleziona al termine. In alternativa, è possibile incollare l'URI di firma di accesso condiviso in questo campo, se preferito.
- Specificare lo "Script di installazione".
- Specificare lo "Script di disinstallazione".
- Facoltativamente, specificare lo "Script di aggiornamento".
- Se si dispone di un file di configurazione predefinito caricato in un account di archiviazione, è possibile selezionarlo in Configurazione predefinita.
- Selezionare Escludi dalla versione più recente se non si vuole che questa versione venga visualizzata come versione più recente quando si crea una macchina virtuale.
- Per Data di fine vita scegliere una data futura per tenere traccia del momento in cui questa versione deve essere ritirata. Non viene eliminata o rimossa automaticamente, è solo per il rilevamento.
- Per replicare questa versione in altre aree, selezionare la scheda Replica , aggiungere altre aree e apportare modifiche al numero di repliche per area. L'area originale in cui è stata creata la versione deve trovarsi nell'elenco e non può essere rimossa.
- Al termine delle modifiche, selezionare Rivedi e crea nella parte inferiore della pagina.
- Quando la convalida viene visualizzata come passata, selezionare Crea per distribuire la versione dell'applicazione della macchina virtuale.
name: Deploy Azure VM Application
on:
push:
branches:
- main
env:
APP_FILE: app.exe
CONFIG_FILE: app-config.json
AZURE_RESOURCE_GROUP: ${{ secrets.AZURE_RESOURCE_GROUP }}
AZURE_LOCATION: ${{ secrets.AZURE_LOCATION }}
AZURE_STORAGE_ACCOUNT: ${{ secrets.AZURE_STORAGE_ACCOUNT }}
AZURE_CONTAINER_NAME: ${{ secrets.AZURE_CONTAINER_NAME }}
GALLERY_NAME: ${{ secrets.GALLERY_NAME }}
APPLICATION_NAME: ${{ secrets.AZURE_VM_APPLICATION_NAME }}
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Azure Login
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: Upload files to Azure Blob Storage
run: |
set -euo pipefail
echo "Creating container if missing..."
az storage container create \
--name "$AZURE_CONTAINER_NAME" \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--auth-mode login \
--only-show-errors
echo "Uploading files..."
az storage blob upload \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$APP_FILE" \
--file "$APP_FILE" \
--auth-mode login \
--overwrite \
--only-show-errors
az storage blob upload \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$CONFIG_FILE" \
--file "$CONFIG_FILE" \
--auth-mode login \
--overwrite \
--only-show-errors
- name: Create VM Application if missing
run: |
set -euo pipefail
echo "Checking for existing VM Application..."
if ! az sig gallery-application show \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" &>/dev/null; then
az sig gallery-application create \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" \
--location "$AZURE_LOCATION" \
--os-type Windows
fi
- name: Generate SAS URLs
id: sas
run: |
set -euo pipefail
echo "Generating SAS URLs valid for 24 hours..."
EXPIRY=$(date -u -d "+1 day" '+%Y-%m-%dT%H:%MZ')
APP_SAS=$(az storage blob generate-sas \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$APP_FILE" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
CONFIG_SAS=$(az storage blob generate-sas \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$CONFIG_FILE" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
echo "APP_SAS=$APP_SAS" >> $GITHUB_ENV
echo "CONFIG_SAS=$CONFIG_SAS" >> $GITHUB_ENV
- name: Create VM Application Version
run: |
set -euo pipefail
MAJOR=1
MINOR=0
PATCH=$(date +%Y%m%d)
VERSION="$MAJOR.$MINOR.$PATCH"
INSTALL_CMD=$(jq -Rs '.' < install-script-as-string.txt)
REMOVE_CMD=$(jq -Rs '.' < uninstall-script-as-string.txt)
PACKAGE_URL="https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_CONTAINER_NAME}/${APP_FILE}?${APP_SAS}"
CONFIG_URL="https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_CONTAINER_NAME}/${CONFIG_FILE}?${CONFIG_SAS}"
az sig gallery-application version create \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" \
--version-name "$VERSION" \
--location "$AZURE_LOCATION" \
--package-file-link "$PACKAGE_URL" \
--default-configuration-file-link "$CONFIG_URL" \
--install-command "$INSTALL_CMD" \
--remove-command "$REMOVE_CMD" \
--only-show-errors
trigger:
branches:
include: [ main ]
variables:
APP_FILE: app.exe
CONFIG_FILE: app-config.json
AZURE_RESOURCE_GROUP: $(AZURE_RESOURCE_GROUP)
AZURE_LOCATION: $(AZURE_LOCATION)
AZURE_STORAGE_ACCOUNT: $(AZURE_STORAGE_ACCOUNT)
AZURE_CONTAINER_NAME: $(AZURE_CONTAINER_NAME)
GALLERY_NAME: $(GALLERY_NAME)
APPLICATION_NAME: $(AZURE_VM_APPLICATION_NAME)
stages:
- stage: DeployVMApp
displayName: Upload files and deploy Azure VM Application
jobs:
- job: Deploy
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
- task: AzureCLI@2
displayName: Upload app and config to Blob
inputs:
azureSubscription: 'AzureServiceConnection'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
set -euo pipefail
echo "Creating container if it doesn't exist..."
az storage container create \
--name "$AZURE_CONTAINER_NAME" \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--auth-mode login \
--only-show-errors
echo "Uploading files..."
az storage blob upload \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$APP_FILE" \
--file "$APP_FILE" \
--auth-mode login \
--overwrite \
--only-show-errors
az storage blob upload \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$CONFIG_FILE" \
--file "$CONFIG_FILE" \
--auth-mode login \
--overwrite \
--only-show-errors
- task: AzureCLI@2
displayName: Create VM Application Definition
inputs:
azureSubscription: 'AzureServiceConnection'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
set -euo pipefail
echo "Checking for existing VM Application..."
if ! az sig gallery-application show \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" &>/dev/null; then
echo "Creating new VM Application..."
az sig gallery-application create \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" \
--location "$AZURE_LOCATION" \
--os-type Windows
else
echo "VM Application definition already exists."
fi
- task: AzureCLI@2
displayName: Generate SAS URLs
inputs:
azureSubscription: 'AzureServiceConnection'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
set -euo pipefail
echo "Generating SAS URLs valid for 24 hours..."
EXPIRY=$(date -u -d "+1 day" '+%Y-%m-%dT%H:%MZ')
APP_SAS=$(az storage blob generate-sas \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$APP_FILE" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
CONFIG_SAS=$(az storage blob generate-sas \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$CONFIG_FILE" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
echo "##vso[task.setvariable variable=APP_SAS]$APP_SAS"
echo "##vso[task.setvariable variable=CONFIG_SAS]$CONFIG_SAS"
- task: AzureCLI@2
displayName: Create VM Application Version
inputs:
azureSubscription: 'AzureServiceConnection'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
set -euo pipefail
MAJOR=1
MINOR=0
PATCH=$(date +%Y%m%d)
VERSION="$MAJOR.$MINOR.$PATCH"
INSTALL_CMD=$(jq -Rs '.' < install-script-as-string.txt)
REMOVE_CMD=$(jq -Rs '.' < uninstall-script-as-string.txt)
PACKAGE_URL="https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_CONTAINER_NAME}/${APP_FILE}?${APP_SAS}"
CONFIG_URL="https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_CONTAINER_NAME}/${CONFIG_FILE}?${CONFIG_SAS}"
az sig gallery-application version create \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" \
--version-name "$VERSION" \
--location "$AZURE_LOCATION" \
--package-file-link "$PACKAGE_URL" \
--default-configuration-file-link "$CONFIG_URL" \
--install-command "$INSTALL_CMD" \
--remove-command "$REMOVE_CMD" \
--only-show-errors
stages:
- deploy
variables:
APP_FILE: "app.exe"
CONFIG_FILE: "app-config.json"
AZURE_RESOURCE_GROUP: "$AZURE_RESOURCE_GROUP"
AZURE_LOCATION: "$AZURE_LOCATION"
AZURE_STORAGE_ACCOUNT: "$AZURE_STORAGE_ACCOUNT"
AZURE_CONTAINER_NAME: "$AZURE_CONTAINER_NAME"
GALLERY_NAME: "$GALLERY_NAME"
APPLICATION_NAME: "$AZURE_VM_APPLICATION_NAME"
deploy_vm_app:
image: mcr.microsoft.com/azure-cli
stage: deploy
rules:
- if: $CI_COMMIT_BRANCH == "main"
script:
- az login --service-principal -u "$AZURE_CLIENT_ID" -p "$AZURE_CLIENT_SECRET" --tenant "$AZURE_TENANT_ID"
- az account set --subscription "$AZURE_SUBSCRIPTION_ID"
- |
echo "Creating container and uploading files..."
az storage container create \
--name "$AZURE_CONTAINER_NAME" \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--auth-mode login \
--only-show-errors
az storage blob upload \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$APP_FILE" \
--file "$APP_FILE" \
--auth-mode login \
--overwrite \
--only-show-errors
az storage blob upload \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$CONFIG_FILE" \
--file "$CONFIG_FILE" \
--auth-mode login \
--overwrite \
--only-show-errors
- |
echo "Checking for existing VM Application..."
if ! az sig gallery-application show \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" &>/dev/null; then
echo "Creating VM Application definition..."
az sig gallery-application create \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" \
--location "$AZURE_LOCATION" \
--os-type Windows \
--only-show-errors
else
echo "VM Application already exists."
fi
- |
echo "Generating SAS URLs and creating VM Application Version..."
EXPIRY=$(date -u -d "+1 day" '+%Y-%m-%dT%H:%MZ')
APP_SAS=$(az storage blob generate-sas \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$APP_FILE" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
CONFIG_SAS=$(az storage blob generate-sas \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$CONFIG_FILE" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
MAJOR=1
MINOR=0
PATCH=$(date +%Y%m%d)
VERSION="$MAJOR.$MINOR.$PATCH"
echo "Creating VM Application Version: $VERSION"
INSTALL_CMD=$(jq -Rs '.' < install-script-as-string.txt)
REMOVE_CMD=$(jq -Rs '.' < uninstall-script-as-string.txt)
az sig gallery-application version create \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" \
--version-name "$VERSION" \
--location "$AZURE_LOCATION" \
--package-file-link "https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_CONTAINER_NAME}/${APP_FILE}?${APP_SAS}" \
--default-configuration-file-link "https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_CONTAINER_NAME}/${CONFIG_FILE}?${CONFIG_SAS}" \
--install-command "$INSTALL_CMD" \
--remove-command "$REMOVE_CMD" \
--only-show-errors
pipeline {
agent any
environment {
APP_FILE = 'app.exe'
CONFIG_FILE = 'app-config.json'
AZURE_RESOURCE_GROUP = credentials('AZURE_RESOURCE_GROUP')
AZURE_LOCATION = credentials('AZURE_LOCATION')
AZURE_STORAGE_ACCOUNT = credentials('AZURE_STORAGE_ACCOUNT')
AZURE_CONTAINER_NAME = credentials('AZURE_CONTAINER_NAME')
GALLERY_NAME = credentials('GALLERY_NAME')
APPLICATION_NAME = credentials('AZURE_VM_APPLICATION_NAME')
AZURE_CLIENT_ID = credentials('AZURE_CLIENT_ID')
AZURE_CLIENT_SECRET = credentials('AZURE_CLIENT_SECRET')
AZURE_TENANT_ID = credentials('AZURE_TENANT_ID')
AZURE_SUBSCRIPTION_ID = credentials('AZURE_SUBSCRIPTION_ID')
}
stages {
stage('Login to Azure') {
steps {
sh '''
az login --service-principal \
-u "$AZURE_CLIENT_ID" \
-p "$AZURE_CLIENT_SECRET" \
--tenant "$AZURE_TENANT_ID"
az account set --subscription "$AZURE_SUBSCRIPTION_ID"
'''
}
}
stage('Upload to Blob Storage') {
steps {
sh '''
az storage container create \
--name "$AZURE_CONTAINER_NAME" \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--auth-mode login \
--only-show-errors
az storage blob upload \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$APP_FILE" \
--file "$APP_FILE" \
--auth-mode login \
--overwrite \
--only-show-errors
az storage blob upload \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$CONFIG_FILE" \
--file "$CONFIG_FILE" \
--auth-mode login \
--overwrite \
--only-show-errors
'''
}
}
stage('Create VM Application if Needed') {
steps {
sh '''
if ! az sig gallery-application show \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" &>/dev/null; then
az sig gallery-application create \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" \
--location "$AZURE_LOCATION" \
--os-type Windows \
--only-show-errors
fi
'''
}
}
stage('Generate SAS and Create Version') {
steps {
sh '''
EXPIRY=$(date -u -d "+1 day" '+%Y-%m-%dT%H:%MZ')
APP_SAS=$(az storage blob generate-sas \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$APP_FILE" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
CONFIG_SAS=$(az storage blob generate-sas \
--account-name "$AZURE_STORAGE_ACCOUNT" \
--container-name "$AZURE_CONTAINER_NAME" \
--name "$CONFIG_FILE" \
--permissions r \
--expiry "$EXPIRY" \
--auth-mode login \
--as-user \
-o tsv)
MAJOR=1
MINOR=0
PATCH=$(date +%Y%m%d)
VERSION="$MAJOR.$MINOR.$PATCH"
INSTALL_CMD=$(jq -Rs '.' < install-script-as-string.txt)
REMOVE_CMD=$(jq -Rs '.' < uninstall-script-as-string.txt)
PACKAGE_URL="https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_CONTAINER_NAME}/${APP_FILE}?${APP_SAS}"
CONFIG_URL="https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_CONTAINER_NAME}/${CONFIG_FILE}?${CONFIG_SAS}"
az sig gallery-application version create \
--resource-group "$AZURE_RESOURCE_GROUP" \
--gallery-name "$GALLERY_NAME" \
--application-name "$APPLICATION_NAME" \
--version-name "$VERSION" \
--location "$AZURE_LOCATION" \
--package-file-link "$PACKAGE_URL" \
--default-configuration-file-link "$CONFIG_URL" \
--install-command "$INSTALL_CMD" \
--remove-command "$REMOVE_CMD" \
--only-show-errors
'''
}
}
}
}
Distribuire le app per le macchine virtuali
È ora possibile fare riferimento a una o più applicazioni della macchina virtuale nel applicationProfile della macchina virtuale di Azure o dei set di scalabilità di macchine virtuali di Azure. Azure quindi esegue il pull del payload dell'applicazione vm e lo installa in ogni macchina virtuale usando lo script di installazione fornito. La proprietà definisce l'ordine sequenziale in cui vengono installate le applicazioni di macchine virtuali nella macchina virtuale.
Per altre informazioni su ogni proprietà, vedere lo schema del profilo applicazione della macchina virtuale/set di scalabilità di macchine virtuali.
-
Modello
-
REST
-
CLI
-
PowerShell
-
Portale
Usare il modello ARM seguente per distribuire l'Applicazione VM su Azure VM o su Set di macchine virtuali di Azure (Azure Virtual Machine Scale Sets). Questo modello illustra le proprietà chiave e le opzioni di configurazione per la distribuzione dell'applicazione vm.
Distribuire l'applicazione della macchina virtuale nei set di scalabilità di macchine virtuali
{
"$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
}
]
}
}
}
}
]
}
Distribuire l'applicazione VM sulla macchina virtuale Azure
{
"$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
}
]
}
}
}
]
}
Per aggiungere una versione dell'applicazione della macchina virtuale a una macchina virtuale, eseguire un'operazione PUT nella macchina virtuale.
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}"
}
Per applicare l'applicazione vm a un Virtual Machine Scale Sets uniforme:
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}"
}
La risposta include il modello di macchina virtuale completo. Di seguito sono riportate le parti pertinenti.
{
"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=}"
}
]
}
Impostare un'applicazione vm su una macchina virtuale esistente usando "az vm application set" e sostituire i valori dei parametri con i propri.
az vm application set \
--resource-group myResourceGroup \
--name myVM \
--app-version-ids /subscriptions/{subID}/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/galleries/myGallery/applications/myApp/versions/1.0.0 \
--treat-deployment-as-failure true
Per impostare più applicazioni in una macchina virtuale:
az vm application set \
--resource-group myResourceGroup \
--name myVM \
--app-version-ids /subscriptions/{subId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/galleries/myGallery/applications/myApp/versions/1.0.0 /subscriptions/{subId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/galleries/myGallery/applications/myApp2/versions/1.0.1 \
--treat-deployment-as-failure true true
Per aggiungere un'applicazione a un Virtual Machine Scale Sets, usare 'az vmss application set':
az vmss application set \
--resource-group myResourceGroup \
--name myVmss \
--app-version-ids /subscriptions/{subId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/galleries/myGallery/applications/myApp/versions/1.0.0 \
--treat-deployment-as-failure true
Per aggiungere più applicazioni a un Virtual Machine Scale Sets:
az vmss application set \
--resource-group myResourceGroup \
--name myVmss
--app-version-ids /subscriptions/{subId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/galleries/myGallery/applications/myApp/versions/1.0.0 /subscriptions/{subId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/galleries/myGallery/applications/myApp2/versions/1.0.0 \
--treat-deployment-as-failure true
Per aggiungere l'applicazione a una macchina virtuale esistente, ottenere la versione dell'applicazione e usarla per ottenere l'ID della versione dell'applicazione della macchina virtuale. Creare l'oggetto applicazione usando l'ID con 'New-AzVmGalleryApplication' e aggiungere l'applicazione alla configurazione della macchina virtuale usando 'Add-AzVmGalleryApplication'.
$galleryName = "myGallery"
$rgName = "myResourceGroup"
$applicationName = "myApp"
$version = "1.0.0"
$vmName = "myVM"
$vm = Get-AzVM -ResourceGroupName $rgname -Name $vmName
$appVersion = Get-AzGalleryApplicationVersion `
-GalleryApplicationName $applicationName `
-GalleryName $galleryName `
-Name $version `
-ResourceGroupName $rgName
$packageId = $appVersion.Id
$app = New-AzVmGalleryApplication -PackageReferenceId $packageId
Add-AzVmGalleryApplication -VM $vm -GalleryApplication $app -TreatFailureAsDeploymentFailure true
Update-AzVM -ResourceGroupName $rgName -VM $vm
Per aggiungere l'applicazione a un Virtual Machine Scale Sets:
$galleryName = "myGallery"
$rgName = "myResourceGroup"
$applicationName = "myApp"
$version = "1.0.0"
$vmssName = "myVMSS"
$vmss = Get-AzVmss -ResourceGroupName $rgname -Name $vmssName
$appVersion = Get-AzGalleryApplicationVersion `
-GalleryApplicationName $applicationName `
-GalleryName $galleryName `
-Name $version `
-ResourceGroupName $rgName
$packageId = $appVersion.Id
$app = New-AzVmssGalleryApplication -PackageReferenceId $packageId
Add-AzVmssGalleryApplication -VirtualMachineScaleSetVM $vmss.VirtualMachineProfile -GalleryApplication $app
Update-AzVmss -ResourceGroupName $rgName -VirtualMachineScaleSet $vmss -VMScaleSetName $vmssName
È ora possibile creare una macchina virtuale e distribuirla usando il portale. È sufficiente creare la macchina virtuale come di consueto e nella scheda Avanzate scegliere Selezionare un'applicazione della macchina virtuale da installare.
Screenshot della scheda Avanzate in cui è possibile scegliere di installare un'applicazione della macchina virtuale.
Selezionare l'applicazione vm dall'elenco e quindi selezionare Salva nella parte inferiore della pagina.
Screenshot che mostra la selezione di un'applicazione della macchina virtuale da installare nella macchina virtuale.
Se sono presenti più applicazioni di macchine virtuali da installare, è possibile impostare di nuovo l'ordine di installazione per ogni applicazione della macchina virtuale nella scheda Avanzate.
È anche possibile distribuire l'applicazione della macchina virtuale in macchine virtuali attualmente in esecuzione. Selezionare l'opzione Estensioni e applicazioni in Impostazioni nel menu a sinistra quando si visualizzano i dettagli della macchina virtuale nel portale.
Scegliere Applicazioni delle macchine virtuali quindi selezionare Aggiungi applicazione per aggiungere l'applicazione della macchina virtuale.
Screenshot che mostra la selezione di un'applicazione della macchina virtuale da installare in una macchina virtuale attualmente in esecuzione.
Selezionare l'applicazione vm dall'elenco e quindi selezionare Salva nella parte inferiore della pagina.
Screenshot che mostra la selezione di un'applicazione della macchina virtuale da installare nella macchina virtuale.
Passaggi successivi