Выполнение скриптов в виртуальной машине Linux с помощью функции "Выполнение команд"
Область применения: ✔️ Виртуальные машины Linux ✔️ Гибкие масштабируемые наборы
Внимание
Команда управляемого запуска в настоящее время доступна в Azure CLI, PowerShell и API в настоящее время. Функциональные возможности портала приведены в схеме.
Функция "Выполнение команд" использует агент виртуальной машины для выполнения скриптов на виртуальной машине Azure Linux. Эти сценарии можно использовать для общего управления компьютерами или приложениями. Они могут помочь вам быстро диагностировать и исправлять проблемы доступа к виртуальной машине и сети, а также восстановить работоспособность виртуальной машины.
Обновленная управляемая функция "Выполнение команд" использует один и тот же канал агента виртуальных машин для выполнения скриптов и предоставляет следующие усовершенствования в рамках выполнения команд, ориентированных на исходное действие:
- поддержка обновленной функции "Выполнение команд" с помощью шаблона развертывания ARM;
- параллельное выполнение нескольких скриптов;
- последовательное выполнение скриптов;
- указанное пользователем время ожидания скрипта;
- поддержка длительно выполняемых скриптов (ч/дн);
- безопасная передача секретов (параметров и паролей).
Необходимые компоненты
Внимание
Минимальный поддерживаемый гостевой агент Linux версии 2.4.0.2 более ранних версий не поддерживает Managed RunCommand
Поддерживаемые дистрибутивы Linux
Дистрибутив Linux | x64 | ARM64 |
---|---|---|
AlmaLinux | 9.x+ | Не поддерживается |
Debian | 10+ | Не поддерживается |
Flatcar Linux | 3374.2.x+ | Не поддерживается |
Azure Linux | 2.x | Не поддерживается |
openSUSE | 12.3+ | Не поддерживается |
Oracle Linux | 6.4+, 7.x+, 8.x+ | Не поддерживается |
Red Hat Enterprise Linux | 6.7+, 7.x+, 8.x+ | Не поддерживается |
Rocky Linux | 9.x+ | Не поддерживается |
SLES | 12.x+, 15.x+ | Не поддерживается |
Ubuntu | 18.04+, 20.04+, 22.04+ | Не поддерживается |
Ограничение доступа к команде запуска
Перечисление команд выполнения или отображение сведений о команде требует Microsoft.Compute/locations/runCommands/read
разрешения на уровне подписки. Это разрешение имеется у встроенной роли Читатель и более высоких уровней.
Для выполнения команды требуется разрешение Microsoft.Compute/virtualMachines/runCommand/write
. Это разрешение имеется у роли Участник виртуальной машины и более высоких уровней.
Можно использовать одну из встроенных ролей или создать пользовательскую роль для использования функции выполнения команд.
Azure CLI
Ниже приведен пример с использованием команды az vm run-command для запуска скрипта оболочки на виртуальной машине Linux Azure.
Выполнение скрипта с виртуальной машиной
Эта команда предоставляет скрипт виртуальной машине, выполняет его и возвращает захваченные выходные данные.
az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "echo 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>”
Выполнение длительной команды выполнения на виртуальной машине
Время выполнения должно выполняться дольше времени ожидания по умолчанию 90 минут. Он должен работать в течение 100 минут (ссылаться на 6000 секунд -TimeoutInSecond параметр), предоставленный скрипт, как ожидается, будет выполняться в течение этого длительного времени. Через 100 минут выполнение скрипта должно остановиться.
Set-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri> -AsyncExecution -TimeoutInSecond 6000
Вывод списка всех развернутых ресурсов 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-объекта хранилища.
Примечание.
URL-адрес SAS должен предоставить доступ для чтения к большому двоичному объекту. Для URL-адреса SAS предлагается срок действия 24 часа. URL-адреса SAS можно создать на портал Azure с помощью параметров большого двоичного объекта или маркера SAS.New-AzStorageBlobSASToken
При создании маркера SAS с помощью New-AzStorageBlobSASToken
URL-адреса SAS = "базовый URL-адрес большого двоичного объекта" + "?" + "маркер SAS из New-AzStorageBlobSASToken"
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptURI>
Получение представления экземпляра команд запуска для виртуальной машины после создания или обновления команды выполнения
Получите команду run для виртуальной машины с представлением экземпляра. Представление экземпляра содержит состояние выполнения команды run (Успешное выполнение, сбой и т. д.), код выхода, стандартный вывод и стандартную ошибку, созданную при выполнении скрипта с помощью команды run. Ненулевое завершение Кода указывает на неудачное выполнение.
$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
— состояние завершения подготовки общего расширения (может ли платформа расширений активировать скрипт команды запуска).
Создание или обновление команды запуска на виртуальной машине с помощью SourceScript (текст скрипта)
Создайте или обновите команду запуска на виртуальной машине, передавая содержимое скрипта непосредственно параметру -SourceScript. Используется ;
для разделения нескольких команд.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand2 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"
Создание или обновление команды run на виртуальной машине с помощью SourceCommandId
Создайте или обновите команду запуска на виртуальной машине с помощью предварительно существующей commandId
команды. Доступные командные идентификаторы можно получить с помощью Get-AzVMRunCommandDocument.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceCommandId ipconfig
Создание или обновление команды выполнения на виртуальной машине с помощью OutputBlobUri, ErrorBlobUri для потоковой передачи стандартных выходных данных и стандартных сообщений об ошибках для вывода и добавления больших двоичных объектов
Создайте или обновите команду run на виртуальной машине и потоковую передачу стандартных выходных данных и стандартных сообщений об ошибках для вывода и добавления больших двоичных объектов.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location EastUS2EUAP EastUS2EUAP -SourceScriptUri <SourceScriptUri> -OutputBlobUri <OutputBlobUri> -ErrorBlobUri <errorbloburi>
Примечание.
Выходные и ошибки большие двоичные объекты должны быть типами AppendBlob
, а URL-адреса SAS должны предоставлять доступ для чтения, добавления, создания, записи к большому двоичному объекту. Для URL-адреса SAS предлагается срок действия 24 часа. Если выходные данные или большой двоичный объект ошибки не существует, будет создан большой двоичный объект типа AppendBlob. URL-адреса SAS можно создать на портал Azure с помощью параметров большого двоичного объекта или маркера SAS с помощью New-AzStorageBlobSASToken. При создании маркера SAS с помощью New-AzStorageBlobSASToken
URL-адреса SAS = базовый URL-адрес БОЛЬШОго двоичного объекта + "?" + маркер SAS.New-AzStorageBlobSASToken
Создание или обновление команды run на виртуальной машине выполните команду Run от имени другого пользователя с помощью параметров RunAsUser и RunAsPassword
Создайте или обновите команду запуска на виртуальной машине, запустите команду run в качестве другого пользователя и RunAsUser
RunAsPassword
параметров. Чтобы запуски работали должным образом, обратитесь к администратору виртуальной машины и убедитесь, что пользователь добавляется на виртуальной машине, пользователь имеет доступ к ресурсам, к которым обращается команда Run (каталоги, файлы, сеть и т. д.), а в случае с виртуальной машиной Windows служба "Вторичный вход" выполняется на виртуальной машине.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP EastUS2EUAP -SourceScriptUri <SourceScriptUri> -RunAsUser myusername -RunAsPassword mypassword
Создайте или обновите команду запуска в ресурсе Масштабируемые наборы виртуальных машин с помощью SourceScriptUri (URL-адрес SAS BLOB-объекта хранилища).
Создайте или обновите команду запуска в ресурсе Масштабируемые наборы виртуальных машин с помощью URL-адреса SAS большого двоичного объекта хранилища, содержащего скрипт bash.
Set-AzVmssVMRunCommand -ResourceGroupName MyRG0 -VMScaleSetName MyVMSS -InstanceId 0 -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>
Примечание.
Обратите внимание, что URL-адрес SAS должен предоставлять доступ для чтения к большому двоичному объекту. Для URL-адреса SAS предлагается срок действия 24 часа. URL-адреса SAS можно создать на портал Azure с помощью параметров большого двоичного объекта или маркера SAS с помощью New-AzStorageBlobSASToken. Если создается маркер SAS с помощью New-AzStorageBlobSASToken, URL-адрес SAS = базовый URL-адрес BLOB-объектов + "?" + маркер SAS из New-AzStorageBlobSASToken
.
Создание или обновление команды run в экземпляре виртуальной машины с помощью параметров и параметров 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
Используйте ProtectedParameter
для передачи конфиденциальных входных данных скрипту, таким как пароли, ключи и т. д.
- 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?api-version=2019-12-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,
"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.
- Для одного выполнения команды поддерживается только один тип входных данных источника.
- Команда Run поддерживает запись выходных данных и ошибок в большие двоичные объекты хранилища с помощью параметров outputBlobUri и errorBlobUri, которые можно использовать для хранения больших объемов выходных данных скрипта. Используйте URI SAS для добавочного BLOB-объекта хранилища с доступом на чтение, добавление, создание, запись. BLOB-объект должен иметь тип AppendBlob. Запись выходных данных скрипта или BLOB-объекта ошибок в противном случае завершится ошибкой. BLOB-объект будет перезаписан, если он уже существует. Он будет создан, если он не существует.
Список запущенных экземпляров функции выполнения команд на виртуальной машине
GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2019-12-01
Получение сведений о выводе для определенного развертывания функции выполнение команд
GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?$expand=instanceView&api-version=2019-12-01
Удаление определенного развертывания команды запуска
Удаление экземпляра команды run
DELETE /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2019-12-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":"echo 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":"2019-12-01",
"location":"[parameters('location')]",
"dependsOn":[
"[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
],
"properties":{
"source":{
"script":"echo 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
}
}
]
}
Следующие шаги
Сведения о других способах для удаленного запуска скриптов и команд на виртуальной машине см. в разделе Выполнение скриптов в виртуальных машинах Linux.