Estensioni e funzionalità delle macchine virtuali per Linux

Le estensioni macchina virtuale di Azure sono applicazioni di piccole dimensioni che forniscono attività di configurazione e automazione post-distribuzione alle macchine virtuali di Azure. Ad esempio, se una macchina virtuale richiede l'installazione di software, la protezione antivirus o la possibilità di eseguire uno script al suo interno, è possibile usare un'estensione di macchina virtuale.

È possibile eseguire le estensioni di macchine virtuali di Azure usando l'interfaccia della riga di comando di Azure, PowerShell, i modelli di Azure Resource Manager (modelli arm) e il portale di Azure. Le estensioni possono essere aggregate con una nuova distribuzione di macchina virtuale o eseguite su un sistema esistente.

Questo articolo offre una panoramica delle estensioni delle macchine virtuali di Azure, dei prerequisiti per l'uso e indicazioni su come rilevare, gestire e rimuovere tali estensioni. Questo articolo fornisce informazioni generalizzate perché sono disponibili molte estensioni della macchina virtuale. Ognuno ha una configurazione potenzialmente univoca e la propria documentazione.

Casi d'uso ed esempi

Ogni estensione di macchina virtuale di Azure ha un caso d'uso specifico. Alcuni esempi:

  • Configurare il monitoraggio di una macchina virtuale usando l'estensione macchina virtuale di Microsoft Monitoring Agent.
  • Configurare il monitoraggio dell'infrastruttura di Azure usando l'estensione Chef o Datadog .

Oltre alle estensioni specifiche del processo, è disponibile un'estensione Script personalizzato per le macchine virtuali Linux e Windows. L'estensione script personalizzato per Linux consente l'esecuzione di qualsiasi script Bash in una macchina virtuale. Gli script personalizzati sono utili per la progettazione di distribuzioni di Azure che richiedono una configurazione in aggiunta a quella offerta dagli strumenti nativi di Azure.

Prerequisiti

Agente Linux di Azure

Per gestire l'estensione nella macchina virtuale, è necessario che sia installato l'agente Linux di Azure. Alcune estensioni individuali hanno prerequisiti, ad esempio l'accesso alle risorse o alle dipendenze.

L'agente Linux di Azure gestisce le interazioni tra una macchina virtuale di Azure e il controller di infrastruttura di Azure. L'agente è responsabile di molti aspetti funzionali della distribuzione e della gestione delle macchine virtuali di Azure, tra cui l'esecuzione di estensioni di macchina virtuale.

L'agente Linux di Azure è preinstallato nelle immagini di Azure Marketplace. Può anche essere installato manualmente nei sistemi operativi supportati.

L'agente viene eseguito su più sistemi operativi. Tuttavia, il framework delle estensioni ha un limite per i sistemi operativi usati dalle estensioni. Alcune estensioni non sono supportate in tutti i sistemi operativi e potrebbero generare codice di errore 51 ("sistema operativo non supportato"). Vedere la documentazione della singola estensione per informazioni sul supporto.

Accesso alla rete

I pacchetti di estensione vengono scaricati dal repository dell'estensione Archiviazione di Azure. I caricamenti dello stato dell'estensione vengono pubblicati in Archiviazione di Azure.

Se si usa una versione supportata dell'agente Linux di Azure, non è necessario consentire l'accesso alle Archiviazione di Azure nell'area della macchina virtuale. È possibile usare l'agente per reindirizzare la comunicazione al controller di infrastruttura di Azure per le comunicazioni degli agenti. Se si usa una versione non supportata dell'agente, è necessario consentire l'accesso in uscita a Archiviazione di Azure in tale area dalla macchina virtuale.

Importante

Se l'accesso all'indirizzo IP privato 168.63.129.16 è stato bloccato tramite il firewall guest, le estensioni hanno esito negativo anche se si usa una versione supportata dell'agente o l'accesso in uscita è stato configurato.

Gli agenti possono essere usati solo per caricare i pacchetti di estensioni e lo stato della creazione di report. Ad esempio, se un'installazione dell'estensione deve scaricare uno script da GitHub (estensione script personalizzato) o deve accedere a Archiviazione di Azure (Backup di Azure), è necessario aprire porte aggiuntive del firewall o del gruppo di sicurezza di rete. Le estensioni diverse hanno requisiti diversi, perché sono applicazioni a proprio diritto. Per le estensioni che richiedono l'accesso a Archiviazione di Azure, è possibile consentire l'accesso usando i tag del servizio NSG di Azure.

Per reindirizzare le richieste di traffico dell'agente, l'agente Linux di Azure supporta il server proxy. Tuttavia, il supporto del server proxy non applica le estensioni. È necessario configurare ogni singola estensione per usare un proxy.

Individuare le estensioni della macchina virtuale

Molte estensioni di macchina virtuale sono disponibili per l'uso con le macchine virtuali di Azure. Per visualizzare un elenco completo, usare az vm extension image list. L'esempio seguente elenca tutte le estensioni disponibili nella posizione westus:

az vm extension image list --location westus --output table

Eseguire le estensioni della macchina virtuale

Le estensioni macchina virtuale di Azure vengono eseguite in macchine virtuali esistenti. Questo è utile quando è necessario apportare modifiche alla configurazione o ripristinare la connettività in una macchina virtuale già distribuita. Le estensioni della macchina virtuale possono essere raggruppate anche con distribuzioni di modelli di Resource Manager. Usando le estensioni con i modelli di Resource Manager, è possibile distribuire e configurare macchine virtuali di Azure senza intervento post-distribuzione.

È possibile usare i metodi seguenti per eseguire un'estensione su una macchina virtuale esistente.

Interfaccia della riga di comando di Azure

È possibile eseguire estensioni di macchine virtuali di Azure su una macchina virtuale esistente usando il comando az vm extension set . L'esempio seguente esegue l'estensione Script personalizzato su una macchina virtuale denominata myVM in un gruppo di risorse denominato myResourceGroup. Sostituire il nome del gruppo di risorse di esempio, il nome della macchina virtuale e lo script da eseguire (https://raw.githubusercontent.com/me/project/hello.sh) con le proprie informazioni.

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"fileUris": ["https://raw.githubusercontent.com/me/project/hello.sh"],"commandToExecute": "./hello.sh"}'

Quando l'estensione viene eseguita correttamente, l'output è simile all'esempio seguente:

info:    Executing command vm extension set
+ Looking up the VM "myVM"
+ Installing extension "CustomScript", VM: "mvVM"
info:    vm extension set command OK

Azure PowerShell

È possibile eseguire estensioni di macchine virtuali di Azure su una macchina virtuale esistente usando il comando Set-AzVMExtension . L'esempio seguente esegue l'estensione Script personalizzato su una macchina virtuale denominata myVM in un gruppo di risorse denominato myResourceGroup. Sostituire il nome del gruppo di risorse di esempio, il nome della macchina virtuale e lo script da eseguire (https://raw.githubusercontent.com/me/project/hello.sh) con le proprie informazioni.

$Params = @{
    ResourceGroupName  = 'myResourceGroup'
    VMName             = 'myVM'
    Name               = 'CustomScript'
    Publisher          = 'Microsoft.Azure.Extensions'
    ExtensionType      = 'CustomScript'
    TypeHandlerVersion = '2.1'
    Settings          = @{fileUris = @('https://raw.githubusercontent.com/me/project/hello.sh'); commandToExecute = './hello.sh'}
}
Set-AzVMExtension @Params

Quando l'estensione viene eseguita correttamente, l'output è simile all'esempio seguente:

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK

Azure portal

È possibile applicare estensioni di macchina virtuale a una macchina virtuale esistente tramite il portale di Azure. Selezionare la macchina virtuale nel portale, selezionare Estensioni e quindi Aggiungi. Scegliere l'estensione desiderata dall'elenco delle estensioni disponibili e seguire le istruzioni della procedura guidata.

L'immagine seguente mostra l'installazione dell'estensione Script personalizzato per Linux dal portale di Azure:

Screenshot of the dialog for installing the Custom Script extension for Linux.

Modelli di Gestione risorse di Azure

È possibile aggiungere estensioni di macchina virtuale a un modello di Resource Manager ed eseguirle con la distribuzione del modello. Quando si distribuisce un'estensione con un modello, è possibile creare distribuzioni di Azure completamente configurate.

Ad esempio, il codice JSON seguente viene tratto da un modello arm completo che distribuisce un set di macchine virtuali con carico bilanciato e un database SQL di Azure e quindi installa un'applicazione .NET Core in ogni macchina virtuale. L'estensione della macchina virtuale gestisce l'installazione del software.

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
    }
}

Per altre informazioni sulla creazione di modelli di Resource Manager, vedere Macchine virtuali in un modello di Azure Resource Manager.

Proteggere i dati dell'estensione della macchina virtuale

Quando si esegue un'estensione di macchina virtuale, potrebbe essere necessario includere informazioni riservate, ad esempio credenziali, nomi di account di archiviazione e chiavi di accesso. Molte estensioni macchina virtuale includono una configurazione protetta, che consente di crittografare dati e di decrittografarli solo all'interno della macchina virtuale di destinazione. Ogni estensione dispone di uno schema di configurazione protetta specifico, descritto in dettaglio nella documentazione specifica dell'estensione.

L'esempio seguente illustra un'istanza dell'estensione script personalizzata per Linux. Il comando da eseguire include un set di credenziali. In questo esempio il comando da eseguire non è crittografato.

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ],
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Lo spostamento della proprietà nella commandToExecuteprotected configurazione consente di proteggere la stringa di esecuzione, come illustrato nell'esempio seguente:

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ]
    },
    "protectedSettings": {
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

Modalità di aggiornamento degli agenti e delle estensioni

Gli agenti e le estensioni condividono lo stesso meccanismo di aggiornamento automatico.

Quando un aggiornamento è disponibile e gli aggiornamenti automatici sono abilitati, l'aggiornamento viene installato nella macchina virtuale solo dopo che è stata apportata una modifica a un'estensione o dopo altre modifiche del modello di macchina virtuale, ad esempio:

  • Dischi dati
  • Estensioni
  • Tag di estensione
  • Contenitore della diagnostica di avvio
  • Segreti del sistema operativo guest
  • Dimensioni della macchina virtuale
  • Profilo di rete

I server di pubblicazione rendono disponibili gli aggiornamenti per le aree in diversi momenti, quindi è possibile che sia possibile avere macchine virtuali in aree diverse in versioni diverse.

Nota

Alcuni aggiornamenti potrebbero richiedere regole del firewall aggiuntive. Vedere Accesso alla rete.

Aggiornamenti dell'agente

L'agente di macchine virtuali Linux contiene il codice dell'agente di provisioning e il codice di gestione delle estensioni in un unico pacchetto. Non possono essere separati.

È possibile disabilitare l'agente di provisioning quando si vuole eseguire il provisioning in Azure usando cloud-init.

Le versioni supportate degli agenti possono usare gli aggiornamenti automatici. L'unico codice che può essere aggiornato è il codice di gestione delle estensioni, non il codice dell'agente di provisioning. Il codice dell'agente di provisioning è un codice da eseguire una volta.

Il codice di gestione delle estensioni è responsabile di:

  • Comunicazione con l'infrastruttura di Azure.
  • Gestione delle operazioni di estensione della macchina virtuale, ad esempio installazioni, stato di creazione di report, aggiornamento delle singole estensioni e rimozione delle estensioni. Aggiornamenti contengono correzioni di sicurezza, correzioni di bug e miglioramenti al codice di gestione delle estensioni.

Quando l'agente è installato, viene creato un daemon padre. Questo elemento padre genera quindi un processo figlio usato per gestire le estensioni. Se è disponibile un aggiornamento per l'agente, viene scaricato. L'elemento padre arresta il processo figlio, lo aggiorna e quindi lo riavvia. Se si verifica un problema con l'aggiornamento, il processo padre esegue il rollback alla versione figlio precedente.

Il processo padre non può essere aggiornato automaticamente. L'elemento padre può essere aggiornato solo da un aggiornamento del pacchetto di distribuzione.

Per verificare la versione in esecuzione, verificare waagent quanto segue:

waagent --version

L'output è simile all'esempio seguente:

WALinuxAgent-2.2.45 running on <Linux Distro>
Python: 3.6.9
Goal state agent: 2.7.1.0

Nell'output di esempio precedente il padre (o la versione distribuita del pacchetto) è WALinuxAgent-2.2.45. Il Goal state agent valore è la versione di aggiornamento automatico.

È consigliabile abilitare sempre l'aggiornamento automatico per l'agente: AutoUpdate.Enabled=y. Se non si abilita l'aggiornamento automatico, è necessario continuare ad aggiornare manualmente l'agente e non si otterranno correzioni di bug e sicurezza.

Aggiornamenti delle estensioni

Quando è disponibile un aggiornamento dell'estensione e gli aggiornamenti automatici vengono abilitati, dopo che si verifica una modifica al modello di macchina virtuale, l'agente Linux di Azure scarica e aggiorna l'estensione.

Gli aggiornamenti automatici delle estensioni sono secondari o hotfix. È possibile acconsentire esplicitamente o rifiutare esplicitamente gli aggiornamenti secondari quando si effettua il provisioning dell'estensione. L'esempio seguente illustra come aggiornare automaticamente le versioni secondarie in un modello di Resource Manager usando "autoUpgradeMinorVersion": true,:

    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },

Per ottenere le correzioni di bug di versione secondaria più recenti, è consigliabile selezionare sempre l'aggiornamento automatico nelle distribuzioni delle estensioni. Non è possibile rifiutare esplicitamente gli aggiornamenti rapidi che eseguono correzioni di bug di sicurezza o chiave.

Se si disabilitano gli aggiornamenti automatici o è necessario aggiornare una versione principale, usare az vm extension set o Set-AzVMExtension e specificare la versione di destinazione.

Come identificare gli aggiornamenti delle estensioni

Identificare se l'estensione è impostata con autoUpgradeMinorVersion in una macchina virtuale

È possibile vedere dal modello di macchina virtuale se è stato effettuato il provisioning dell'estensione con autoUpgradeMinorVersion. Per controllare, usare az vm show e specificare il nome del gruppo di risorse e della macchina virtuale come indicato di seguito:

az vm show --resource-group myResourceGroup --name myVM

L'output di esempio seguente mostra che autoUpgradeMinorVersion è impostato su true:

  "resources": [
    {
      "autoUpgradeMinorVersion": true,
      "forceUpdateTag": null,
      "id": "/subscriptions/guid/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/customScript",

Identificare quando si è verificato un evento autoUpgradeMinorVersion

Per vedere quando è stato eseguito un aggiornamento dell'estensione, esaminare i log dell'agente nella macchina virtuale in /var/log/waagent.log.

Nell'esempio seguente la macchina virtuale è stata Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025 installata. È stato disponibile un hotfix per Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027.

INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Expected handler state: enabled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Decide which version to use
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Use version: 2.3.9027
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Current handler state is: NotInstalled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Download extension package
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Unpack extension package
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Download, message=Download succeeded
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Initialize extension directory
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update settings file: 0.settings
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Disable extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Launch command:diagnostic.py -disable
...
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Disable, message=Launch command succeeded: diagnostic.py -disable
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Launch command:diagnostic.py -update
2017/08/14 20:21:57 LinuxAzureDiagnostic started to handle.

Autorizzazioni dell'agente

Per svolgere le attività, è necessario che l'agente venga eseguito come radice.

Risoluzione dei problemi relativi alle estensioni della macchina virtuale

Ogni estensione della macchina virtuale potrebbe avere passaggi specifici per la risoluzione dei problemi. Ad esempio, quando si usa l'estensione Script personalizzato, è possibile trovare i dettagli di esecuzione degli script in locale nella macchina virtuale in cui è stata eseguita l'estensione.

Le azioni di risoluzione dei problemi seguenti si applicano a tutte le estensioni della macchina virtuale:

  • Per controllare il log dell'agente Linux di Azure, esaminare l'attività durante il provisioning dell'estensione in /var/log/waagent.log.

  • Per altri dettagli, vedere i log delle estensioni in /var/log/azure/<extensionName>.

  • Vedere le sezioni sulla risoluzione dei problemi nella documentazione specifica dell'estensione per i codici di errore, i problemi noti e altre informazioni specifiche dell'estensione.

  • Esaminare i log di sistema. Verificare la presenza di altre operazioni che potrebbero aver interferito con l'estensione, ad esempio un'installazione a esecuzione prolungata di un'altra applicazione che richiede l'accesso esclusivo alla gestione pacchetti.

Motivi comuni che causano errori delle estensioni

  • L'esecuzione delle estensioni è di 20 minuti. Le eccezioni sono script personalizzati e Chef, che hanno 90 minuti. Se la distribuzione supera questa volta, viene contrassegnata come timeout. Questa causa può essere costituita da macchine virtuali a risorse basse o da altre configurazioni di macchine virtuali o attività di avvio che utilizzano grandi quantità di risorse durante il tentativo di provisioning dell'estensione.

  • I prerequisiti minimi non vengono soddisfatti. Alcune estensioni hanno dipendenze negli SKU di macchine virtuali, ad esempio le immagini HPC. Le estensioni potrebbero avere determinati requisiti di accesso alla rete, ad esempio la comunicazione con Archiviazione di Azure o servizi pubblici. Altri esempi possono essere l'accesso ai repository di pacchetti, l'esaurimento dello spazio su disco o le restrizioni di sicurezza.

  • L'accesso a Gestione pacchetti è esclusivo. In alcuni casi, una configurazione e un'installazione dell'estensione della macchina virtuale a esecuzione prolungata potrebbero entrare in conflitto perché entrambi richiedono l'accesso esclusivo alla gestione pacchetti.

Visualizzare lo stato dell'estensione

Dopo l'esecuzione di un'estensione macchina virtuale in una macchina virtuale, usare az vm get-instance-view per restituire lo stato dell'estensione, come segue:

az vm get-instance-view \
    --resource-group myResourceGroup \
    --name myVM \
    --query "instanceView.extensions"

L'output è simile all'esempio seguente:

  {
    "name": "customScript",
    "statuses": [
      {
        "code": "ProvisioningState/failed/0",
        "displayStatus": "Provisioning failed",
        "level": "Error",
        "message": "Enable failed: failed to execute command: command terminated with exit status=127\n[stdout]\n\n[stderr]\n/bin/sh: 1: ech: not found\n",
        "time": null
      }
    ],
    "substatuses": null,
    "type": "Microsoft.Azure.Extensions.CustomScript",
    "typeHandlerVersion": "2.1.6"
  }

È anche possibile trovare lo stato di esecuzione dell'estensione nel portale di Azure. Selezionare la macchina virtuale, selezionare Estensioni e quindi selezionare l'estensione desiderata.

Rieseguire un'estensione macchina virtuale

In alcuni casi potrebbe essere necessario eseguire di nuovo un'estensione di macchina virtuale. È possibile eseguire tale operazione rimuovendo l'estensione e quindi eseguendola di nuovo con il metodo scelto.

Per rimuovere un'estensione, usare az vm extension delete, come segue:

az vm extension delete \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --name customScript

È anche possibile rimuovere un'estensione nel portale di Azure:

  1. Selezionare una macchina virtuale.
  2. Selezionare Estensioni.
  3. Selezionare l'estensione.
  4. Seleziona Disinstalla.

Riferimento alle estensioni della macchina virtuale comuni

Nome estensione Descrizione
Estensione script personalizzata per Linux Eseguire script in una macchina virtuale di Azure.
Estensione VMAccess Ottenere nuovamente l'accesso a una macchina virtuale di Azure. È anche possibile usarlo per gestire utenti e credenziali.
Estensione di Diagnostica di Azure Gestire Diagnostica di Azure.

Passaggi successivi

Per altre informazioni sulle estensioni delle macchine virtuali, vedere Estensioni e funzionalità delle macchine virtuali di Azure.