관리형 실행 명령을 사용하여 Linux VM에서 스크립트 실행

적용 대상: ✔️ Linux VM ✔️ 유연한 확장 집합

Important

관리형 실행 명령은 현재 Azure CLI, PowerShell 및 API에서 사용할 수 있습니다. 포털 기능은 곧 제공될 예정입니다.

명령 실행 기능은 VM(가상 머신) 에이전트를 사용하여 Azure Linux VM 내에서 스크립트를 실행합니다. 이러한 스크립트는 일반 머신 또는 애플리케이션 관리에 사용할 수 있습니다. 이를 통해 VM 액세스 및 네트워크 문제를 신속하게 진단 및 수정하고 VM을 정상 상태로 되돌릴 수 있습니다.

업데이트된 관리형 실행 명령은 동일한 VM 에이전트 채널을 사용하여 스크립트를 실행하고 원래 작업 지향 실행 명령에 비해 다음과 같은 향상된 기능을 제공합니다.

  • ARM 배포 템플릿을 통해 업데이트된 실행 명령 지원
  • 여러 스크립트의 병렬 실행
  • 스크립트의 순차적 실행
  • 사용자 지정 스크립트 시간 초과
  • 장기 실행(시간/일) 스크립트 지원
  • 안전한 방식으로 비밀(매개 변수, 암호) 전달

필수 조건

Important

지원되는 최소 Linux 게스트 에이전트는 버전 2.4.0.2이며 이전 버전은 Managed RunCommand를 지원하지 않습니다.

지원되는 Linux 배포판

Linux 배포판 x64 ARM64
Alma Linux 9.x+ 지원되지 않음
Debian 10개 이상 지원되지 않음
Flatcar Linux 3374.2.x+ 지원되지 않음
Azure Linux 2.x 지원되지 않음
openSUSE 12.3+ 지원되지 않음
Oracle Linux 6.4+, 7.x+, 8.x+ 지원되지 않음
Red Hat Enterprise Linux 6.7+, 7.x+, 8.x+ 지원되지 않음
Rocky Linux 9.x+ 지원되지 않음
SLES 12.x+, 15.x+ 지원되지 않음
Ubuntu 18.04+, 20.04+, 22.04+ 지원되지 않음

명령 실행에 대한 액세스 제한

실행 명령을 나열하거나 명령의 세부 정보를 표시하려면 구독 수준에서 Microsoft.Compute/locations/runCommands/read 권한이 필요합니다. 기본 제공 Reader 역할 및 상위 수준에 이 권한이 있습니다.

명령을 실행하려면 Microsoft.Compute/virtualMachines/runCommand/write 권한이 필요합니다. Virtual Machine 기여자 역할 및 상위 수준에 이 권한이 있습니다.

기본 제공 역할 중 하나를 사용하거나 사용자 지정 역할을 생성하여 실행 명령을 사용할 수 있습니다.

Azure CLI

다음 예제는 az vm run-command 명령을 사용하여 Azure Linux VM에서 셸 스크립트를 실행합니다.

VM을 사용하여 스크립트 실행

이 명령은 VM에 스크립트를 전달하고, 실행하고, 캡처된 출력을 반환합니다.

az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "echo 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에서 스크립트 실행

OutputBlobUriErrorBlobUri는 선택적 매개 변수입니다.

Set-AzVMRunCommand -ResourceGroupName -VMName -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일 수 있습니다.

참고 항목

SAS URL은 Blob에 대한 읽기 권한을 제공해야 합니다. SAS URL의 만료 시간은 24시간이 권장됩니다. SAS URL은 Blob의 옵션을 사용하여 Azure Portal에서 생성하거나 또는 New-AzStorageBlobSASToken을 사용하여 SAS 토큰에서 생성할 수 있습니다. New-AzStorageBlobSASToken을 사용하여 SAS 토큰을 생성하는 경우 SSAS URL은 "기본 Blob URL" + "?" + "New-AzStorageBlobSASToken의 SAS 토큰"입니다.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptURI>

실행 명령을 만들거나 업데이트한 후 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 - 일반 확장 프로비전 종단 간 상태(확장 플랫폼이 실행 명령 스크립트를 트리거할 수 있는지 여부)입니다.

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 ipconfig

OutputBlobUri, ErrorBlobUri를 사용하여 VM에서 실행 명령을 만들거나 업데이트하여 표준 출력 및 표준 오류 메시지를 출력 및 오류 추가 Blob으로 스트리밍

VM에서 실행 명령을 만들거나 업데이트하고 표준 출력 및 표준 오류 메시지를 출력 및 오류 추가 Blob으로 스트리밍합니다.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location EastUS2EUAP EastUS2EUAP -SourceScriptUri <SourceScriptUri> -OutputBlobUri <OutputBlobUri> -ErrorBlobUri <errorbloburi>

참고 항목

출력 및 오류 Blob은 AppendBlob 형식이어야 하고 해당 SAS URL은 Blob에 대한 읽기, 추가, 만들기, 쓰기 권한을 제공해야 합니다. SAS URL의 만료 시간은 24시간이 권장됩니다. 출력 또는 오류 Blob이 없는 경우 AppendBlob 형식의 Blob이 만들어집니다. SAS URL은 Blob의 옵션을 사용하여 Azure Portal에서 생성하거나 또는 New-AzStorageBlobSASToken을 사용하여 SAS 토큰에서 생성할 수 있습니다. New-AzStorageBlobSASToken을 사용하여 SAS 토큰을 생성하는 경우 SAS URL은 기본 Blob URL + "?" + New-AzStorageBlobSASToken의 SAS 토큰입니다.

VM에서 실행 명령 만들기 또는 업데이트하고 RunAsUser 및 RunAsPassword 매개 변수를 사용하여 다른 사용자로 실행 명령을 실행합니다.

VM에서 실행 명령 만들거나 업데이트하고 RunAsUserRunAsPassword 매개 변수를 사용하여 다른 사용자로 실행 명령을 실행합니다. RunAs가 제대로 작동하려면 VM의 관리자에게 문의하여 사용자가 VM에 추가되었는지, 사용자가 실행 명령(디렉터리, 파일, 네트워크 등)으로 액세스하는 리소스에 액세스할 수 있는지, Windows VM의 경우 VM에서 ‘보조 로그온’ 서비스가 실행되고 있는지 확인합니다.

Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP EastUS2EUAP -SourceScriptUri <SourceScriptUri> -RunAsUser myusername -RunAsPassword mypassword

SourceScriptUri(스토리지 Blob SAS URL)를 사용하여 Virtual Machine Scale Sets 리소스에서 실행 명령을 만들거나 업데이트합니다.

Bash 스크립트가 포함된 스토리지 Blob의 SAS URL을 사용하여 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 토큰을 생성하는 경우 SSAS URL은 "기본 Blob URL" + "?" + New-AzStorageBlobSASToken의 SAS 토큰입니다.

Parameter 및 ProtectedParameter 매개 변수를 사용하여 VM 인스턴스에서 실행 명령 만들기 또는 업데이트(스크립트에 대한 퍼블릭 및 보호된 매개 변수)

$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

ProtectedParameter를 사용하여 암호, 키 등과 같은 스크립트에 중요한 입력을 전달합니다.

  • Windows: 인수가 스크립트에 전달되고 이 myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value와 같이 실행될 때 Parameters 및 ProtectedParameters가 스크립트에 전달됩니다.
  • Linux: 명명된 매개 변수와 매개 변수 값은 .sh 스크립트 내에서 액세스할 수 있어야 하는 환경 구성으로 설정됩니다. 이름 없는 인수의 경우 빈 문자열을 이름 입력으로 전달합니다. Nameless 인수는 스크립트로 전달되고 myscript.sh publicParam1value publicParam2value secret1value secret2value와 같이 실행됩니다.

VM에서 RunCommand 리소스 삭제

이전에 VM에 배포된 RunCommand 리소스를 제거합니다. 스크립트 실행이 아직 진행 중인 경우 실행이 종료됩니다.

Remove-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName"

REST API

새 실행 명령을 배포하려면 VM에서 PUT을 직접 실행하고 명령 실행 인스턴스의 고유한 이름을 지정합니다.

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2019-12-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, 
    "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입니다.
  • 하나의 명령 실행에 대해 하나의 원본 입력 형식만 지원됩니다.
  • 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=2019-12-01

특정 실행 명령 배포에 대한 출력 세부 정보 가져오기

GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?$expand=instanceView&api-version=2019-12-01 

특정 실행 명령 배포 삭제

실행 명령의 인스턴스 삭제

DELETE /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2019-12-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":"echo Hello World!" 
        },
        "timeoutInSeconds":60
    }
}

여러 실행 명령을 순차적으로 실행

기본적으로 배포 템플릿을 사용하여 여러 RunCommand 리소스를 배포하는 경우 VM에서 동시에 실행됩니다. 스크립트에 대한 종속성과 기본 실행 순서가 있는 경우 속성을 사용하여 dependsOn 속성을 통해 이를 순차적으로 실행할 수 있습니다.

이 예제에서 secondRunCommandfirstRunCommand 이후에 실행됩니다.

{
   "$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":"2019-12-01",
         "location":"[parameters('location')]",
         "dependsOn":[
            "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
         ],
         "properties":{
            "source":{
               "script":"echo 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에서 원격으로 스크립트 및 명령을 실행하는 다른 방법을 알아보려면 Linux VM에서 스크립트 실행을 참조하세요.