관리형 실행 명령을 사용하여 Windows VM에서 스크립트 실행
적용 대상: ✔️ Windows VM ✔️ 유연한 확장 집합
Important
관리형 실행 명령은 현재 Azure CLI, PowerShell 및 API에서 사용할 수 있습니다. 포털 기능은 곧 제공될 예정입니다.
명령 실행 기능은 VM(가상 머신) 에이전트를 사용하여 Azure Windows VM 내에서 스크립트를 실행합니다. 이러한 스크립트는 일반 머신 또는 애플리케이션 관리에 사용할 수 있습니다. 이를 통해 VM 액세스 및 네트워크 문제를 신속하게 진단 및 수정하고 VM을 정상 상태로 되돌릴 수 있습니다.
업데이트된 관리형 실행 명령은 동일한 VM 에이전트 채널을 사용하여 스크립트를 실행하고 원래 작업 지향 실행 명령에 비해 다음과 같은 향상된 기능을 제공합니다.
- ARM 배포 템플릿을 통해 업데이트된 실행 명령 지원
- 여러 스크립트의 병렬 실행
- 스크립트의 순차적 실행
- 사용자 지정 스크립트 시간 초과
- 장기 실행(시간/일) 스크립트 지원
- 안전한 방식으로 비밀(매개 변수, 암호) 전달
필수 조건
Windows OS 지원
Windows OS | x64 |
---|---|
Windows 10 | 지원됨 |
Windows 11 | 지원됨 |
Windows Server 2008 SP2 | 지원됨 |
Windows Server 2008 R2 | 지원됨 |
Windows Server 2012 | 지원됨 |
Windows Server 2012 R2 | 지원됨 |
Windows Server 2016 | 지원됨 |
Windows Server 2016 Core | 지원됨 |
Windows Server 2019 | 지원됨 |
Windows Server 2019 Core | 지원됨 |
Windows Server 2022 | 지원됨 |
Windows Server 2022 Core | 지원됨 |
명령 실행에 대한 액세스 제한
실행 명령을 나열하거나 명령의 세부 정보를 표시하려면 구독 수준에서 Microsoft.Compute/locations/runCommands/read
권한이 필요합니다. 기본 제공 Reader 역할 및 상위 수준에 이 권한이 있습니다.
명령을 실행하려면 Microsoft.Compute/virtualMachines/runCommand/write
권한이 필요합니다. Virtual Machine 기여자 역할 및 상위 수준에 이 권한이 있습니다.
기본 제공 역할 중 하나를 사용하거나 사용자 지정 역할을 생성하여 실행 명령을 사용할 수 있습니다.
Azure CLI
다음 예제는 az vm run-command 명령을 사용하여 Azure Windows VM에서 셸 스크립트를 실행합니다.
VM을 사용하여 스크립트 실행
이 명령은 VM에 스크립트를 전달하고, 실행하고, 캡처된 출력을 반환합니다.
az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "Write-Host Hello World!"
VM에 배포된 모든 RunCommand 리소스 나열
이 명령은 속성과 함께 이전에 배포된 실행 명령의 전체 목록을 반환합니다.
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 리소스 삭제
이전에 VM에 배포된 RunCommand 리소스를 제거합니다. 스크립트 실행이 아직 진행 중인 경우 실행이 종료됩니다.
az vm run-command delete --name "myRunCommand" --vm-name "myVM" --resource-group "myRG"
PowerShell
VM을 사용하여 스크립트 실행
이 명령은 VM에 스크립트를 전달하고, 실행하고, 캡처된 출력을 반환합니다.
Set-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -Location "EastUS" -RunCommandName "RunCommandName" –SourceScript "echo Hello World!"
SourceScriptUri 매개 변수를 사용하여 VM에서 스크립트 실행
OutputBlobUri
및 ErrorBlobUri
는 선택적 매개 변수입니다.
Set-AzVMRunCommand -ResourceGroupName "myRg" `
-VMName "myVM" `
-RunCommandName "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>”
VM에 배포된 모든 RunCommand 리소스 나열
이 명령은 속성과 함께 이전에 배포된 실행 명령의 전체 목록을 반환합니다.
Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM"
실행 상태 및 결과 가져오기
이 명령은 실행의 최신 출력, 시작/종료 시간, 종료 코드 및 터미널 상태를 포함하여 현재 실행 진행률을 검색합니다.
Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName" -Expand InstanceView
SourceScriptUri를 사용하여 VM에서 실행 명령 만들기 또는 업데이트(스토리지 Blob SAS URL)
PowerShell 스크립트가 포함된 스토리지 Blob의 SAS URL을 사용하여 Windows VM에서 실행 명령을 만들거나 업데이트합니다. SourceScriptUri
는 스토리지 BLOB의 전체 SAS URL 또는 공용 URL일 수 있습니다.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>
참고 항목
SAS URL은 Blob에 대한 읽기 액세스를 제공해야 합니다. SAS URL에 대해 만료 시간은 24시간이 좋습니다. SAS URL은 Blob의 옵션을 사용하여 Azure Portal에 또는 New-AzStorageBlobSASToken
을 사용하여 SAS 토큰에 생성할 수 있습니다. New-AzStorageBlobSASToken
을 사용하여 SAS 토큰을 생성하는 경우 SAS URL은 “기본 Blob URL” + “?” + “New-AzStorageBlobSASToken
의 SAS 토큰”입니다.
실행 명령을 만들거나 업데이트한 후 VM에 대한 실행 명령 인스턴스 보기 가져오기
인스턴스 보기를 사용하여 VM에 대한 실행 명령을 가져옵니다. 인스턴스 보기에는 실행 명령을 사용하여 스크립트를 실행하여 생성된 실행 명령의 실행 상태(성공, 실패 등), 종료 코드, 표준 출력 및 표준 오류가 포함됩니다. 0이 아닌 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
: 일반 확장 프로비전 종단 간 상태(확장 플랫폼이 실행 명령 스크립트를 트리거할 수 있는지 여부).
ScriptLocalPath를 사용하여 VM에서 실행 명령 만들기 또는 업데이트(로컬 스크립트 파일)
cmdlet이 실행되는 클라이언트 컴퓨터에 있는 로컬 스크립트 파일을 사용하여 VM에서 실행 명령을 만들거나 업데이트합니다.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1"
SourceScript를 사용하여 VM에서 실행 명령 만들기 또는 업데이트(스크립트 텍스트)
스크립트 콘텐츠를 -SourceScript 매개 변수에 직접 전달하여 VM에서 실행 명령을 만들거나 업데이트합니다. ;
를 사용하여 여러 명령 구분
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand2 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"
SourceCommandId를 사용하여 VM에서 실행 명령 만들기 또는 업데이트
기존 commandId를 사용하여 VM에서 실행 명령을 만들거나 업데이트합니다. Get-AzVMRunCommandDocument를 사용하여 사용 가능한 commandId를 검색할 수 있습니다.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceCommandId DisableWindowsUpdate
OutputBlobUri, ErrorBlobUri를 사용하여 VM에서 실행 명령을 만들거나 업데이트하여 표준 출력 및 표준 오류 메시지를 출력 및 오류 추가 Blob으로 스트리밍
VM에서 실행 명령을 만들거나 업데이트하고 표준 출력 및 표준 오류 메시지를 출력 및 오류 추가 Blob으로 스트리밍합니다.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1" -OutputBlobUri <OutPutBlobUrI> -ErrorBlobUri "ErrorBlobUri
참고 항목
출력 및 오류 Blob은 AppendBlob 형식이어야 하고 해당 SAS URL은 Blob에 대한 읽기, 추가, 만들기, 쓰기 액세스를 제공해야 합니다. SAS URL에 대해 만료 시간은 24시간이 좋습니다. 출력 또는 오류 Blob이 없는 경우 AppendBlob 형식의 Blob이 만들어집니다. SAS URL은 Blob의 옵션을 사용하여 Azure Portal에 또는 New-AzStorageBlobSASToken
을 사용하여 SAS 토큰에 생성할 수 있습니다.
RunAsUser 및 RunAsPassword 매개 변수를 사용하여 다른 사용자로 VM에서 실행 명령 만들기 또는 업데이트
RunAsUser
및 RunAsPassword
매개 변수를 사용하여 다른 사용자로 VM에서 실행 명령을 만들거나 업데이트합니다. RunAs가 제대로 작동하려면 VM 관리자에게 연락해서 사용자가 VM에 추가되었고, 사용자는 실행 명령으로 액세스하는 리소스(디렉터리, 파일, 네트워크 등)에 대한 액세스 권한이 있고 Windows VM의 경우 VM에서’보조 로그온’ 서비스가 VM에서 실행되고 있는지 확인합니다.
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1" -RunAsUser myusername -RunAsPassword mypassword
SourceScriptUri(스토리지 Blob SAS URL)를 사용하여 가상 머신 확장 집합 리소스에서 실행 명령 만들기 또는 업데이트
PowerShell 스크립트가 포함된 스토리지 Blob의 SAS URL을 사용하여 Windows Virtual Machine Scale Sets 리소스에서 실행 명령을 만들거나 업데이트합니다.
Set-AzVmssVMRunCommand -ResourceGroupName MyRG0 -VMScaleSetName MyVMSS -InstanceId 0 -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>
참고 항목
SAS URL은 Blob에 대한 읽기 액세스를 제공해야 합니다. SAS URL에 대해 만료 시간은 24시간이 좋습니다. SAS URL은 Blob의 옵션을 사용하여 Azure Portal에 또는 New-AzStorageBlobSASToken
을 사용하여 SAS 토큰에 생성할 수 있습니다. New-AzStorageBlobSASToken
을 사용하여 SAS 토큰을 생성하는 경우 SAS URL 형식은 기본 Blob URL + “?” + New-AzStorageBlobSASToken
의 SAS 토큰입니다.
Parameter 및 ProtectedParameter 매개 변수를 사용하여 VM 인스턴스에서 실행 명령 만들기 또는 업데이트(스크립트에 대한 공용 및 보호 매개 변수)
ProtectedParameter를 사용하여 암호, 키 등과 같은 스크립트에 중요한 입력을 전달합니다.
$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 EastUS2EUAP -SourceScriptUri <SourceScriptUri> -Parameter $PublicParametersArray -ProtectedParameter $ProtectedParametersArray
Windows: 인수가 스크립트에 전달되고
myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value
와 같이 실행될 때 Parameters 및 ProtectedParameters가 스크립트에 전달됩니다.Linux: Named Parameters와 해당 값은 .sh 스크립트 내에서 액세스할 수 있어야 하는 환경 구성으로 설정됩니다. Nameless 인수의 경우 빈 문자열을 이름 입력으로 전달합니다. Nameless 인수는 스크립트로 전달되고
myscript.sh publicParam1value publicParam2value secret1value secret2value
와 같이 실행됩니다.
VM에서 RunCommand 리소스 삭제
이전에 VM에 배포된 RunCommand 리소스를 제거합니다. 스크립트 실행이 아직 진행 중인 경우 실행이 종료됩니다.
Remove-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName"
REST API
새 실행 명령을 배포하려면 VM에서 PUT을 직접 실행하고 명령 실행 인스턴스의 고유한 이름을 지정합니다.
PUT /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2023-03-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,
"treatFailureAsDeploymentFailure": true,
"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입니다.
- 하나의 명령 실행에 대해 하나의 원본 입력 형식만 지원됩니다.
- API 버전 2023-03-01부터
treatFailureAsDeploymentFailure
속성을 true로 설정하여 스크립트에 오류가 있을 때 배포가 실패하도록 할 수 있습니다. false로 설정하면 ProvisioningState는 확장 플랫폼에서 실행 명령이 실행되었는지 아닌지 여부만 반영합니다. 스크립트 오류가 발생한 경우 스크립트의 실패 여부를 나타내지 않습니다. - Run Command는 큰 스크립트 출력을 저장하는 데 사용할 수 있는 outputBlobUri 및 errorBlobUri 매개 변수를 사용하여 Storage Blob에 출력 및 오류를 쓸 수 있도록 지원합니다. 읽기, 추가, 만들기, 쓰기 액세스 권한이 있는 스토리지 추가 Blob의 SAS URI를 사용합니다. Blob은 AppendBlob 형식이어야 합니다. 스크립트 출력 또는 오류 Blob을 작성하지 않으면 실패합니다. Blob이 이미 있는 경우 덮어씁니다. 없는 경우 만들어집니다.
VM에서 실행 명령의 실행 인스턴스 나열
GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2023-03-01
특정 실행 명령 배포에 대한 출력 세부 정보 가져오기
GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?$expand=instanceView&api-version=2023-03-01
특정 실행 명령 배포 삭제
실행 명령의 인스턴스를 삭제할 수도 있습니다.
DELETE /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2023-03-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": "Write-Host 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":"2023-03-01",
"location":"[parameters('location')]",
"dependsOn":[
"[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
],
"properties":{
"source":{
"script":"Write-Host 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에서 스크립트 및 명령을 원격으로 실행하는 다른 방법에 대해 알아보려면 Windows VM에서 스크립트 실행을 참조하세요.