在启用了Azure Arc的服务器(预览版)上运行命令可让你在连接到Azure Arc的虚拟机(VM)上远程安全地执行脚本或命令,而无需通过Remote Desktop协议或 SSH 直接连接。
由于无需单独登录到每个 VM,运行命令减少了进行管理任务时的开销和精力,例如安装或更新软件、配置防火墙规则、执行运行状况检查或排除故障。
一个关键用例是使用“运行”命令增强安全态势。 可以使用“运行”命令远程应用安全修补程序、强制实施符合性策略或修正已启用Azure Arc的服务器上的漏洞。 还可以自动执行常见安全任务,例如轮换密码、加密数据或审核日志。 通过Azure Arc,可以在混合、多云和边缘环境中一致地执行这些任务,从而减少作开销和响应时间。
注意
尽管存在一些差异,Azure Arc 启用的服务器上的“运行”命令与 Azure 虚拟机上使用的“运行”命令功能类似,包括所述限制。 例如,“运行”命令在启用 Azure Arc 的服务器上,当前在 Azure 门户中不可用。
工作原理
Run 命令内置于 Connected Machine 代理(从版本 1.33 开始),并支持运行脚本以及跨创建、更新、删除、排序和列出作集中脚本管理的功能。
使用“运行”命令从 Azure CLI、PowerShell 或 REST API 执行脚本或命令时,Azure指示 VM 上安装的连接计算机代理完成指定的作。 无需将任何其他扩展安装到 VM。
虽然Azure Arc启用的服务器上的“运行”命令是免费的,但存储在Azure中的脚本会产生计费费用。
重要
在启用Azure Arc的服务器上运行命令当前不支持使用托管标识对 blob 进行身份验证。
支持的配置
“运行”命令可在多个配置中使用:
- Experiences: Azure CLI、PowerShell 和 REST API
- Operating systems: Windows 和 Linux
- Environments:连接到Azure Arc的非Azure环境,包括本地、VMware、SCVMM、AWS、GCP 和 OCI
注意
在 Linux 上,Run 命令不接受超过 36 个字符的名称。
使用“运行”命令
若要使用“运行”命令,请创建包含要在 VM 上运行的命令的脚本。 然后,使用
以下示例使用 Az.ConnectedMachine 模块Azure PowerShell在已启用 Arc 的服务器上执行脚本或命令。
在计算机上执行脚本
此命令将脚本发送到计算机,运行该脚本,并返回捕获的输出。
New-AzConnectedMachineRunCommand -ResourceGroupName "myRG" -MachineName "myMachine" -Location "chinaeast2" -RunCommandName "RunCommandName" -SourceScript "echo Hello World!"
注意
可以在参数中添加 -SourceScript 多个命令。 使用;分隔每个命令。 例如:-SourceScript "id; echo Hello World!"
使用存储中的脚本文件在计算机上执行脚本
此命令将 Connected Machine 代理定向到一个包含已上传脚本的存储 Blob 的共享访问签名(SAS) URI。 然后,它会指示代理执行脚本并返回捕获的输出。
New-AzConnectedMachineRunCommand -ResourceGroupName "MyRG0" -MachineName "MyMachine" -RunCommandName "MyRunCommand" -Location "chinaeast2" -SourceScriptUri "< SAS URI of a storage blob with read access or public URI>"
注意
scriptUri这是存储 Blob 的共享访问签名(SAS)URI,它必须提供对 Blob 的读取访问权限。 SAS URI 建议过期时间为 24 小时。 可以使用 blob 选项在 Azure 门户中生成 SAS URI,也可以使用 New-AzStorageBlobSASToken 生成 SAS 令牌。 如果使用New-AzStorageBlobSASToken生成 SAS 令牌,则 SAS URI 格式为:base blob URL + "?" + 来自New-AzStorageBlobSASToken的 SAS 令牌。
列出计算机上所有已部署的 Run 命令资源
此命令返回先前部署的运行命令及其属性的完整列表。
Get-AzConnectedMachineRunCommand -ResourceGroupName "myRG" -MachineName "myMachine"
获取执行状态和结果
此命令检索 Run 命令的当前执行进度,包括最新的输出、开始和结束时间、退出代码和执行的终端状态。
Get-AzConnectedMachineRunCommand -ResourceGroupName "myRG" -MachineName "myMachine" -RunCommandName "RunCommandName"
通过实例视图获取运行命令的状态信息
此命令获取具有实例视图的计算机上的“运行”命令的状态信息。 实例视图包含 Run 命令(成功、失败等)的执行状态、退出代码、标准输出和执行脚本生成的标准错误。 非零退出代码表示执行失败。
Get-AzConnectedMachineRunCommand -ResourceGroupName "MyRG" -MachineName "MyMachine" -RunCommandName "MyRunCommand"
除了其他信息外,响应还返回以下字段:
-
InstanceViewExecutionState:指示脚本是否成功。 -
ProvisioningState:指示扩展平台是否能够触发 Run 命令脚本。
在计算机上创建或更新运行命令
该命令在计算机上创建或更新 Run 命令,并将标准输出和标准错误消息传输到输出和错误 AppendBlobs。
New-AzConnectedMachineRunCommand -ResourceGroupName "MyRG0" -MachineName "MyMachine" -RunCommandName "MyRunCommand3" -Location "chinaeast2" -SourceScript "id; echo HelloWorld" -OutputBlobUri <OutPutBlobUrI> -ErrorBlobUri <ErrorBlobUri>
注意
输出和错误 Blob 必须是 AppendBlob 类型,其 SAS URI 必须提供对 Blob 的读取、追加、创建和写入访问权限。 SAS URI 建议过期时间为 24 小时。 如果输出或错误 Blob 不存在,则会创建一个 AppendBlob 类型的 Blob。 可以使用 blob 的选项在 Azure 门户中生成 SAS URI,也可以使用 New-AzStorageBlobSASToken 生成 SAS 令牌。
以其他用户身份在计算机上创建或更新运行命令
此命令使用 RunAsUser 和 RunAsPassword 参数以其他用户身份在计算机上创建或更新 Run 命令。
使用此命令之前:
- 请与计算机的管理员联系,并确保用户有权访问计算机。
- 确保用户有权访问 Run 命令访问的资源,例如目录、文件和网络资源。
- 在Windows计算机上,确保“辅助登录”正在运行。
New-AzConnectedMachineRunCommand -ResourceGroupName "MyRG0" -MachineName "MyMachine" -RunCommandName "MyRunCommand" -Location "chinaeast2" -SourceScript "id; echo HelloWorld" -RunAsUser myusername -RunAsPassword mypassword
在具有本地脚本文件的计算机上创建或更新 Run 命令
此命令通过使用运行 cmdlet 的客户端计算机上的本地脚本文件,在目标计算机上创建或更新运行命令。
New-AzConnectedMachineRunCommand -ResourceGroupName "MyRG0" -MachineName "MyMachine" -RunCommandName "MyRunCommand" -Location "chinaeast2" -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1"
在将敏感输入传递到脚本时在计算机上创建或更新 Run 命令
此命令创建或更新 Run 命令,该命令指定 ProtectedParameter 用于将敏感输入传递给脚本,例如密码或密钥。
$privateParametersArray = @{name='inputText';value='privateParam1value'}
New-AzConnectedMachineRunCommand -MachineName "MyMachine" -ResourceGroupName "MyRG0" -RunCommandName "MyRunCommand" -Location "chinaeast2" -SourceScriptUri <SourceScriptUri> -ProtectedParameter $privateParametersArray
用于捕获 inputText 的示例脚本:
param ([string]$inputText)
Write-Output $inputText
也可以使用类似的方式 Parameter传递公共参数。
在 Windows 上:参数和 ProtectedParameter 被传递给类似于以下示例的脚本:
myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value对于 Linux:
Parameter被命名,其值设置为环境配置,应该可以在 PowerShell 脚本中访问。 对于没有名称的参数,请将空字符串传递给名称输入。 无名称参数传递给类似于以下示例的脚本:myscript.sh publicParam1value publicParam2value secret1value secret2value
从计算机中删除“运行”命令资源
此命令删除以前部署在计算机上的 Run 命令资源。 如果脚本执行仍在进行中,则执行将终止。
Remove-AzConnectedMachineRunCommand -ResourceGroupName "myRG" -MachineName "myMachine" -RunCommandName "RunCommandName"
限制对“运行”命令的访问(预览版)
虽然 Run 命令启用的远程访问降低了在虚拟机(VM)上执行某些任务的开销,但也可以限制远程访问。
使用Azure基于角色的访问控制(Azure RBAC)管理对“运行”命令的访问
使用 Azure RBAC 来控制哪些用户可以使用 Run 命令执行命令和脚本。
下表描述了运行命令操作、执行操作所需的权限以及授予权限的 RBAC 角色。
| Action | 许可 | 具有权限的 RBAC |
|---|---|---|
| 列出“运行”命令或显示命令的详细信息 | Microsoft.HybridCompute/machines/runCommands/read |
内置 读者 角色及更高版本 |
| 运行命令 | Microsoft.HybridCompute/machines/runCommands/write |
Azure Connected Machine Resource Administrator 角色及更高角色 |
若要控制对 Run 命令功能的访问,请使用其中一个 内置角色 或创建自定义 角色 来授予 Run 命令权限。
在本地阻止运行命令
通过将 Run 命令扩展添加到允许列表(包括)或阻止列表(排除),您可以控制 Connected Machine 代理是否允许通过 Run 命令访问 VM。
有关详细信息,请参阅 扩展允许列表和阻止列表。
以下示例将 Run 命令扩展添加到 Windows VM 上的块列表中:
azcmagent config set extensions.blocklist "microsoft.cplat.core/runcommandhandlerwindows"
此示例将 Run 命令扩展添加到 Linux VM 上的允许列表:
azcmagent config set extensions.allowlist "microsoft.cplat.core/runcommandhandlerlinux"
后续步骤
若要了解如何使用“运行”命令,请参阅以下资源: