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

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

重要

目前,Azure CLI、PowerShell 和 API 中可使用“托管运行命令”。 门户功能正在规划中。

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

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

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

先决条件

重要

支持的最低版本 Linux 来宾代理为 2.4.0.2。旧版本不支持托管 RunCommand

支持的 Linux 发行版

Linux 发行版 x64 ARM64
Alma Linux 9.x+ 不支持
Debian 10+ 不支持
Azure Linux 2.x 不支持
OpenSUSE 12.3+ 不支持
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 在 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 执行运行命令时,选择使用 -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(存储 blob SAS URL)在 VM 上创建或更新运行命令

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

备注

SAS URL 必须提供对 Blob 的读取访问权限。 建议将 SAS URL 的过期时间设为 24 小时。 可使用 blob 的选项在 Azure 门户上生成 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。 可使用 blob 的选项在 Azure 门户上生成 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(存储 blob SAS URL)在虚拟机规模集资源上创建或更新“运行命令”。

使用包含 Bash 脚本的存储 blob 的 SAS URL,在虚拟机规模集资源上创建或更新“运行命令”。

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

备注

请注意,SAS URL 必须提供对 blob 的读取访问权限。 建议将 SAS URL 的过期时间设为 24 小时。 可使用 blob 的选项在 Azure 门户上生成 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。
  • 一个命令执行仅支持一种类型的源输入。
  • 运行命令支持使用 outputBlobUri 和 errorBlobUri 参数将输出和错误写入存储 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
         }
      }
   ]
}

后续步骤

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