Share via


Ejecución de scripts en la máquina virtual Windows con la característica administrada Ejecutar comando

Se aplica a: ✔️ máquinas virtuales Windows ✔️ conjuntos de escalado flexibles

Importante

Managed Run Command está disponible actualmente en la CLI de Azure, PowerShell y la API. Pronto estará disponible la funcionalidad del portal.

La característica Ejecutar comando usa el agente de máquina virtual (VM) para ejecutar scripts en una máquina virtual Windows de Azure. Puede usar estos scripts para la administración general de máquinas o aplicaciones. Pueden ayudarle a diagnosticar y corregir rápidamente problemas de acceso a la máquina virtual y de red, así como a revertir la máquina virtual a un estado correcto.

La característica administrada actualizada Ejecutar comando usa el mismo canal de agente de máquina virtual para ejecutar scripts y proporciona las siguientes mejoras con respecto a la característica Ejecutar comando original orientada a la acción:

  • Compatibilidad con la característica actualizada Ejecutar comando mediante una plantilla de implementación de ARM
  • Ejecución en paralelo de varios scripts
  • Ejecución secuencial de scripts
  • Tiempo de espera del script especificado por el usuario
  • Compatibilidad con scripts de larga duración (horas o días)
  • Entrega de secretos (parámetros, contraseñas) de forma segura

Prerrequisitos

Compatible con el sistema operativo Windows

SO Windows x64
Windows 10 Compatible
Windows 11 Compatible
Windows Server 2008 SP2 Compatible
Windows Server 2008 R2 Compatible
Windows Server 2012 Compatible
Windows Server 2012 R2 Compatible
Windows Server 2016 Compatible
Windows Server 2016 Core Compatible
Windows Server 2019 Compatible
Windows Server 2019 Core Compatible
Windows Server 2022 Compatible
Windows Server 2022 Core Compatible

Limitación del acceso al comando Ejecutar

Para enumerar los comandos ejecutados o mostrar los detalles de un comando, se requiere el permiso Microsoft.Compute/locations/runCommands/read en el nivel de suscripción. El rol de lector integrado tiene este permiso, al igual que los roles superiores.

La ejecución de un comando requiere el permiso Microsoft.Compute/virtualMachines/runCommand/write. El rol colaborador de la máquina virtual tiene este permiso, al igual que los roles superiores.

Puede usar uno de los roles integrados o crear uno personalizado para usar Ejecutar comando.

la CLI de Azure

En los siguientes ejemplos use az vm run-command para ejecutar un script de shell en una máquina virtual Windows de Azure.

Ejecución de un script con la máquina virtual

Este comando entrega el script a la máquina virtual, lo ejecuta y devuelve la salida capturada.

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

Enumeración de todos los recursos RunCommand implementados en una máquina virtual

Este comando devuelve una lista completa de las instancias de Ejecutar comando implementadas previamente junto con sus propiedades.

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

Obtención del estado de ejecución y los resultados

Este comando recupera el progreso actual de la ejecución, incluida la salida más reciente, la hora de inicio y finalización, el código de salida y el estado final de la ejecución.

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

Nota

Los campos de salida y error de instanceView están limitados a los últimos 4 KB. Si desea acceder a la salida y el error completos, tiene la opción de reenviar los datos de salida y error al almacenamiento de blobs en anexos mediante los parámetros -outputBlobUri y -errorBlobUri al ejecutar una instancia de Ejecutar comando mediante Set-AzVMRunCommand o Set-AzVMssRunCommand.

Eliminación del recurso RunCommand de la máquina virtual

Quite el recurso RunCommand implementado anteriormente en la máquina virtual. Si la ejecución del script sigue en curso, finaliza.

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

PowerShell

Ejecución de un script con la máquina virtual

Este comando entrega el script a la máquina virtual, lo ejecuta y devuelve la salida capturada.

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

Ejecución de un script en la máquina virtual mediante el parámetro SourceScriptUri

Los parámetros opcionales son OutputBlobUri y ErrorBlobUri.

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>”

Enumeración de todos los recursos RunCommand implementados en una máquina virtual

Este comando devuelve una lista completa de las instancias de Ejecutar comando implementadas previamente junto con sus propiedades.

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

Obtención del estado de ejecución y los resultados

Este comando recupera el progreso actual de la ejecución, incluida la salida más reciente, la hora de inicio y finalización, el código de salida y el estado final de la ejecución.

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

Creación o actualización de una instancia de Ejecutar comando en una máquina virtual mediante SourceScriptUri (dirección URL de SAS del blob de almacenamiento)

Cree o actualice una instancia de Ejecutar comando en una máquina virtual Windows mediante una dirección URL de SAS de un blob de almacenamiento que contiene un script de PowerShell. SourceScriptUri puede ser la dirección URL completa de SAS de un blob de almacenamiento o una dirección URL pública.

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

Nota

La dirección URL de SAS debe proporcionar acceso de lectura al blob. Se recomienda un tiempo de expiración de 24 horas para la dirección URL de SAS. Las direcciones URL de SAS se pueden generar en Azure Portal mediante las opciones del blob o el token de SAS mediante New-AzStorageBlobSASToken. Si genera un token de SAS mediante New-AzStorageBlobSASToken, la dirección URL de SAS = "dirección URL del blob base" + "?" + "token de SAS de New-AzStorageBlobSASToken".

Obtención de una vista de instancia de Ejecutar comando para una máquina virtual después de crear o actualizar una instancia de Ejecutar comando

Obtenga una instancia de Ejecutar comando para la máquina virtual con una vista de instancia. La vista de instancia contiene el estado de ejecución de la instancia de Ejecutar comando (correcto, con errores, etc.), el código de salida, la salida estándar y el error estándar generados mediante la ejecución del script con Ejecutar comando. Un valor de ExitCode distinto de cero indica una ejecución incorrecta.

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

Salida de ejemplo

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: estado del script Ejecutar comando del usuario. Consulte este estado para saber si el script se ejecutó correctamente o no. ProvisioningState: estado del aprovisionamiento general de extensiones de un extremo a otro (si la plataforma de extensiones pudo desencadenar o no el script Ejecutar comando).

Creación o actualización de una instancia de Ejecutar comando en una máquina virtual mediante ScriptLocalPath (archivo de script local)

Cree o actualice una instancia de Ejecutar comando en una máquina virtual mediante un archivo de script local que se encuentra en la máquina cliente en la que se ejecuta el cmdlet.

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

Creación o actualización de una instancia de Ejecutar comando en una máquina virtual mediante SourceScript (texto del script)

Cree o actualice una instancia de Ejecutar comando en una máquina virtual pasando el contenido del script directamente al parámetro -SourceScript. Utilice ; para separar varios comandos.

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

Creación o actualización de una instancia de Ejecutar comando en una máquina virtual mediante SourceCommandId

Cree o actualice una instancia de Ejecutar comando en una máquina virtual mediante un elemento commandId existente previamente. Los elementos commandId disponibles se pueden recuperar mediante Get-AzVMRunCommandDocument.

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

Creación o actualización de una instancia de Ejecutar comando en una máquina virtual mediante OutputBlobUri o ErrorBlobUri para transmitir los mensajes de error estándar y la salida estándar a los blobs en anexos de salida y error

Cree o actualice una instancia de Ejecutar comando en una máquina virtual y transmita los mensajes de error estándar y la salida estándar a los blobs en anexos de salida y error.

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

Nota

Los blobs de salida y error deben ser de tipo AppendBlob y sus direcciones URL de SAS deben proporcionar acceso de lectura, anexión, creación y escritura al blob. Se recomienda un tiempo de expiración de 24 horas para la dirección URL de SAS. Si el blob de salida o de error no existen, se creará un blob de tipo AppendBlob. Las direcciones URL de SAS se pueden generar en Azure Portal mediante las opciones del blob o el token de SAS mediante New-AzStorageBlobSASToken.

Creación o actualización de una instancia de Ejecutar comando en una máquina virtual como otro usuario mediante los parámetros RunAsUser y RunAsPassword

Cree o actualice una instancia de Ejecutar comando en una máquina virtual como otro usuario mediante los parámetros RunAsUser y RunAsPassword. Para que RunAs funcione correctamente, póngase en contacto con el administrador de la máquina virtual y asegúrese de que el usuario se haya agregado en la máquina virtual, de que el usuario tenga acceso a los recursos a los que accede la instancia de Ejecutar comando (directorios, archivos, red, etc.) y, en el caso de una máquina virtual Windows, de que el servicio "Inicio de sesión secundario" esté en ejecución en la máquina virtual.

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

Creación o actualización de una instancia de Ejecutar comando en un recurso de Virtual Machine Scale Sets mediante SourceScriptUri (dirección URL de SAS de blob de almacenamiento)

Cree o actualice una instancia de Ejecutar comando en un recurso de Virtual Machine Scale Sets con Windows mediante una dirección URL de SAS de un blob de almacenamiento que contiene un script de PowerShell.

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

Nota

La dirección URL de SAS debe proporcionar acceso de lectura al blob. Se recomienda un tiempo de expiración de 24 horas para la dirección URL de SAS. Las direcciones URL de SAS se pueden generar en Azure Portal mediante las opciones del blob o el token de SAS mediante New-AzStorageBlobSASToken. Si genera un token de SAS mediante New-AzStorageBlobSASToken, la dirección URL de SAS = dirección URL del blob base + "?" + token de SAS de New-AzStorageBlobSASToken.

Creación o actualización de una instancia de Ejecutar comando en una instancia de máquina virtual mediante los parámetros Parameter y ProtectedParameter (parámetros públicos y protegidos para el script)

Utilice ProtectedParameter para pasar entradas confidenciales al script, como contraseñas, claves, etc.

$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: los parámetros Parameter y ProtectedParameters se pasan al script como argumentos y se ejecutan de esta forma: myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value

  • Linux: los parámetros con nombre y sus valores se establecen en la configuración del entorno, que debe ser accesible dentro del script .sh. Para los argumentos sin nombre, pase una cadena vacía para la entrada del nombre. Los argumentos sin nombre se pasan al script y se ejecutan de esta manera: myscript.sh publicParam1value publicParam2value secret1value secret2value

Eliminación del recurso RunCommand de la máquina virtual

Quite el recurso RunCommand implementado anteriormente en la máquina virtual. Si la ejecución del script sigue en curso, finaliza.

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

API DE REST

Para implementar una nueva instancia de Ejecutar comando, ejecute PUT directamente en la máquina virtual y especifique un nombre único para la instancia de Ejecutar 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 >"  
    }
}

Notas

  • Puede proporcionar un script insertado, un URI de script o un id. de comando de script integrado como origen de entrada. El URI del script es el URI de SAS de blob de almacenamiento con acceso de lectura o URI público.
  • Solo se admite un tipo de entrada de origen en una ejecución de comando.
  • A partir de la versión 2023-03-01 de la API, puede establecer la propiedad treatFailureAsDeploymentFailure en true, lo que hace que se produzca un error en la implementación cuando se produce un error en el script. Si se establece en false, ProvisioningState solo reflejaría si la plataforma de extensiones ejecutó o no el comando de ejecución. No indicaría si se produjo un error en el script en caso de errores de script.
  • Ejecutar comando admite la escritura de resultados y errores en blobs de almacenamiento mediante parámetros outputBlobUri y errorBlobUri, que se pueden usar para almacenar salidas de script grandes. Use el URI de SAS de un blob en anexos de almacenamiento con acceso de lectura, adición, creación y escritura. El blob debe ser de tipo AppendBlob. Si escribe la salida del script o el blob de error, se producirá un error en caso contrario. El blob se sobrescribirá si ya existe. Si no existe, se creará.

Enumeración de instancias en ejecución de Ejecutar comando en una máquina virtual

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

Obtención de detalles de salida de una implementación específica de Ejecutar comando

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

Eliminación de una implementación específica de Ejecutar comando

También puede eliminar la instancia de Ejecutar comando.

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

Implementación de scripts en una secuencia ordenada

Para implementar scripts secuencialmente, use una plantilla de implementación y especifique una relación dependsOn entre scripts secuenciales.

{ 
    "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  
    }
} 

Ejecución secuencial de varias instancias de Ejecutar comando

De manera predeterminada, si implementa varios recursos RunCommand mediante una plantilla de implementación, se ejecutan simultáneamente en la máquina virtual. Si tiene una dependencia en los scripts y un orden de ejecución preferido, puede usar la propiedad dependsOn para que se ejecuten secuencialmente.

En este ejemplo, secondRunCommand se ejecuta después de 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
         }
      }
   ]
}

Pasos siguientes

Para obtener información sobre otras maneras de ejecutar comandos y scripts de forma remota en la máquina virtual, consulte Ejecución de scripts en una máquina virtual Windows.