你当前正在访问 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 参数在计算机上执行脚本

可选参数为 OutputBlobUriErrorBlobUri

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 参数以其他用户的身份在计算机上创建或更新运行命令

使用RunAsUserRunAsPassword参数以其他用户的身份在计算机上创建或更新运行命令。 若要使运行方式正常工作,请与计算机管理员联系,并确保在计算机上添加用户、用户有权访问由运行命令访问的资源(目录、文件、网络等),并且(在 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"