使用托管运行命令在 Linux VM 中运行脚本

适用于:✔️ Linux VM ✔️ 灵活规模集

重要

Managed Run Command目前在 Azure CLI、PowerShell 和 API 中可用。 门户功能正在规划中。

运行命令功能使用虚拟机(VM)代理在 Azure Linux VM 中运行脚本。 可以使用这些脚本进行常规计算机或应用程序管理。 它们可以帮助你快速诊断和修正 VM access和网络问题,并使 VM 恢复良好状态。

更新的托管运行命令使用相同的 VM 代理通道来执行脚本,并在原始操作导向的运行命令的基础上提供以下增强功能:

  • 通过 ARM 部署模板支持已更新的运行命令
  • 并行执行多个脚本
  • 按顺序执行脚本
  • 用户指定的脚本超时
  • 支持长时间运行(数小时/数天)的脚本
  • 以安全的方式传递机密(参数、密码)

先决条件

重要

最低支持的 Linux 来宾代理版本为版本 2.4.0.2 旧版本不支持托管运行命令。 有关详细信息,请参阅 排查已知问题

支持的 Linux 发行版

发布者 分销 x64 ARM64
Alma Linux 社区 Alma Linux 8.x+、9.x+ 8.x+、9.x+
Credativ Debian 10+ 11.x+
Microsoft Azure Linux 2.x 2.x
openSUSE Project OpenSUSE 12.3+ 不支持
CIQ Rocky Linux 9.x+ 9.x+
SUSE SLES 12.x+、15.x+ 15.x SP4+
Canonical Ubuntu (LTS 版本) 18.04+、20.04+、22.04+、24.04+ 20.04+、22.04+、24.04+

可用命令

CommandID 说明
RunShellScript 运行 Linux shell 脚本。
ifconfig 获取所有网络接口的配置。 有关用法,请参阅 “运行脚本”

注意

上述命令 ID 适用于 Linux VM 的托管运行命令。 可以使用命令“”Get-AzVMRunCommandDocument -Location {RegionName}列出所有 commandId。

限制访问权限的运行命令

列出运行命令或显示命令详细信息需要具有订阅级别的 Microsoft.Compute/locations/runCommands/read 权限。 内置 Reader 角色及更高等级具有此权限。

运行命令需要 Microsoft.Compute/virtualMachines/runCommand/write 权限。 虚拟机参与者角色和更高级别具有此权限。

可以使用其中一个内置角色或创建 custom 角色来使用 Run Command。

Azure CLI

以下示例使用 az vm run-command 在 Azure Linux VM 上运行 shell 脚本。

在 VM 上执行脚本

此命令将脚本传送到 VM 进行执行并返回捕获的输出。

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

列出 VM 上所有已部署的 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 中的输出和错误字段限制为最后 4KB。 如果要访问完整输出和错误,可以选择在使用 Set-AzVMRunCommandSet-AzVMssRunCommand 执行 Run Command 时,使用 -outputBlobUri-errorBlobUri 参数将输出和错误数据转发到存储追加 blob。

从 VM 中删除 RunCommand 资源

删除先前部署在 VM 上的 RunCommand 资源。 如果脚本执行仍在进行,将终止执行。

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

PowerShell

在 VM 上执行脚本

此命令将脚本传送到 VM 进行执行并返回捕获的输出。

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

使用 SourceScriptUri 参数在 VM 上执行脚本

可选参数为 OutputBlobUriErrorBlobUri

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

在 VM 上执行长时间运行的运行命令

执行时间应超过默认的 90 分钟超时时间。 预计运行 100 分钟(参考 6,000 秒 -TimeoutInSecond 参数),前提是脚本确实需要运行这么长时间。 100 分钟后,脚本应停止执行。

Set-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Location ChinaNorth -SourceScriptUri <SourceScriptUri> -AsyncExecution -TimeoutInSecond 6000

列出 VM 上所有已部署的 RunCommand 资源

此命令返回先前部署的运行命令及其属性的完整列表。

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

获取执行状态和结果

此命令检索当前执行进度,包括执行的最新输出、开始/结束时间、退出代码和终止状态。

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

使用 SourceScriptURI 在 VM 上创建或更新运行命令(storage blob SAS URL)

使用包含 PowerShell 脚本的存储 blob 的 SAS URL,在 Windows VM 上创建或更新运行命令。 SourceScriptUri 可以是存储 blob 的完整 SAS URL 或公共 URL。

注意

SAS URL 必须向 blob 提供读取访问权限。 建议将 SAS URL 的过期时间设为 24 小时。 可以在 Azure 门户上通过 blob 选项生成 SAS URL,或者使用 New-AzStorageBlobSASToken 的 SAS 令牌生成。 如果使用 New-AzStorageBlobSASToken 生成 SAS 令牌,则 SAS URL =“基础 blob URL”+“?”+“来自 New-AzStorageBlobSASToken 的 SAS 令牌”

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

在创建或更新运行命令后,获取 VM 的运行命令实例视图

获取具有实例视图的 VM 的运行命令。 实例视图包含运行命令的执行状态(成功、失败等)、退出代码、标准输出和使用运行命令执行脚本生成的标准错误。 非零 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(脚本文本)在 VM 上创建或更新运行命令

在 VM 上创建或更新运行命令,将脚本内容直接传递到 -SourceScript 参数。 使用 ; 分隔多个命令。

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

使用 SourceCommandId 在 VM 上创建或更新运行命令

在预先存在的 commandId VM 上创建或更新运行命令。 可以使用 Get-AzVMRunCommandDocument 检索可用的 commandId。

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location chinanorth2 -SourceCommandId ipconfig

使用 OutputBlobUri 和 ErrorBlobUri 在虚拟机上创建或更新“运行命令”,以将标准输出和标准错误消息流式传输到输出和错误追加 blob

在虚拟机上创建或更新运行命令,并将标准输出和标准错误消息流式传输到输出和错误追加 blob。

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location chinanorth2 -SourceScriptUri <SourceScriptUri> -OutputBlobUri <OutputBlobUri> -ErrorBlobUri <errorbloburi>

注意

输出和错误 blob 的类型必须为 AppendBlob,其 SAS URL 必须提供对 blob 的读取、追加、创建和写入访问权限。 建议将 SAS URL 的过期时间设为 24 小时。 如果输出或错误 blob 不存在,将会创建类型为 AppendBlob 的 blob。 可以在 Azure 门户上使用 Blob 选项生成 SAS URL,或使用 New-AzStorageBlobSASToken 命令生成 SAS 令牌。 如果使用 New-AzStorageBlobSASToken 生成 SAS 令牌,则 SAS URL = 基础 Blob URL +“?”+ 从 New-AzStorageBlobSASToken 获取的 SAS 令牌。

在 VM 上创建或更新运行命令,使用 RunAsUser 和 RunAsPassword 参数以其他用户的身份运行“运行命令”

在 VM 上创建或更新“运行命令”,使用 RunAsUserRunAsPassword 参数以其他用户身份运行“运行命令” 若要使 RunAs 正常工作,请联系 VM 管理员,并确保在 VM 上添加用户,用户已被赋予访问运行命令所需资源(目录、文件、网络等)的权限,且如果是 Windows VM,则保证“辅助登录”服务正在 VM 上运行。

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location chinanorth2 -SourceScriptUri <SourceScriptUri> -RunAsUser myusername -RunAsPassword mypassword

使用 SourceScriptUri 在Virtual Machine Scale Sets资源上创建或更新运行命令(storage blob SAS URL)。

使用包含 bash 脚本的 storage blob 的 SAS URL 在Virtual Machine Scale Sets资源上创建或更新运行命令。

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

注意

请注意,SAS URL 必须允许对 blob 的读取访问。 建议将 SAS URL 的过期时间设为 24 小时。 可以使用 Azure portal 中 Blob 的选项生成 SAS URL,或者使用 New-AzStorageBlobSASToken 生成 SAS 令牌。 如果使用 New-AzStorageBlobSASToken 生成 SAS 令牌,则 SAS URL = 基础 Blob URL +“?”+ 从 New-AzStorageBlobSASToken 获取的 SAS 令牌。

使用 Parameter 和 ProtectedParameter 参数(脚本中的公共参数和受保护参数)在 VM 实例上创建或更新运行命令

$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 chinanorth2 -SourceScriptUri <SourceScriptUri> -Parameter $PublicParametersArray -ProtectedParameter $ProtectedParametersArray

使用 ProtectedParameter 将任何敏感输入(例如密码、密钥)传递给脚本。

  • Windows:Parameters 和 ProtectedParameters 作为参数传递给脚本,并以如下方式运行:myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value
  • Linux:命名参数及其值设置为环境配置,应该可在 .sh 脚本中访问它。 对于无名称参数,请向名称输入传递一个空字符串。 无名称参数将传递给脚本并按如下方式运行 - myscript.sh publicParam1value publicParam2value secret1value secret2value

从 VM 中删除 RunCommand 资源

删除先前部署在 VM 上的 RunCommand 资源。 如果脚本执行仍在进行,则执行终止。

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

REST API

要部署新的运行命令,请直接在 VM 上执行 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 或内置脚本命令 ID 作为输入源。 脚本 URI 是具有读取权限的存储 Blob SAS URI 或公共 URI。
  • 一个命令执行仅支持一种类型的源输入。
  • Run Command 支持使用 outputBlobUri 和 errorBlobUri 参数将输出和错误写入Storage blob,这些参数可用于存储大型脚本输出。 使用具有读取、添加、创建、写入权限的存储追加 BLOB 的 SAS URI。 blob 的类型应为 AppendBlob。 否则,编写脚本输出或错误 blob 会失败。 如果 blob 已存在,将会被覆盖。 如果不存在,则会创建 blob。

列出 VM 上运行命令的运行中实例

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

删除特定的运行命令配置

删除运行命令的实例

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 资源,这些资源将在 VM 上同时执行。 如果脚本存在依赖关系和偏好的执行顺序,你可以使用 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 或更早版本时部署具有托管运行命令的 VM,则不会执行托管运行命令。

原因: 托管运行命令需要 Linux 来宾代理版本 2.4.0.2 或更高版本才能安装和执行。

缓解措施: 在使用托管运行命令之前,请将 Linux 客户代理升级到版本 2.4.0.2 或更高版本。 或者,使用已经包含内置 Linux 来宾代理版本 2.4.0.2 或更高版本的映像。

若要检查 Linux 来宾代理版本,请运行:

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

后续步骤

若要了解以远程方式在 VM 中运行脚本和命令的其他方式,请参阅在 Linux VM 中运行脚本