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

Внимание

Эта статья ссылается на CentOS, дистрибутив Linux, который приближается к состоянию конца жизни (EOL). Обратите внимание на использование и план соответствующим образом. Дополнительные сведения см. в руководстве centOS End Of Life.

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

Внимание

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

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

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

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

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

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

Дистрибутив Linux x64 ARM64
AlmaLinux 9.x+ Не поддерживается
CentOS 7.x+, 8.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>”

Вывод списка всех развернутых ресурсов 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-AzStorageBlobSASTokenURL-адреса SAS = "базовый URL-адрес большого двоичного объекта" + "?" + "маркер SAS из New-Az служба хранилища BlobSASToken"

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

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

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

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

Создание или обновление команды run на виртуальной машине с помощью 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-Az служба хранилища BlobSASToken. При создании маркера SAS с помощью New-AzStorageBlobSASTokenURL-адреса SAS = базовый URL-адрес БОЛЬШОго двоичного объекта + "?" + маркер 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 должен предоставлять доступ для чтения к большому двоичному объекту. Для URL-адреса SAS предлагается срок действия 24 часа. URL-адреса SAS можно создать на портал Azure с помощью параметров БОЛЬШОго двоичного объекта или маркера SAS с помощью New-Az служба хранилища BlobSASToken. При создании маркера SAS с помощью New-Az служба хранилища BlobSASToken, 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 непосредственно на виртуальной машине и укажите уникальное имя для экземпляра выполнения команд.

GET /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.