Выполнение скриптов в виртуальной машине Windows с помощью функции "Выполнение команд"

Область применения: ✔️ Виртуальные машины Windows ✔️ Гибкие масштабируемые наборы

Внимание

Команда управляемого запуска в настоящее время доступна в Azure CLI, PowerShell и API в настоящее время. В ближайшее время будут доступны функции портала.

Функция команды запуска использует агент виртуальной машины для выполнения скриптов в виртуальной машине Windows Azure. Эти сценарии можно использовать для общего управления компьютерами или приложениями. Они могут помочь вам быстро диагностировать и исправлять проблемы доступа к виртуальной машине и сети, а также восстановить работоспособность виртуальной машины.

Обновленная управляемая функция "Выполнение команд" использует один и тот же канал агента виртуальных машин для выполнения скриптов и предоставляет следующие усовершенствования в рамках данной функции, ориентированной на исходное действие:

  • поддержка обновленной функции "Выполнение команд" с помощью шаблона развертывания ARM;
  • параллельное выполнение нескольких скриптов;
  • последовательное выполнение скриптов;
  • указанное пользователем время ожидания скрипта;
  • поддержка длительно выполняемых скриптов (ч/дн);
  • безопасная передача секретов (параметров и паролей).

Необходимые компоненты

Поддерживается ОС Windows

ОС Windows x64
Windows 10 Поддерживается
Windows 11 Поддерживается
Windows Server 2008 с пакетом обновления 2 (SP2) Поддерживается
Windows Server 2008 R2 Поддерживается
Windows Server 2012 Поддерживается
Windows Server 2012 R2 Поддерживается
Windows Server 2016 Поддерживается
Windows Server 2016 Core Поддерживается
Windows Server 2019 Поддерживается
Windows Server 2019 Core Поддерживается
Windows Server 2022 Поддерживается
Windows Server 2022 Core Поддерживается

Ограничение доступа к команде запуска

Для получения списка выполняемых команд или отображения сведений о команде требуется разрешение Microsoft.Compute/locations/runCommands/read на уровне подписки. Это разрешение имеется у встроенной роли Читатель и более высоких уровней.

Для выполнения команды требуется разрешение Microsoft.Compute/virtualMachines/runCommand/write. Это разрешение имеется у роли Участник виртуальной машины и более высоких уровней.

Можно использовать одну из встроенных ролей или создать пользовательскую роль для использования функции выполнения команд.

Azure CLI

Ниже приведен пример с использованием команды az vm run-command для запуска сценария оболочки на виртуальной машине Windows Azure.

Выполнение скрипта с виртуальной машиной

Эта команда доставляет скрипт в виртуальную машину, выполняет его и возвращает захваченные выходные данные.

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

Вывод списка всех развернутых ресурсов RunCommand на виртуальной машине

Эта команда возвращает полный список ранее развернутых функций выполнения команд, а также их свойства.

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

Получение состояния выполнения и результатов

Эта команда получает текущий ход выполнения, включая последние выходные данные, время начала и окончания, код выхода и терминальное состояние выполнения.

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

Примечание.

Поля выходных instanceView данных и ошибок ограничены последними 4 КБ. Если вы хотите получить доступ к полному выводу и ошибке, вы можете переадресовать выходные данные и данные об ошибках в хранилище, добавляя большие двоичные объекты и -outputBlobUri-errorBlobUri параметры при выполнении команды запуска с помощью Set-AzVMRunCommand или Set-AzVMssRunCommand.

Удаление ресурса RunCommand из виртуальной машины

Удалите ресурс RunCommand, ранее развернутый на виртуальной машине. Если выполнение скрипта все еще в процессе, выполнение будет завершено.

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

PowerShell

Выполнение скрипта с виртуальной машиной

Эта команда доставляет скрипт в виртуальную машину, выполняет его и возвращает захваченные выходные данные.

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

Выполнение скрипта на виртуальной машине с использованием параметра SourceScriptUri

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

Вывод списка всех развернутых ресурсов RunCommand на виртуальной машине

Эта команда возвращает полный список ранее развернутых функций выполнения команд, а также их свойства.

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

Получение состояния выполнения и результатов

Эта команда получает текущий ход выполнения, включая последние выходные данные, время начала и окончания, код выхода и терминальное состояние выполнения.

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

Создание или обновление команды запуска на виртуальной машине с помощью SourceScriptUri (URL-адрес SAS BLOB-объекта хранилища)

Создайте или обновите команду запуска на виртуальной машине Windows с помощью URL-адреса SAS большого двоичного объекта хранилища, содержащего скрипт PowerShell. SourceScriptUri может быть полным URL-адресом SAS или общедоступным URL-адресом BLOB-объекта хранилища.

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

Примечание.

URL-адрес SAS должен предоставить доступ для чтения к большому двоичному объекту. Для URL-адреса SAS предлагается срок действия 24 часа. URL-адреса SAS можно создать на портал Azure с помощью параметров большого двоичного объекта или маркера SAS.New-AzStorageBlobSASToken При создании маркера SAS с помощью New-AzStorageBlobSASTokenURL-адреса SAS = "базовый URL-адрес большого двоичного объекта" + "?" + "маркер SAS из New-AzStorageBlobSASToken"

Получение представления экземпляра команд запуска для виртуальной машины после создания или обновления команды выполнения

Получите команду run для виртуальной машины с представлением экземпляра. Представление экземпляра содержит состояние выполнения команды выполнения (Успешное выполнение, сбой и т. д.), код выхода, стандартный вывод и стандартную ошибку, созданную при выполнении скрипта с помощью команды run. Ненулевая ошибка ExitCode указывает на неудачное выполнение.

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

Пример результата

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: состояние скрипта запуска команды пользователя. Обратитесь к этому состоянию, чтобы узнать, был ли скрипт успешным или нет. ProvisioningState: состояние завершения подготовки общего расширения (может ли платформа расширений активировать скрипт команды запуска).

Создание или обновление команды run на виртуальной машине с помощью ScriptLocalPath (локальный файл скрипта)

Создайте или обновите команду запуска на виртуальной машине с помощью локального файла скрипта, который находится на клиентском компьютере, где выполняется командлет.

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

Создание или обновление команды запуска на виртуальной машине с помощью SourceScript (текст скрипта)

Создайте или обновите команду запуска на виртуальной машине, передавая содержимое скрипта непосредственно параметру -SourceScript. Использование ; для разделения нескольких команд

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

Создание или обновление команды run на виртуальной машине с помощью SourceCommandId

Создайте или обновите команду run на виртуальной машине с помощью предварительно существующего идентификатора commandId. Доступные командные идентификаторы можно получить с помощью Get-AzVMRunCommandDocument.

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

Создание или обновление команды run на виртуальной машине с помощью OutputBlobUri, ErrorBlobUri для потоковой передачи стандартных выходных данных и стандартных сообщений об ошибках для вывода и добавления БОЛЬШИХ двоичных объектов

Создайте или обновите команду run на виртуальной машине и потоковую передачу стандартных выходных данных и стандартных сообщений об ошибках для вывода и добавления больших двоичных объектов.

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

Примечание.

Выходные и ошибки большие двоичные объекты должны быть типом AppendBlob, а URL-адреса SAS должны предоставлять доступ для чтения, добавления, создания, записи в большой двоичный объект. Для URL-адреса SAS предлагается срок действия 24 часа. Если выходные данные или большой двоичный объект ошибки не существует, будет создан большой двоичный объект типа AppendBlob. URL-адреса SAS можно создать на портал Azure с помощью параметров большого двоичного объекта или маркера SAS.New-AzStorageBlobSASToken

Создание или обновление команды run на виртуальной машине в качестве другого пользователя с помощью параметров RunAsUser и RunAsPassword

Создайте или обновите команду run на виртуальной машине в качестве другого пользователя с помощью RunAsUser и RunAsPassword параметрами. Чтобы запуски работали правильно, обратитесь к администратору виртуальной машины и убедитесь, что пользователь добавляется на виртуальной машине, пользователь имеет доступ к ресурсам, к которым обращается команда Run (каталоги, файлы, сеть и т. д.), а в случае с виртуальной машиной Windows служба "Вторичный вход" выполняется на виртуальной машине.

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

Создание или обновление команды run в ресурсе Масштабируемые наборы виртуальных машин с помощью SourceScriptUri (URL-адрес SAS BLOB-объекта хранилища)

Создайте или обновите команду запуска в ресурсе Windows Масштабируемые наборы виртуальных машин с помощью URL-адреса SAS большого двоичного объекта хранилища, содержащего скрипт PowerShell.

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

Примечание.

URL-адрес SAS должен предоставить доступ для чтения к большому двоичному объекту. Срок действия 24 часов предлагается для URL-адреса SAS. URL-адреса SAS можно создать на портал Azure с помощью параметров большого двоичного объекта или маркера SAS.New-AzStorageBlobSASToken Если вы создаете маркер SAS с помощью New-AzStorageBlobSASToken, формат URL-адреса SAS: базовый URL-адрес БОЛЬШОго двоичного объекта + "?" + маркер SAS из New-AzStorageBlobSASToken.

Создание или обновление команды run в экземпляре виртуальной машины с помощью параметров и параметров ProtectedParameter (общедоступные и защищенные параметры для скрипта)

Используйте ProtectedParameter для передачи конфиденциальных входных данных скрипту, таким как пароли, ключи и т. д.

$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: параметры и protectedParameters передаются скрипту в виде аргументов, передаваемых в скрипт и запуска, как показано ниже. myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value

  • Linux: именованные параметры и его значения задаются в конфигурации среды, которая должна быть доступна в скрипте .sh. Для аргументов без имен передайте пустую строку для ввода имени. Бессерверные аргументы передаются в скрипт и выполняются следующим образом: myscript.sh publicParam1value publicParam2value secret1value secret2value

Удаление ресурса RunCommand из виртуальной машины

Удалите ресурс RunCommand, ранее развернутый на виртуальной машине. Если выполнение скрипта все еще в процессе, выполнение будет завершено.

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

REST API

Чтобы развернуть новую функцию выполнения команд, выполните команду PUT непосредственно на виртуальной машине и укажите уникальное имя для экземпляра выполнения команд.

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

Примечания.

  • В качестве источника входных данных можно указать встроенный скрипт, URI скрипта или идентификатор команды встроенного скрипта. URI скрипта — это универсальный код ресурса (URI) SAS BLOB-объекта хранилища с доступом на чтение или общедоступный URI.
  • Для одного выполнения команды поддерживается только один тип входных данных источника.
  • Начиная с API версии 2023-03-01, можно задать для свойства treatFailureAsDeploymentFailure значение true, что приводит к сбою развертывания при возникновении сбоя в скрипте. Если задано значение false, ProvisioningState будет отражать только выполнение команды выполнения платформой расширений. Он не указывает, завершился ли скрипт сбоем в случае сбоев скрипта.
  • Команда Run поддерживает запись выходных данных и ошибок в большие двоичные объекты хранилища с помощью параметров outputBlobUri и errorBlobUri, которые можно использовать для хранения больших объемов выходных данных скрипта. Используйте URI SAS для добавочного BLOB-объекта хранилища с доступом на чтение, добавление, создание, запись. BLOB-объект должен иметь тип AppendBlob. Запись выходных данных скрипта или BLOB-объекта ошибок в противном случае завершится ошибкой. BLOB-объект будет перезаписан, если он уже существует. Он будет создан, если он не существует.

Список запущенных экземпляров функции выполнения команд на виртуальной машине

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

Получение сведений о выводе для определенного развертывания функции выполнение команд

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

Удаление определенного развертывания команды запуска

Также можно удалить экземпляр функции выполнения команд.

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

Развертывание скриптов в упорядоченной последовательности

Для последовательного развертывания скриптов используйте шаблон развертывания, указав связь dependsOn между последовательными скриптами.

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

Последовательное выполнение нескольких функций выполнения команд

По умолчанию при развертывании нескольких ресурсов RunCommand с помощью шаблона развертывания они будут выполняться одновременно на виртуальной машине. Если существует зависимость от скриптов и имеется предпочтительный порядок выполнения, можно использовать свойство dependsOn, чтобы они выполнялись последовательно.

В этом примере secondRunCommand будет выполняться после 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
         }
      }
   ]
}

Следующие шаги

Сведения о других способах удаленного выполнения сценариев и команд на виртуальной машине см. в разделе Выполнение сценариев в виртуальных машинах Windows.