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

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

Внимание

Управляемая команда запуска в настоящее время доступна в Azure CLI, PowerShell и API. Функциональные возможности портала приведены в схеме.

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

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

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

Предварительные условия

Внимание

Минимальный поддерживаемый гостевой агент Linux версии 2.4.0.2 более ранних версий не поддерживает управляемые команды запуска. Дополнительные сведения см. в разделе "Устранение известных проблем".

Поддерживаемые дистрибутивы Linux

Publisher Распределение х64 ARM64
Сообщество Alma Linux AlmaLinux 8.x+, 9.x+ 8.x+, 9.x+
Кредатив Debian 10+ 11.x+
Kinvolk Flatcar Linux 3374.2.x+ 3374.2.x+
Microsoft Azure Linux 2.x 2.x
Проект openSUSE openSUSE 12.3+ Не поддерживаются
Oracle; Oracle Linux 6.4+, 7.x+, 8.x+ Не поддерживаются
Red Hat Red Hat Enterprise Linux 6.7+, 7.x+, 8.x+, 9.x+, 10.x+ 8.6+, 9.0+, 10.x+
CIQ Рокки Linux 9.x+ 9.x+
SUSE SLES 12.x+, 15.x+ 15.x с пакетом обновления 4 (SP4)
Канонический Ubuntu (выпуски LTS) 18.04+, 20.04+, 22.04+, 24.04+ 20.04+, 22.04+, 24.04+

Доступные команды

CommandID Описание
RunShellScript Запускает скрипт оболочки Linux.
ifconfig Получает конфигурации всех сетевых интерфейсов. Сведения об использовании см. в разделе "Запуск сценариев"

Примечание.

Приведенные выше идентификаторы команд применимы к управляемым командам запуска для виртуальных машин Linux. Вы можете перечислить все командные идентификаторы с помощью команды "Get-AzVMRunCommandDocument -Location {RegionName}".

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

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

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

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

Azure CLI (Интерфейс командной строки для Azure)

Ниже приведен пример с использованием команды 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>”

Запуск долговыполняющейся Run команды на виртуальной машине

Время выполнения должно превышать стандартное время ожидания в 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 часа. SAS URL можно создать в портале Azure с помощью параметров blob или токена 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. Ненулевой код завершения указывает на неудачное выполнение.

$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, используя параметры объекта BLOB, или посредством маркера SAS с командой New-AzStorageBlobSASToken. При создании маркера SAS с помощью New-AzStorageBlobSASToken URL-адрес SAS = базовый URL-адрес BLOB + "?" + маркер SAS из New-AzStorageBlobSASToken.

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

Создайте или обновите команду запуска на виртуальной машине, запустите команду run в качестве другого пользователя и RunAsUserRunAsPassword параметров. Чтобы запуски работали должным образом, обратитесь к администратору виртуальной машины и убедитесь, что пользователь добавляется на виртуальной машине, пользователь имеет доступ к ресурсам, к которым обращается команда 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 должен предоставлять доступ для чтения к объекту Blob. Для URL-адреса SAS предлагается срок действия 24 часа. URL-адреса SAS можно создать на портале Azure, используя параметры объекта BLOB, или посредством маркера SAS с командой New-AzStorageBlobSASToken. Если маркер SAS создается с помощью New-AzStorageBlobSASToken, URL-адрес SAS = базовый URL-адрес объектов BLOB + "?" + маркер SAS из New-AzStorageBlobSASToken.

Создание или обновление команды выполнения на экземпляре виртуальной машины с использованием параметров Parameter и 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

Получите сведения о выводе для определенного развертывания Run Command.

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

Удалить конкретное развертывание команды Run

Удаление экземпляра команды 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

Проблема: Если вы развертываете виртуальную машину с управляемой командой запуска, если гостевой агент Linux имеет версию 2.4.0.1 или более ранней, управляемая команда запуска не выполняется.

Причина: Для установки и выполнения требуется гостевой агент Linux версии 2.4.0.2 или более поздней.

Меры по устранению: Обновите гостевой агент Linux до версии 2.4.0.2 или более поздней, прежде чем использовать управляемую Run Command. Кроме того, используйте образ, который уже имеет встроенный гостевой агент Linux версии 2.4.0.2 или более поздней версии.

Чтобы проверить версию гостевого агента Linux, выполните следующую команду:

az vm get-instance-view --resource-group $RGName$ --name $VMName$ --subscription $SUBSCRIPTION --query 'instanceView.vmAgent.vmAgentVersion'

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

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