자습서: Python 3.8 Runbook 만들기

이 자습서는 Azure Automation에서 Python 3.8 Runbook을 만드는 과정을 안내합니다. Python Runbook은 Python 2.7 및 3.8에서 컴파일됩니다. Azure Portal에서 텍스트 편집기를 사용하여 Runbook의 코드를 직접 편집할 수 있습니다.

  • 간단한 Python Runbook 만들기
  • Runbook 테스트 및 게시
  • Runbook 작업 실행 및 상태 추적
  • Runbook 매개 변수를 사용하여 Azure 가상 머신을 시작하도록 Runbook 업데이트

필수 조건

이 자습서를 완전히 학습하려면 다음이 필요합니다.

  • Azure 구독 구독이 아직 없는 경우 MSDN 구독자 혜택을 활성화하거나 체험 계정에 가입할 수 있습니다.

  • Automation 계정 - 관리 ID를 사용하여 Runbook을 보유하고 Azure 리소스에 대해 인증하는 데 사용됩니다. Automation 계정을 만들 때 관리 ID가 자동으로 만들어집니다.

  • Azure 가상 머신. 이 자습서를 진행하는 동안 이 컴퓨터를 시작하고 중지할 예정이므로 프로덕션 VM을 사용해서는 안 됩니다.

새 Runbook 만들기

먼저 헬로 월드라는 텍스트를 출력하는 간단한 Runbook을 만듭니다.

  1. Azure Portal에서 Automation 계정을 엽니다.

    Automation 계정 페이지는 이 계정의 리소스 간략히 보기를 제공합니다. 사용자에게는 이미 일부 자산이 있어야 합니다. 대부분의 해당 자산은 새 Automation 계정에 자동적으로 포함되어 있는 모듈입니다.

    또한 필수 조건에 언급된 관리 ID를 사용하도록 설정해야 합니다. 계정 설정에서 ID 리소스를 보면 이를 확인할 수 있습니다.

  2. 프로세스 자동화 아래에서 Runbook을 선택하여 Runbook 목록을 엽니다.

  3. Runbook 만들기를 선택하여 새 Runbook을 만듭니다.

  4. Runbook 이름을 MyFirstRunbook-Python으로 지정합니다.

  5. Runbook 형식으로 Python을 선택합니다.

  6. 런타임 버전으로 Python 3.8을 선택합니다.

  7. 만들기 를 선택하여 Runbook을 만들고 텍스트 편집기를 엽니다.

Runbook에 코드 추가

이제 Hello World 텍스트를 인쇄하기 위한 간단한 명령을 추가합니다.

print("Hello World!")

저장을 선택하여 Runbook을 저장합니다.

Runbook 테스트

프로덕션 환경에서 사용할 수 있도록 Runbook을 게시하기 전에 제대로 작동하는지 확인하기 위해 테스트합니다. Runbook을 테스트할 때 초안 버전을 실행하고 해당 출력을 대화형으로 봅니다.

  1. 테스트 창을 선택하여 테스트 창을 엽니다.

  2. 시작을 선택하여 테스트를 시작합니다. 이 옵션만 사용하도록 설정해야 합니다.

  3. 이 창에서 runbook 작업 이 생성되고 상태를 보여줍니다. 작업 상태는 클라우드에서 Runbook Worker를 사용할 수 있을 때까지 기다리고 있음을 나타내는 대기로 시작됩니다. 작업자가 작업을 요구한 경우 시작 중으로 바뀐 다음, Runbook이 실제로 실행되기 시작하면 실행 중으로 바뀝니다.

  4. Runbook 작업이 완료되면 해당 출력이 표시됩니다. 이 경우 Hello World가 표시되어야 합니다.

  5. 캔버스로 돌아가려면 테스트 창을 닫습니다.

Runbook 게시 및 시작

방금 만든 Runbook은 아직 초안 모드입니다. 프로덕션 환경에서 실행하려면 먼저 게시해야 합니다. Runbook을 게시하면 초안 버전으로 기존의 게시된 버전을 덮어씁니다. 이 예에서는 Runbook을 방금 만들었으므로 아직 게시된 버전이 없습니다.

  1. 게시를 선택하여 Runbook을 게시한 다음, 확인 메시지가 표시되면 를 선택합니다.

  2. MyFirstRunbook_python 창을 닫으면 Runbook 페이지로 돌아갑니다. 여기에 작성 상태게시됨으로 표시됩니다.

  3. 목록에서 MyFirstRunbook-Python 이름을 선택하면 MyFirstRunbook-Python 창으로 돌아갑니다.

    위쪽에 표시되는 옵션을 사용하여 Runbook을 시작하고, Runbook을 보고, 편집하고, 미래의 특정 시간에 시작하도록 예약하고, 다른 작업을 수행할 수 있습니다.

  4. 시작을 선택한 다음, Runbook 시작 창이 열리면 확인을 선택합니다.

  5. 만든 Runbook 작업에 대한 작업 창이 열립니다. 이 창을 닫을 수 있지만, 작업 진행 상황을 볼 수 있도록 열어 두겠습니다.

  6. 작업 상태는 Essentials 아래의 상태 필드에 표시됩니다. 여기서 값은 Runbook을 테스트했을 때 상태 값과 일치합니다.

  7. Runbook 상태가 완료됨으로 표시되면 출력 탭을 선택합니다. 출력 탭에서 Hello World를 볼 수 있습니다.

  8. 출력 탭을 닫습니다.

  9. 모든 로그 탭을 선택하여 Runbook 작업에 대한 스트림을 봅니다. 출력 스트림에는 Hello World만 표시됩니다. 그러나 이 탭에는 Runbook 작업에 대한 자세한 정보 표시오류 같은 다른 스트림이 표시될 수 있습니다(Runbook이 이 스트림에 기록되는 경우).

  10. 작업 창을 닫아 MyFirstRunbook-Python 창으로 돌아갑니다.

  11. 작업 리소스를 선택하여 이 Runbook에 대한 작업 리소스 페이지를 엽니다. 이 페이지에는 이 Runbook에서 만든 모든 작업이 나열됩니다. 작업을 한 번만 실행했으므로 하나의 작업만 표시됩니다.

  12. Runbook을 시작했을 때 표시된 것과 동일한 작업 창을 열려면 이 작업을 선택하면 됩니다. 이 창을 사용하면 예전으로 돌아가 특정 Runbook으로 생성된 모든 작업의 세부 정보를 볼 수 있습니다.

Azure 리소스를 관리하는 인증 추가

지금까지 Runbook을 테스트 하고 게시했지만, 딱히 유용하지는 않습니다. Azure 리소스를 관리하려고 합니다. 리소스를 관리하려면 스크립트가 인증해야 합니다.

권장 인증 방법은 관리 ID를 사용하는 것입니다. Azure Automation 계정을 만들면 관리 ID가 자동으로 만들어집니다.

이러한 샘플을 사용하려면 Automation 계정의 Python 패키지 리소스에 다음 패키지를 추가합니다. 이 링크를 사용하여 해당 패키지에 대한 WHL 파일을 추가할 수 있습니다.

이 패키지를 추가할 때 Runbook과 일치하는 런타임 버전을 선택합니다.

참고 항목

다음 코드는 런타임 버전 3.8로 테스트되었습니다.

관리 ID

관리 ID를 사용하려면 관리 ID가 사용하도록 설정되었는지 확인합니다.

  • Automation 계정에 대해 관리 ID가 사용하도록 설정되어 있는지 확인하려면 Automation 계정 계정>설정>ID로 이동하고 상태켜기로 설정합니다.
  • 관리 ID에는 리소스를 관리하는 역할이 할당되어 있습니다. 가상 머신 리소스 관리에 관한 이 예제에서는 가상 머신을 포함하는 리소스 그룹의 “가상 머신 기여자” 역할을 추가합니다. 자세한 내용은 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

ID 관리 역할이 구성되면 코드 추가를 시작할 수 있습니다.

  1. MyFirstRunbook-Python 창에서 편집을 선택하여 텍스트 편집기를 엽니다.

  2. 다음 코드를 추가하여 Azure에 인증합니다.

#!/usr/bin/env python3
from azure.identity import DefaultAzureCredential
from azure.mgmt.compute import ComputeManagementClient

SUBSCRIPTION_ID="YOUR_SUBSCRIPTION_ID"

azure_credential = DefaultAzureCredential()

import os
import requests
# printing environment variables
endpoint = os.getenv('IDENTITY_ENDPOINT')+"?resource=https://management.azure.com/"
identityHeader = os.getenv('IDENTITY_HEADER')
payload={}
headers = {
'X-IDENTITY-HEADER' : identityHeader,
'Metadata' : True
}
response = requests.get(endpoint, headers)
print(response.text)

Python 컴퓨팅 클라이언트를 만들고 VM을 시작하는 코드 추가

Azure VM을 사용하려면 Python용 Azure 컴퓨팅 클라이언트의 인스턴스를 만듭니다.

# Initialize client with the credential and subscription.
compute_client = ComputeManagementClient(
    azure_credential,
    SUBSCRIPTION_ID
)

print('\nStart VM')
async_vm_start = compute_client.virtual_machines.begin_start(
    "MyResourceGroup", "TestVM")
async_vm_start.wait()
print('\nFinished start.')

여기서 MyResourceGroup은 VM을 포함하는 리소스 그룹의 이름이고 TestVM은 시작하려는 VM의 이름입니다.

Runbook을 다시 테스트 및 실행하여 VM이 시작되는지 확인합니다.

입력 매개 변수 사용

Runbook은 현재 리소스 그룹과 VM의 이름에 하드 코딩된 값을 사용합니다. 이제 입력 매개 변수에서 이러한 값을 가져오는 코드를 추가해 보겠습니다.

sys.argv 변수를 사용하여 매개 변수 값을 가져옵니다. Runbook에서 다른 import 문 바로 뒤에 다음 코드를 추가합니다.

import sys

resource_group_name = str(sys.argv[1])
vm_name = str(sys.argv[2])

이 코드는 sys 모듈을 가져오며 리소스 그룹 및 VM 이름을 포함할 변수 두 개를 만듭니다. 인수 목록의 요소 sys.argv[0]는 스크립트의 이름이며 사용자가 입력하는 내용이 아닙니다.

이제 하드 코드된 값을 사용하는 대신 입력 매개 변수 값을 사용하도록 Runbook의 마지막 두 줄을 수정할 수 있습니다.

async_vm_start = compute_client.virtual_machines.begin_start(
    resource_group_name, vm_name)
async_vm_start.wait()

테스트 창에서 또는 게시된 Runbook으로 Python Runbook을 시작할 때 Runbook 시작 페이지의 매개 변수 아래에서 매개 변수의 값을 입력할 수 있습니다.

첫 번째 상자에 값을 입력하기 시작하면 두 번째 상자가 나타나는 식으로 상자가 계속 표시되므로 매개 변수 값을 필요한 수만큼 입력할 수 있습니다.

방금 추가한 코드와 같이 sys.argv 배열의 스크립트에서 사용할 수 있습니다.

첫 번째 매개 변수의 값으로는 리소스 그룹 이름을 입력하고 두 번째 매개 변수의 값으로는 시작하려는 VM의 이름을 입력합니다.

Enter parameter values

확인을 선택하여 Runbook을 시작합니다. Runbook이 실행되고 지정한 VM이 시작됩니다.

Python에서 오류 처리

또한 다음 규칙을 사용하여 경고, 오류 및 디버그 스트림을 포함하여 Python Runbook에서 다양한 스트림을 검색할 수 있습니다.

print("Hello World output")
print("ERROR: - Hello world error")
print("WARNING: - Hello world warning")
print("DEBUG: - Hello world debug")
print("VERBOSE: - Hello world verbose")

다음 예제에서는 try...except 블록에서 사용되는 이 규칙을 보여줍니다.

try:
    raise Exception('one', 'two')
except Exception as detail:
    print ('ERROR: Handling run-time error:', detail)

다음 단계