使用執行命令從遠端安全地設定伺服器 (預覽)
已啟用 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 機器上執行殼層指令碼。
在 VM 上執行指令碼
此命令會將指令碼傳遞至機器並執行,然後傳回擷取的輸出。
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
在 VM 上執行指令碼
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 權杖」
在建立或更新「執行命令」後,取得機器的「執行命令」執行個體檢視
透過執行個體檢視取得 VM 的執行命令。 執行個體檢視包含「執行命令」的執行狀態 (成功、失敗等等)、結束代碼、標準輸出,以及使用「執行命令」執行指令碼所產生的標準錯誤。 非零的 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
參數,以不同使用者身分在機器上建立或更新「執行命令」。 若要讓 RunAs 正常運作,請連絡機器的管理員,並確定已在機器上新增使用者、使用者有權存取「執行命令」所存取的資源 (目錄、檔案、網路等等),且若是使用 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 的伺服器上的執行命令支援下列作業:
作業 | 描述 |
---|---|
建立 | 建立執行命令的作業。 這會執行「執行命令」。 |
刪除 | 刪除執行命令的作業。 刪除執行時,也會停止執行命令。 |
取得 Yammer | 取得執行命令的作業。 |
清單 | 取得已啟用 Azure Arc 的伺服器所有執行命令的作業。 |
更新 | 更新執行命令的作業。 這會停止先前的執行命令。 |
注意
每當執行命令指令碼執行時,都會覆寫輸出和錯誤 Blob。
範例案例
假設您在訂用帳戶識別碼為 "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" 的資源群組 "ContosoRG" 中有一個已啟用 Azure Arc 的伺服器,名為 "2012DatacenterServer1"。 假設您需要提供對 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"