你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用运行命令以远程方式安全地配置服务器(预览版)
已启用 Azure Arc 的服务器上的运行命令(公共预览版)使用 Connected Machine 代理来支持你在服务器中以远程方式安全地运行脚本。 这对于故障排除、恢复、诊断和维护等各种方案非常有用。
支持的环境和配置
体验:当前通过 Azure CLI 和 PowerShell 支持运行命令。
操作系统:运行命令支持 Windows 和 Linux 操作系统。
环境:运行命令支持非 Azure 环境,包括本地、VMware、SCVMM、AWS、GCP 和 OCI。
成本:运行命令是免费的,但 Azure 中的脚本存储可能会产生计费。
配置:运行命令不需要更多配置或部署任何扩展。 Connected Machine 代理版本必须为 1.33 或更高版本。
使用 RBAC 限制对运行命令的访问
列出运行命令或显示某个命令的详细信息需要Microsoft.HybridCompute/machines/runCommands/read
权限。 内置读者角色和更高级别具有此权限。
运行命令需要 Microsoft.HybridCompute/machines/runCommands/write
权限。 Azure Connected Machine 资源管理员角色和更高级别具有此权限。
若要使用“运行命令”,可以使用内置角色之一,也可以创建一个自定义角色。
阻止在本地运行命令
Connected Machine 代理支持本地配置,允许设置允许列表或阻止列表。 请参阅扩展允许列表和阻止列表以了解详细信息。
对于 Windows:
azcmagent config set extensions.blocklist "microsoft.cplat.core/runcommandhandlerwindows"
对于 Linux:
azcmagent config set extensions.blocklist "microsoft.cplat.core/runcommandhandlerlinux"
Azure CLI
以下示例使用az connectedmachine run-command在 Azure Windows 计算机上运行 shell 脚本。
在计算机上执行脚本
此命令将脚本传送到计算机进行执行并返回捕获的输出。
az connectedmachine run-command create --name "myRunCommand" --machine-name "myMachine" --resource-group "myRG" --script "Write-Host Hello World!"
列出计算机上所有已部署的 RunCommand 资源
此命令返回先前部署的运行命令及其属性的完整列表。
az connectedmachine run-command list --machine-name "myMachine" --resource-group "myRG"
获取执行状态和结果
此命令检索当前执行进度,包括执行的最新输出、开始/结束时间、退出代码和终止状态。
az connectedmachine run-command show --name "myRunCommand" --machine-name "myMachine" --resource-group "myRG"
注意
instanceView
中的输出和错误字段限制为最后 4KB。 要访问完整的输出和错误,可以在执行运行命令时,使用-outputBlobUri
和-errorBlobUri
参数将输出和错误数据转发到存储追加 blob。
从计算机中删除 RunCommand 资源
删除先前部署在计算机上的 RunCommand 资源。 如果脚本执行仍在进行,将终止执行。
az connectedmachine run-command delete --name "myRunCommand" --machine-name "myMachine" --resource-group "myRG"
PowerShell
在计算机上执行脚本
New-AzConnectedMachineRunCommand -ResourceGroupName "myRG" -MachineName "myMachine" -Location "EastUS" -RunCommandName "RunCommandName" –SourceScript "echo Hello World!"
使用 SourceScriptUri 参数在计算机上执行脚本
可选参数为 OutputBlobUri
和 ErrorBlobUri
。
New-AzConnectedMachineRunCommand -ResourceGroupName -MachineName -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-AzConnectedMachineRunCommand -ResourceGroupName "myRG" -MachineName "myMachine"
获取执行状态和结果
此命令检索当前执行进度,包括执行的最新输出、开始/结束时间、退出代码和终止状态。
Get-AzConnectedMachineRunCommand -ResourceGroupName "myRG" - MachineName "myMachine" -RunCommandName "RunCommandName"
使用 SourceScriptURI(存储 blob SAS URL)在计算机上创建或更新运行命令
使用包含 PowerShell 脚本的存储 blob 的 SAS URL 在 Windows 计算机上创建或更新运行命令。 SourceScriptUri
可以是存储 blob 的完整 SAS URL 或公共 URL。
New-AzConnectedMachineRunCommand -ResourceGroupName MyRG0 -MachineName MyMachine -RunCommandName MyRunCommand -Location EastUS2EUAP -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 令牌"。
在创建或更新运行命令后,获取计算机的运行命令实例视图
获取具有实例视图的计算机的运行命令。 实例视图包含运行命令的执行状态(成功、失败等)、退出代码、标准输出和使用运行命令执行脚本生成的标准错误。 非零 ExitCode 表示执行失败。
Get-AzConnectedMachineRunCommand -ResourceGroupName MyRG -MachineName MyMachine -RunCommandName MyRunCommand
InstanceViewExecutionState
:用户的“运行命令”脚本的状态。 请查看此状态,了解脚本是否成功。
ProvisioningState
:常规扩展预配端到端状态(扩展平台是否能够触发“运行命令”脚本)。
使用 SourceScript(脚本文本)在计算机上创建或更新运行命令
在计算机上创建或更新运行命令,将脚本内容直接传递到-SourceScript
参数。 使用 ;
分隔多个命令。
New-AzConnectedMachineRunCommand -ResourceGroupName MyRG0 -MachineName MyMachine -RunCommandName MyRunCommand2 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"
使用 OutputBlobUri 和 ErrorBlobUri 在计算机上创建或更新运行命令,将标准输出和标准错误消息流式传输到输出和错误追加 blob
在计算机上创建或更新运行命令,并将标准输出和标准错误消息流式传输到输出和错误追加 blob。
New-AzConnectedMachineRunCommand -ResourceGroupName MyRG0 - MachineName MyMachine -RunCommandName MyRunCommand3 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"-OutputBlobUri <OutPutBlobUrI> -ErrorBlobUri <ErrorBlobUri>
注意
输出和错误 blob 的类型必须为 AppendBlob,并且其 SAS URL 必须提供对 blob 的读取、追加、创建和写入访问权限。 建议将 SAS URL 的过期时间设为 24 小时。 如果输出或错误 blob 不存在,则将创建 AppendBlob 类型的 blob。 可使用 blob 的选项在 Azure 门户上生成 SAS URL,也可使用New-AzStorageBlobSASToken
生成 SAS 令牌。
使用 RunAsUser 和 RunAsPassword 参数以其他用户的身份在计算机上创建或更新运行命令
使用RunAsUser
和RunAsPassword
参数以其他用户的身份在计算机上创建或更新运行命令。 若要使运行方式正常工作,请与计算机管理员联系,并确保在计算机上添加用户、用户有权访问由运行命令访问的资源(目录、文件、网络等),并且(在 Windows 计算机的情况下)计算机上正在运行“辅助登录”服务。
New-AzMachineRunCommand -ResourceGroupName MyRG0 -MachineName MyMachine -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScript "id; echo HelloWorld" -RunAsUser myusername -RunAsPassword mypassword
使用 SourceScriptURI(存储 blob SAS URL)在计算机资源上创建或更新运行命令
使用包含 PowerShell 脚本的存储 blob 的 SAS URL 在 Windows 计算机资源上创建或更新运行命令。
New-AzMachineRunCommand -ResourceGroupName MyRG0 -MachineName MyMachine -RunCommandName MyRunCommand -Location EastUS2EUAP -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 令牌。
使用 ScriptLocalPath(本地脚本文件)在计算机上创建或更新运行命令
使用执行 cmdlet 的客户端计算机上的本地脚本文件在计算机上创建或更新运行命令。
New-AzMachineRunCommand -ResourceGroupName MyRG0 -VMName MyMachine -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1"
使用 Parameter 和 ProtectedParameter 参数(脚本中的公共参数和受保护参数)在计算机实例上创建或更新运行命令
使用 ProtectedParameter 将任何敏感输入(例如密码、密钥)传递给脚本。
Windows:Parameter 和 ProtectedParameter 随着参数一并传递到脚本,并按如下方式运行:
myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value
Linux:命名参数及其值设置为环境配置,应该可在 .sh 脚本中访问它。 对于无名称参数,将空字符串传递给名称输入。 无名称参数将传递给脚本并按如下方式运行:
myscript.sh publicParam1value publicParam2value secret1value secret2value
从计算机中删除 RunCommand 资源
删除先前部署在计算机上的 RunCommand 资源。 如果脚本执行仍在进行,将终止执行。
Remove-AzConnetedMachineRunCommand -ResourceGroupName "myRG" -MachineName "myMachine" -RunCommandName "RunCommandName"
运行命令操作
在已启用 Azure Arc 的服务器上运行命令支持以下操作:
操作 | 说明 |
---|---|
创建 | 用于创建运行命令的操作。 这会运行该运行命令。 |
删除 | 用于删除运行命令的操作。 如果它正在运行,删除也会停止该运行命令。 |
Get | 用于获取运行命令的操作。 |
列出 | 用于获取已启用 Azure Arc 的服务器的所有运行命令的操作。 |
更新 | 用于更新运行命令的操作。 这会停止上一个运行命令。 |
注意
每次执行运行命令脚本时,都会覆盖输出和错误 Blob。
示例方案
假设你在订阅 ID 为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”的资源组“ContosoRG”中具有名为“2012DatacenterServer1”的已启用 Azure Arc 的服务器。 考虑需要提供对 Windows Server 2012 / R2 服务器终结点的远程访问权限。 访问由 Azure Arc 启用的扩展安全更新需要访问终结点 www.microsoft.com/pkiops/certs
。 需要远程配置防火墙规则,以支持访问此终结点。 使用“运行命令”以允许连接到此终结点。
示例 1:使用运行命令进行终结点访问
首先,创建运行命令脚本,以使用 PUT 操作提供对启用了 Arc 的目标服务器上 www.microsoft.com/pkiops/certs
终结点的访问权限。
要直接以内联方式提供脚本,请使用以下操作:
PUT https://management.azure.com/subscriptions/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/resourceGroups/ContosoRG/providers/Microsoft.HybridCompute/machines/2012DatacenterServer1/runCommands/EndpointAccessCommand?api-version=2023-10-03-preview
{
"location": "eastus2",
"properties": {
"source": {
"script": "New-NetFirewallRule -DisplayName $ruleName -Direction Outbound -Action Allow -RemoteAddress $endpoint -RemotePort $port -Protocol $protocol"
},
"parameters": [
{
"name": "ruleName",
"value": "Allow access to www.microsoft.com/pkiops/certs"
},
{
"name": "endpoint",
"value": "www.microsoft.com/pkiops/certs"
},
{
"name": "port",
"value": 433
},
{
"name": "protocol",
"value": "TCP"
}
],
"asyncExecution": false,
"runAsUser": "contoso-user1",
"runAsPassword": "Contoso123!"
"timeoutInSeconds": 3600,
"outputBlobUri": "https://mystorageaccount.blob.core.windows.net/myscriptoutputcontainer/MyScriptoutput.txt",
"errorBlobUri": "https://mystorageaccount.blob.core.windows.net/mycontainer/MyScriptError.txt"
}
}
要改为链接到脚本文件,可以使用“运行命令”操作的“ScriptURI”选项。 为此,假设你已准备好包含该内联脚本的 newnetfirewallrule.ps1
文件,并已将此脚本上传到 Blob 存储。
PUT https://management.azure.com/subscriptions/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/resourceGroups/ContosoRG/providers/Microsoft.HybridCompute/machines/2012DatacenterServer1/runCommands/EndpointAccessCommand?api-version=2023-10-03-preview
{
"location": "eastus2",
"properties": {
"source": {
"scriptUri": "https://mystorageaccount.blob.core.windows.net/myscriptoutputcontainer/newnetfirewallrule.ps1"
},
"parameters": [
{
"name": "ruleName",
"value": " Allow access to www.microsoft.com/pkiops/certs"
},
{
"name": "endpoint",
"value": "www.microsoft.com/pkiops/certs"
},
{
"name": "port",
"value": 433
},
{
"name": "protocol",
"value": "TCP"
}
],
"asyncExecution": false,
"runAsUser": "contoso-user1",
"runAsPassword": "Contoso123!"
"timeoutInSeconds": 3600,
"outputBlobUri": "https://mystorageaccount.blob.core.windows.net/myscriptoutputcontainer/MyScriptoutput.txt",
"errorBlobUri": "https://mystorageaccount.blob.core.windows.net/mycontainer/MyScriptError.txt"
}
}
SAS URL 必须提供对 blob 的读取访问权限。 建议 SAS URL 的过期时间为 24 小时。 可使用 blob 选项在 Azure 门户上生成 SAS URL,也可使用 New-AzStorageBlobSASToken
生成 SAS 令牌。 如果使用 New-AzStorageBlobSASToken
生成 SAS 令牌,则 SAS URL 格式为:base blob URL + "?"
+ 来自 New-AzStorageBlobSASToken
的 SAS 令牌。
输出和错误 blob 的类型必须为 AppendBlob,并且其 SAS URL 必须提供对 blob 的读取、追加、创建和写入访问权限。 建议将 SAS URL 的过期时间设为 24 小时。 可使用 blob 的选项在 Azure 门户上生成 SAS URL,也可使用New-AzStorageBlobSASToken
生成 SAS 令牌。
示例 2:获取运行命令详细信息
要验证是否已正确预配运行命令,请使用 GET 命令检索预配的运行命令的详细信息:
GET https://management.azure.com/subscriptions/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/resourceGroups/ContosoRG/providers/Microsoft.HybridCompute/machines/2012DatacenterServer1/runCommands/EndpointAccessCommand?api-version=2023-10-03-preview
示例 3:更新运行命令
假设你想要打开对其他终结点 *.waconazure.com
的访问权限,以建立与 Windows Admin Center 的连接。 可以使用新参数更新现有的运行命令:
PATCH https://management.azure.com/subscriptions/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/resourceGroups/ContosoRG/providers/Microsoft.HybridCompute/machines/2012DatacenterServer1/runCommands/EndpointAccessCommand?api-version=2023-10-03-preview
{
"location": "eastus2",
"properties": {
"source": {
"script": "New-NetFirewallRule -DisplayName $ruleName -Direction Outbound -Action Allow -RemoteAddress $endpoint -RemotePort $port -Protocol $protocol"
},
"parameters": [
{
"name": "ruleName",
"value": "Allow access to WAC endpoint"
},
{
"name": "endpoint",
"value": "*.waconazure.com"
},
{
"name": "port",
"value": 433
},
{
"name": "protocol",
"value": "TCP"
}
],
"asyncExecution": false,
"runAsUser": "contoso-user1",
"runAsPassword": "Contoso123!",
"timeoutInSeconds": 3600,
"outputBlobUri": "https://mystorageaccount.blob.core.windows.net/myscriptoutputcontainer/MyScriptoutput.txt",
"errorBlobUri": "https://mystorageaccount.blob.core.windows.net/mycontainer/MyScriptError.txt"
}
}
示例 4:列出运行命令
在删除终结点访问的运行命令之前,请确保对已启用 Arc 的服务器没有其他运行命令。 可以使用列表命令获取所有运行命令:
LIST https://management.azure.com/subscriptions/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/resourceGroups/ContosoRG/providers/Microsoft.HybridCompute/machines/2012DatacenterServer1/runCommands/
示例 5:删除运行命令
如果不再需要运行命令扩展,可以使用以下命令将其删除:
DELETE https://management.azure.com/subscriptions/ aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/resourceGroups/ContosoRG/providers/Microsoft.HybridCompute/machines/2012DatacenterServer1/runCommands/EndpointAccessCommand?api-version=2023-10-03-preview
禁用“运行命令”
若要在已启用 Azure Arc 的服务器上禁用“运行命令”,请打开管理命令提示符并运行以下命令。 这些命令使用扩展阻止列表中的 Connected Machine 代理的本地代理配置功能。
Windows
azcmagent config set extensions.blocklist "microsoft.cplat.core/runcommandhandlerwindows"
Linux
sudo azcmagent config set extensions.blocklist "microsoft.cplat.core/runcommandhandlerlinux"