Выполнение скриптов в виртуальной машине 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-AzStorageBlobSASToken
URL-адреса 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.