适用于:✔️ Linux VM ✔️ 灵活规模集
重要
目前,Azure CLI、PowerShell 和 API 中可使用“托管运行命令”。 门户功能正在规划中。
运行命令功能使用虚拟机 (VM) 代理在 Azure Linux VM 中运行脚本。 可以使用这些脚本进行常规计算机或应用程序管理。 它们可以帮助你快速诊断和修正 VM 访问与网络问题并使 VM 恢复到良好状态。
更新的托管运行命令使用相同的 VM 代理通道来执行脚本,并在原始操作导向的运行命令的基础上提供以下增强功能:
- 通过 ARM 部署模板支持已更新的运行命令
- 并行执行多个脚本
- 按顺序执行脚本
- 用户指定的脚本超时
- 支持长时间运行(数小时/数天)的脚本
- 以安全的方式传递机密(参数、密码)
重要
支持的最低版本 Linux 来宾代理为 2.4.0.2。旧版本不支持托管 RunCommand
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
权限。 虚拟机参与者角色和更高级别具有此权限。
若要使用“运行命令”,可以使用内置角色之一,也可以创建一个自定义角色。
以下示例使用 az vm run-command 在 Azure Linux VM 上运行 shell 脚本。
此命令将脚本传送到 VM 进行执行并返回捕获的输出。
az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "echo Hello World!"
此命令返回先前部署的运行命令及其属性的完整列表。
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-AzVMRunCommand
或 Set-AzVMssRunCommand
执行运行命令时,选择使用 -outputBlobUri
和 -errorBlobUri
参数将输出和错误数据转发到存储追加 blob。
删除先前部署在 VM 上的 RunCommand 资源。 如果脚本执行仍在进行,将终止执行。
az vm run-command delete --name "myRunCommand" --vm-name "myVM" --resource-group "myRG"
此命令将脚本传送到 VM 进行执行并返回捕获的输出。
Set-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -Location "chinanorth2" -RunCommandName "RunCommandName" -SourceScript "echo Hello World!"
可选参数为 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 分钟(参考 6,000 秒 -TimeoutInSecond 参数),前提是脚本确实需要运行这么长时间。 100 分钟后,脚本应停止执行。
Set-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Location ChinaNorth -SourceScriptUri <SourceScriptUri> -AsyncExecution -TimeoutInSecond 6000
此命令返回先前部署的运行命令及其属性的完整列表。
Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM"
此命令检索当前执行进度,包括执行的最新输出、开始/结束时间、退出代码和终止状态。
Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName" -Expand instanceView
使用包含 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 的运行命令。 实例视图包含运行命令的执行状态(成功、失败等)、退出代码、标准输出和使用运行命令执行脚本生成的标准错误。 非零 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
- 常规扩展预配端到端状态(扩展平台是否能够触发“运行命令”脚本)。
在 VM 上创建或更新运行命令,将脚本内容直接传递到 -SourceScript 参数。 使用 ;
分隔多个命令。
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand2 -Location chinanorth2 -SourceScript "id; echo HelloWorld"
使用已存在的 commandId
在 VM 上创建或更新运行命令。 可以使用 Get-AzVMRunCommandDocument 检索可用的 commandId。
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location chinanorth2 -SourceCommandId ipconfig
在虚拟机上创建或更新运行命令,并将标准输出和标准错误消息流式传输到输出和错误追加 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
参数以其他用户身份运行“运行命令” 若要使 RunAs 正常工作,请与 VM 的管理员联系,并确保在 VM 上添加用户,并且用户有权访问由运行命令访问的资源(目录、文件、网络等),如果是 Windows VM,需要确保 VM 上正在运行“辅助登录”服务。
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location chinanorth2 -SourceScriptUri <SourceScriptUri> -RunAsUser myusername -RunAsPassword mypassword
使用包含 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 令牌。
$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 资源。 如果脚本执行仍在进行,则执行终止。
Remove-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName"
要部署新的运行命令,请直接在 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。
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 中运行脚本。