Share via


Eseguire script nella macchina virtuale Windows usando la funzionalità gestita Esegui comando

Si applica a: ✔️ Set di scalabilità flessibili di macchine virtuali ✔️ Windows

Importante

Il comando di esecuzione gestita è attualmente disponibile nell'interfaccia della riga di comando di Azure, in PowerShell e nell'API. La funzionalità del portale sarà presto disponibile.

La funzionalità Esegui comando usa l'agente della macchina virtuale (VM) per eseguire script all'interno di una macchina virtuale Windows di Azure. Questi script possono essere usati per la gestione generale del computer o delle applicazioni. Possono essere utili per diagnosticare e correggere rapidamente i problemi di accesso e di rete delle macchine virtuali e ripristinare lo stato corretto della macchina virtuale.

Il comando run gestito aggiornato usa lo stesso canale dell'agente di macchine virtuali per eseguire gli script e fornisce i miglioramenti seguenti rispetto al comando run orientato all'azione originale:

  • Supporto per l'aggiornamento di Esegui comando attraverso il modello di distribuzione di ARM
  • Esecuzione parallela di più script
  • Esecuzione sequenziale degli script
  • Timeout dello script specificato dall'utente
  • Supporto per script a esecuzione prolungata (ore/giorni)
  • Passaggio di segreti (parametri, password) in modo sicuro

Prerequisiti

Sistema operativo Windows supportato

Sistema operativo Windows x64
Windows 10 Supportata
Windows 11 Supportata
Windows Server 2008 SP2 Supportata
Windows Server 2008 R2 Supportata
Windows Server 2012 Supportata
Windows Server 2012 R2 Supportata
Windows Server 2016 Supportata
Windows Server 2016 Core Supportata
Windows Server 2019 Supportata
Windows Server 2019 Core Supportata
Windows Server 2022 Supportata
Windows Server 2022 Core Supportata

Limitare l'accesso a Esegui comando

Elencare i comandi di esecuzione o visualizzare i dettagli di un comando richiede l'autorizzazione Microsoft.Compute/locations/runCommands/read a livello di sottoscrizione. Il ruolo predefinito Lettore e i livelli superiori hanno questa autorizzazione.

L'esecuzione di un comando richiede l'autorizzazione Microsoft.Compute/virtualMachines/runCommand/write. Il ruolo Collaboratore Macchina virtuale e i livelli superiori hanno questa autorizzazione.

È possibile usare uno dei ruoli predefiniti o creare un ruolo personalizzato per usare Esegui comando.

Interfaccia della riga di comando di Azure

Gli esempi seguenti usano az vm run-command per eseguire lo script della shell in una macchina virtuale Windows di Azure.

Eseguire uno script con la macchina virtuale

Questo comando recapita lo script alla macchina virtuale, lo eseguirà e restituirà l'output acquisito.

az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "Write-Host Hello World!"

Elencare tutte le risorse RunCommand distribuite in una macchina virtuale

Questo comando restituirà un elenco completo dei comandi di esecuzione distribuiti in precedenza insieme alle relative proprietà.

az vm run-command list --vm-name "myVM" --resource-group "myRG"

Ottenere lo stato e i risultati dell'esecuzione

Questo comando recupererà lo stato di esecuzione corrente, inclusi l'output più recente, l'ora di inizio/fine, il codice di uscita e lo stato terminale dell'esecuzione.

az vm run-command show --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --expand instanceView

Nota

I campi di output e errore in instanceView sono limitati agli ultimi 4 KB. Se si vuole accedere all'output completo e all'errore, è possibile inoltrare i dati di output e di errore ai BLOB di accodamento di archiviazione usando -outputBlobUri i parametri e -errorBlobUri durante l'esecuzione di Esegui comando usando Set-AzVMRunCommand o Set-AzVMssRunCommand.

Eliminare la risorsa RunCommand dalla macchina virtuale

Rimuovere la risorsa RunCommand distribuita in precedenza nella macchina virtuale. Se l'esecuzione dello script è ancora in corso, l'esecuzione verrà terminata.

az vm run-command delete --name "myRunCommand" --vm-name "myVM" --resource-group "myRG"

PowerShell

Eseguire uno script con la macchina virtuale

Questo comando recapita lo script alla macchina virtuale, lo eseguirà e restituirà l'output acquisito.

Set-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -Location "EastUS" -RunCommandName "RunCommandName" –SourceScript "echo Hello World!"

Eseguire uno script nella macchina virtuale usando il parametro SourceScriptUri

OutputBlobUri e ErrorBlobUri sono parametri facoltativi.

Set-AzVMRunCommand -ResourceGroupName -VMName -RunCommandName -SourceScriptUri “< SAS URI of a storage blob with read access or public URI>" -OutputBlobUri “< SAS URI of a storage append blob with read, add, create, write access>” -ErrorBlobUri “< SAS URI of a storage append blob with read, add, create, write access>”

Elencare tutte le risorse RunCommand distribuite in una macchina virtuale

Questo comando restituirà un elenco completo dei comandi di esecuzione distribuiti in precedenza insieme alle relative proprietà.

Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM"

Ottenere lo stato e i risultati dell'esecuzione

Questo comando recupererà lo stato di esecuzione corrente, inclusi l'output più recente, l'ora di inizio/fine, il codice di uscita e lo stato terminale dell'esecuzione.

Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName" -Expand InstanceView

Creare o aggiornare Esegui comando in una macchina virtuale usando SourceScriptUri (URL della firma di accesso condiviso del BLOB di archiviazione)

Creare o aggiornare Esegui comando in una macchina virtuale Windows usando un URL di firma di accesso condiviso di un BLOB di archiviazione che contiene uno script di PowerShell. SourceScriptUri può essere l'URL di firma di accesso condiviso completo o l'URL pubblico di un BLOB di archiviazione.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>

Nota

L'URL della firma di accesso condiviso deve fornire l'accesso in lettura al BLOB. Viene suggerita una scadenza di 24 ore per l'URL della firma di accesso condiviso. Gli URL di firma di accesso condiviso possono essere generati in portale di Azure usando le opzioni del BLOB o il token di firma di accesso condiviso tramite New-AzStorageBlobSASToken. Se si genera un token di firma di accesso condiviso con New-AzStorageBlobSASToken, l'URL di firma di accesso condiviso = "URL BLOB di base" + "?" + "Token di firma di accesso condiviso da New-AzStorageBlobSASToken"

Ottenere una visualizzazione dell'istanza del comando Esegui per una macchina virtuale dopo la creazione o l'aggiornamento del comando Di esecuzione

Ottenere un comando Esegui per la macchina virtuale con visualizzazione istanza. Visualizzazione istanza contiene lo stato di esecuzione del comando di esecuzione (Succeeded, Failed e così via), codice di uscita, output standard ed errore standard generato eseguendo lo script tramite Esegui comando. Un codice ExitCode diverso da zero indica un'esecuzione non riuscita.

$x = Get-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Expand InstanceView
$x.InstanceView

Output di esempio

ExecutionState   : Succeeded
ExecutionMessage :
ExitCode         : 0
Output           :   
output       : uid=0(root) gid=0(root) groups=0(root)
                   HelloWorld

Error            :
StartTime        : 10/27/2022 9:10:52 PM
EndTime          : 10/27/2022 9:10:55 PM
Statuses         :

InstanceView.ExecutionState: stato dello script Esegui comando dell'utente. Fare riferimento a questo stato per sapere se lo script è riuscito o meno. ProvisioningState: stato del provisioning dell'estensione generale end-to-end ( se la piattaforma di estensione è stata in grado di attivare o meno esegui script di comando).

Creare o aggiornare Esegui comando in una macchina virtuale usando ScriptLocalPath (file di script locale)

Creare o aggiornare Esegui comando in una macchina virtuale usando un file di script locale presente nel computer client in cui viene eseguito il cmdlet.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1"

Creare o aggiornare Esegui comando in una macchina virtuale usando SourceScript (testo script)

Creare o aggiornare Esegui comando in una macchina virtuale passando il contenuto dello script direttamente al parametro -SourceScript. Usare ; per separare più comandi

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand2 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"

Creare o aggiornare Esegui comando in una macchina virtuale usando SourceCommandId

Creare o aggiornare Esegui comando in una macchina virtuale usando commandId preesistente. I commandId disponibili possono essere recuperati usando Get-AzVMRunCommandDocument.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceCommandId DisableWindowsUpdate

Creare o aggiornare Run Command on a VM using OutputBlobUri, ErrorBlobUri to stream standard output and standard error messages to output and error Blobs

Creare o aggiornare Esegui comando in una macchina virtuale e trasmettere l'output standard e i messaggi di errore standard per l'output e l'errore Append BLOB.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1" -OutputBlobUri <OutPutBlobUrI> -ErrorBlobUri "ErrorBlobUri

Nota

I BLOB di output e di errore devono essere di tipo AppendBlob e gli URL di firma di accesso condiviso devono fornire l'accesso in lettura, accodamento, creazione, scrittura al BLOB. Viene suggerita una scadenza di 24 ore per l'URL della firma di accesso condiviso. Se il BLOB di output o di errore non esiste, verrà creato un BLOB di tipo AppendBlob. Gli URL di firma di accesso condiviso possono essere generati in portale di Azure usando le opzioni del BLOB o il token di firma di accesso condiviso da tramite New-AzStorageBlobSASToken.

Creare o aggiornare Esegui comando in una macchina virtuale come utente diverso usando i parametri RunAsUser e RunAsPassword

Creare o aggiornare Esegui comando in una macchina virtuale come utente diverso usando RunAsUser i parametri e RunAsPassword . Affinché RunAs funzioni correttamente, contattare l'amministratore della macchina virtuale e assicurarsi che l'utente venga aggiunto nella macchina virtuale, l'utente abbia accesso alle risorse a cui accede il comando Esegui (directory, file, rete e così via) e, in caso di macchina virtuale Windows, il servizio "Accesso secondario" è in esecuzione nella macchina virtuale.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1" -RunAsUser myusername -RunAsPassword mypassword

Creare o aggiornare Esegui comando in una risorsa set di scalabilità di macchine virtuali usando SourceScriptUri (URL della firma di accesso condiviso del BLOB di archiviazione)

Creare o aggiornare Run Command on a Windows set di scalabilità di macchine virtuali resource using a SAS URL of a storage BLOB that contains a PowerShell script .Create or update Run Command on a Windows set di scalabilità di macchine virtuali resource using a SAS URL of a storage BLOB that contains a PowerShell script.

Set-AzVmssVMRunCommand -ResourceGroupName MyRG0 -VMScaleSetName MyVMSS -InstanceId 0 -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>

Nota

L'URL della firma di accesso condiviso deve fornire l'accesso in lettura al BLOB. Per l'URL della firma di accesso condiviso è consigliata una scadenza di 24 ore. Gli URL di firma di accesso condiviso possono essere generati in portale di Azure usando le opzioni del BLOB o il token di firma di accesso condiviso tramite New-AzStorageBlobSASToken. Se si genera un token di firma di accesso condiviso con New-AzStorageBlobSASToken, il formato dell'URL di firma di accesso condiviso è: URL BLOB di base + "?" + token di firma di accesso condiviso da New-AzStorageBlobSASToken.

Creare o aggiornare Esegui comando in un'istanza di macchina virtuale usando i parametri Parameter e ProtectedParameter (parametri pubblici e protetti per lo script)

Usare ProtectedParameter per passare qualsiasi input sensibile allo script, ad esempio password, chiavi e così via.

$PublicParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam1';value='publicParam1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam2';value='publicParam2value'})

$ProtectedParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret1';value='secret1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret2';value='secret2value'})

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri> -Parameter $PublicParametersArray -ProtectedParameter $ProtectedParametersArray
  • Windows: i parametri e protectedParameter vengono passati allo script come argomenti e vengono eseguiti come segue: myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value

  • Linux: i parametri denominati e i relativi valori sono impostati sulla configurazione dell'ambiente, che deve essere accessibile all'interno dello script .sh. Per gli argomenti nameless, passare una stringa vuota per assegnare un nome all'input. Gli argomenti senza nome vengono passati allo script ed eseguiti in questo modo: myscript.sh publicParam1value publicParam2value secret1value secret2value

Eliminare la risorsa RunCommand dalla macchina virtuale

Rimuovere la risorsa RunCommand distribuita in precedenza nella macchina virtuale. Se l'esecuzione dello script è ancora in corso, l'esecuzione verrà terminata.

Remove-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName"

REST API

Per distribuire un nuovo comando Esegui, eseguire direttamente un'istruzione PUT nella macchina virtuale e specificare un nome univoco per l'istanza esegui comando.

PUT /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2023-03-01
{ 
"location": "<location>", 
"properties": { 
    "source": { 
        "script": "Write-Host Hello World!", 
        "scriptUri": "<SAS URI of a storage blob with read access or public URI>",  
        "commandId": "<Id>"  
        }, 
    "parameters": [ 
        { 
            "name": "param1",
            "value": "value1" 
            }, 
        { 
            "name": "param2", 
            "value": "value2" 
            } 
        ], 
    "protectedParameters": [ 
        { 
            "name": "secret1", 
            "value": "value1" 
            }, 
        { 
            "name": "secret2", 
            "value": "value2" 
            } 
        ], 
    "runAsUser": "userName",
    "runAsPassword": "userPassword", 
    "timeoutInSeconds": 3600,
    "treatFailureAsDeploymentFailure": true,
    "outputBlobUri": "< SAS URI of a storage append blob with read, add, create, write access>", 
    "errorBlobUri": "< SAS URI of a storage append blob with read, add, create, write access >"  
    }
}

Note

  • È possibile fornire uno script inline, un URI di script o un ID comando script predefinito come origine di input. L'URI dello script è l'URI di firma di accesso condiviso del BLOB di archiviazione con accesso in lettura o URI pubblico.
  • Per un'esecuzione del comando è supportato un solo tipo di input di origine.
  • A partire dall'API versione 2023-03-01, è possibile impostare la proprietà treatFailureAsDeploymentFailure su true causando l'esito negativo della distribuzione in caso di errore nello script. Se impostato su false, ProvisioningState riflette solo se il comando di esecuzione è stato eseguito o meno dalla piattaforma delle estensioni. Non indica se lo script non è riuscito in caso di errori di script.
  • Esegui comando supporta la scrittura di output ed errori in Archiviazione BLOB usando i parametri outputBlobUri e errorBlobUri, che possono essere usati per archiviare output di script di grandi dimensioni. Usare l'URI di firma di accesso condiviso di un BLOB di accodamento di archiviazione con lettura, aggiunta, creazione, accesso in scrittura. Il BLOB deve essere di tipo AppendBlob. In caso contrario, la scrittura dell'output dello script o del BLOB degli errori avrà esito negativo. Il BLOB verrà sovrascritto se esiste già. Verrà creato se non esiste.

Elencare le istanze in esecuzione di Esegui comando in una macchina virtuale

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2023-03-01

Ottenere i dettagli dell'output per una distribuzione specifica di Esegui comando

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?$expand=instanceView&api-version=2023-03-01

Eliminare una distribuzione specifica di Esegui comando

È anche possibile eliminare l'istanza di Esegui comando.

DELETE /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2023-03-01

Distribuire script in una sequenza ordinata

Per distribuire gli script in sequenza, usare un modello di distribuzione, specificando una dependsOn relazione tra script sequenziali.

{ 
    "type": "Microsoft.Compute/virtualMachines/runCommands", 
    "name": "secondRunCommand", 
    "apiVersion": "2019-12-01", 
    "location": "[parameters('location')]", 
    "dependsOn": <full resourceID of the previous other Run Command>, 
    "properties": { 
        "source": {  
            "script": "Write-Host Hello World!"  
        }, 
        "timeoutInSeconds": 60  
    }
} 

Eseguire più comandi in sequenza

Per impostazione predefinita, se si distribuiscono più risorse RunCommand usando il modello di distribuzione, queste verranno eseguite contemporaneamente nella macchina virtuale. Se si ha una dipendenza dagli script e un ordine di esecuzione preferito, è possibile usare la dependsOn proprietà per renderli eseguiti in sequenza.

In questo esempio, secondRunCommand verrà eseguito dopo firstRunCommand.

{
   "$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion":"1.0.0.0",
   "resources":[
      {
         "type":"Microsoft.Compute/virtualMachines/runCommands",
         "name":"[concat(parameters('vmName'),'/firstRunCommand')]",
         "apiVersion":"2023-03-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
         ],
         "properties":{
            "source":{
               "script":"Write-Host First: Hello World!"
            },
            "parameters":[
               {
                  "name":"param1",
                  "value":"value1"
               },
               {
                  "name":"param2",
                  "value":"value2"
               }
            ],
            "timeoutInSeconds":20
         }
      },
      {
         "type":"Microsoft.Compute/virtualMachines/runCommands",
         "name":"[concat(parameters('vmName'),'/secondRunCommand')]",
         "apiVersion":"2019-12-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'),'runcommands/firstRunCommand')]"
         ],
         "properties":{
            "source":{
               "scriptUri":"http://github.com/myscript.ps1"
            },
            "timeoutInSeconds":60
         }
      }
   ]
}

Passaggi successivi

Per informazioni su altri modi per eseguire comandi e script in remoto nella macchina virtuale, vedere Eseguire gli script nella macchina virtuale Windows.