다음을 통해 공유


Windows PowerShell 워크플로 개념

서비스 관리 자동화용 Runbook의 한 가지 유형은 Windows PowerShell 워크플로를 기반으로 합니다. 이 문서에서는 Automation Runbook에 공통적인 워크플로의 중요한 기능에 대한 간략한 개요를 제공합니다. 워크플로에 대한 자세한 내용은 Windows PowerShell 워크플로 소개에서 확인할 수 있습니다.

Runbook 구조는 Service Management Automation용 Runbook과 Microsoft Azure Automation 의 경우 동일하지만 일반적으로 서로 다른 리소스에서 작동합니다.

Windows PowerShell 워크플로

워크플로는 프로그래밍 방식으로 연결된 단계의 시퀀스로, 장기 실행 작업을 수행하거나 여러 디바이스 또는 관리 노드에서 여러 단계의 조정을 필요로 합니다. 표준 스크립트에서의 워크플로의 이점으로는, 여러 디바이스에 대해 작업을 동시에 수행할 수 있는 기능과 오류를 자동으로 복구하는 기능을 들 수 있습니다. Windows PowerShell 워크플로는 Windows Workflow Foundation을 사용하는 Windows PowerShell 스크립트입니다. 워크플로는 Windows PowerShell 구문을 사용하여 작성되고 Windows PowerShell에서 시작되지만 Windows Workflow Foundation에서 처리됩니다.

기본 구조

Windows PowerShell 워크플로는 워크플로 키워드와 중괄호로 묶인 스크립트 본문으로 시작합니다. 워크플로의 이름은 다음 구문과 같이 워크플로 키워드를 따릅니다. 워크플로의 이름은 Automation Runbook의 이름과 일치합니다.

Workflow Test-Runbook
{
   <Commands>
}

워크플로에 매개 변수를 추가하려면 다음 구문과 같이 Param 키워드를 사용합니다. 관리 포털에서 사용자가 Runbook을 시작할 때 이러한 매개 변수의 값을 지정하라는 메시지가 표시됩니다. 이 샘플에서는 매개 변수가 필수인지 여부를 지정하는 선택적 매개 변수 특성을 사용합니다.

Workflow Test-Runbook
{
  Param
  (
   [Parameter(Mandatory=<$True | $False>]
   [Type]$<ParameterName>,

   [Parameter(Mandatory=<$True | $False>]
   [Type]$<ParameterName>
  )
  <Commands>
}

이름 지정

워크플로 이름은 Windows PowerShell의 표준인 동사-명사 형식을 따라야 합니다. 사용하도록 승인된 동사 목록은 Approved Verbs for Windows PowerShell Commands(Windows PowerShell 명령의 승인 동사) 에서 참조할 수 있습니다. 워크플로 이름은 Automation Runbook의 이름과 일치해야 합니다. Runbook을 가져오는 경우 해당 파일 이름은 워크플로 이름과 일치해야 하며 .ps1로 끝나야 합니다.

제한 사항

Windows PowerShell 워크플로와 Windows PowerShell의 제한 사항 및 구문 차이점에 대한 전체 목록은 스크립트 워크플로와 스크립트의 구문 차이점을 참조하세요.

활동

작업은 워크플로의 특정 작업입니다. 스크립트가 하나 이상의 명령으로 구성된 것처럼 워크플로도 시퀀스에서 수행되는 하나 이상의 활동으로 구성됩니다. Windows PowerShell 워크플로는 워크플로를 실행할 때 자동으로 여러 Windows PowerShell cmdlet을 작업으로 변환합니다. 사용자가 Runbook의 이러한 cmdlet 중 하나를 지정하면 Windows Workflow Foundation에서 해당 작업을 실제로 실행합니다. 해당 작업이 없는 cmdlet의 경우 Windows PowerShell 워크플로는 InlineScript 작업 내에서 cmdlet을 자동으로 실행합니다. InlineScript 블록에 명시적으로 포함하지 않는 한 제외되고 워크플로에서 사용할 수 없는 cmdlet 집합이 있습니다. 이러한 개념에 대한 자세한 내용은 스크립트 워크플로에서 활동 사용을 참조 하세요.

워크플로 활동은 해당 작업을 구성하기 위해 일반 매개 변수 집합을 공유합니다. 워크플로 공통 매개 변수에 대한 자세한 내용은 about_WorkflowCommonParameters를 참조하십시오.

통합 모듈

통합 모듈은 Windows PowerShell 모포함하고 Automation으로 가져올 수 있는 패키지입니다. Windows PowerShell 모듈에는 Automation Runbook에서 사용할 수 있는 cmdlet이 포함되어 있습니다. Operations Manager 및 Azure와 같은 제품과 서비스에는 작동 관련 cmdlet이 포함된 모듈이 있습니다.

Automation으로 가져온 통합 모듈은 모든 Runbook에서 자동으로 사용할 수 있습니다. Automation은 Windows PowerShell 4.0을 기반으로 하므로 모듈의 자동 로드를 지원합니다. 즉, 설치된 모듈의 cmdlet을 Import-Module을 사용하여 스크립트로 가져오지 않고도 사용할 수 있습니다.

모든 종속성을 단일 폴더에 배치할 수 있는 한 모든 Windows PowerShell 모듈을 Automation으로 가져올 수 있습니다. 모듈이 기본 경로에 없는 레지스트리 설정 또는 파일에 종속된 경우 가져올 수 있지만 Automation에서 종속성을 찾을 수 없기 때문에 모듈이 작동하지 않을 가능성이 큽니다. 외부 종속성이 있는 모듈은 사용 중인 다른 호스트에 설치한 다음 InlineScript 스크립트 블록을 통해 액세스하여 Runbook에서 사용할 수 있습니다.

서비스 관리 자동화를 사용하면 각 작업자 서버에 모듈을 설치하여 외부 종속성이 있는 모듈을 사용할 수 있습니다. 이러한 모듈의 cmdlet은 Runbook에서 사용할 수 있지만 작업 삽입 마법사와 같은 기능을 지원하기 위해 Automation에서 검색되지 않습니다. 이 기능을 사용하기 위해 New-SmaPortableModule cmdlet을 사용하여 이동식 모듈을 만들 수 있습니다. 이 cmdlet은 각 cmdlet에 대한 스텁을 포함하고 Automation으로 가져올 수 있는 모듈을 만듭니다. Runbook에서 이러한 cmdlet 중 하나를 사용할 경우 스텁이 호출을 외부 모듈의 실제 cmdlet으로 리디렉션합니다. 해당 모듈은 각 Worker 서버에 설치되어야 하며 그렇지 않으면 호출이 실패합니다.

병렬 실행

Windows PowerShell 워크플로의 이점 중 하나는 일반적인 스크립트의 경우와 마찬가지로 명령 집합을 순차적으로 수행하지 않고 병렬로 수행하는 기능입니다. 이 기능은 Runbook에서 완료하는 데 상당한 시간이 소요되는 여러 작업을 수행할 수 있으므로 특히 유용합니다. 예를 들어 Runbook에서 가상 컴퓨터 집합을 프로비전할 수 있습니다. 각 프로비전 프로세스를 순서대로 수행하는 대신 작업을 동시에 수행하여 전반적인 효율성을 높일 수 있습니다. 모든 작업이 완료된 경우에만 Runbook이 계속됩니다.

Parallel 키워드를 사용하여 동시에 실행할 여러 명령이 포함된 스크립트 블록을 만들 수 있습니다. 아래와 같은 구문이 사용됩니다. 이 경우에 Activity1과 Activity2가 동시에 시작됩니다. Activity3은 Activity1과 Activity2가 모두 완료된 후에만 시작됩니다.

Parallel
{
  <Activity1>
  <Activity2>
}
<Activity3>

ForEach -Parallel 구문을 사용하여 컬렉션의 각 항목에 대한 명령을 동시에 처리할 수 있습니다. 이 경우 컬렉션의 항목은 병렬로 처리되지만 스크립트 블록의 명령은 순차적으로 실행됩니다. 아래와 같은 구문이 사용됩니다. 이 경우 Activity1은 컬렉션의 모든 항목에 대해 동시에 시작됩니다. 각 항목에 대해 Activity2는 Activity1이 완료된 후에 시작됩니다. Activity3은 모든 항목에 대해 Activity1과 Activity2가 모두 완료된 후에만 시작됩니다.

ForEach -Parallel ($<item> in $<collection>)
{
  <Activity1>
  <Activity2>
}
<Activity3>

Sequence 키워드는 병렬 스크립트 블록 내에서 시퀀스로 명령을 실행하는 데 사용됩니다. 시퀀스 스크립트 블록은 다른 명령과 병렬로 실행되지만 블록 내의 명령은 순차적으로 실행됩니다. 아래와 같은 구문이 사용됩니다. 이 경우 Activity1, Activity2 및 Activity3이 동시에 시작됩니다. Activity4는 Activity3이 완료된 후에만 시작됩니다. 다른 모든 활동이 완료된 후 Activity5가 시작됩니다.

Parallel
{
  <Activity1>
  <Activity2>

  Sequence
  {
   <Activity3>
   <Activity4>
  }
}
<Activity5>

검사점

검사점은 변수의 현재 값 및 해당 지점에 대해 생성된 모든 출력을 포함하는 워크플로의 현재 상태에 대한 스냅샷입니다. Runbook에서 완료할 마지막 검사점은 가동 중단 시에도 워크플로를 다시 시작할 수 있도록 Automation 데이터베이스에 저장됩니다. 검사점 데이터는 Runbook 작업이 완료되면 제거됩니다.

Checkpoint-Workflow 활동을 사용하여 워크플로에서 검사점을 설정할 수 있습니다. Runbook에 이 작업을 포함한 경우 검사점이 즉시 지정됩니다. Runbook이 오류에 의해 일시 중단된 경우 작업이 다시 시작될 때 설정된 마지막 검사점 지점부터 다시 시작됩니다.

다음 샘플 코드에서는 Activity2 이후에 오류가 발생하여 Runbook이 일시 중단됩니다. Activity2는 마지막 검사점이 설정된 직후이므로 작업이 다시 시작될 때 Activity2를 실행하여 시작합니다.

<Activity1>
Checkpoint-Workflow
<Activity2>
<Error>
<Activity3>

오류가 발생하기 쉬우며 Runbook이 다시 시작된 경우 반복해서는 안 되는 작업 후에 Runbook에서 검사점을 설정해야 합니다. 예를 들어 Runbook에서 가상 머신을 만들 수 있습니다. 이 경우 가상 머신을 만드는 명령 앞뒤 모두에 검사점을 설정할 수 있습니다. 가상 컴퓨터를 만들지 못하면 Runbook이 다시 시작될 때 명령이 반복됩니다. 생성에 성공했지만 나중에 Runbook이 실패하면 Runbook이 다시 시작될 때 가상 머신이 다시 만들어지지 않습니다.

검사점에 대한 자세한 내용은 스크립트 워크플로에 검사점 추가를 참조하세요.

Runbook 일시 중단

Runbook이 Suspend-Workflow 활동으로 자신을 일시 중단하도록 강제할 수 있습니다. 이 작업은 검사점을 설정하고 즉시 워크플로를 일시 중단합니다. 워크플로를 일시 중단하는 작업은 다른 작업을 실행하기 전에 수행해야 할 수동 단계가 필요할 수 있는 Runbook에 유용합니다.

워크플로 일시 중단하는 방법에 대한 자세한 내용은 Making a Workflow Suspend Itself(워크플로 자체 일시 중단)를 참조하십시오.

InlineScript

InlineScript 작업은 별도의 비 워크플로 세션에서 명령 블록을 실행하고 해당 출력을 워크플로에 반환합니다. 워크플로의 명령은 처리를 위해 Windows Workflow Foundation으로 보내지만 InlineScript 블록의 명령은 Windows PowerShell에서 처리합니다. 이 활동은 PSComputerName 및 PSCredential비롯한 표준 워크플로 공통 매개 변수를 사용하여 코드 블록을 다른 컴퓨터에서 실행하거나 대체 자격 증명을 사용하도록 지정할 수 있습니다.

InlineScript는 아래와 같은 구문을 사용합니다.

InlineScript
{
  <Script Block>
} <Common Parameters>

Runbook에서 InlineScript의 가장 일반적인 용도는 다른 컴퓨터에서 코드 블록을 실행하는 것입니다. 이 작업은 Runbook의 cmdlet이 Automation에 설치되어 있지 않거나 작업에 대상 컴퓨터에서 로컬로 수행할 수 있는 권한만 있는 경우에 필요합니다. 이와 관련된 그림이 다음 다이어그램에 나와 있습니다.

인라인 스크립트 다이어그램

다른 컴퓨터에서 코드 블록을 실행하기 위해 PSComputerPSCredential 매개 변수가 InlineScript 작업과 함께 사용됩니다. 일반적으로 Runbook에서 이러한 매개 변수의 값을 지정하는 데 Credential 또는 Connection 과 같은 전역 리소스를 사용합니다. 다음 샘플 코드는 MyConnection이라고 하는 연결로 표시된 컴퓨터에서 명령 집합을 실행합니다.

$con = Get-AutomationConnection -Name 'MyConnection'
$securepassword = ConvertTo-SecureString -AsPlainText -String $con.Password -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $con.Username, $securepassword
InlineScript
{
  <Commands>
} -PSComputer $con.ComputerName -PSCredential $cred

InlineScript 활동은 특정 Runbook에서 중요할 수 있지만 다음과 같은 이유로 필요한 경우에만 사용해야 합니다.

  • InlineScript 블록 내에서는 검사점을 사용할 수 없습니다. 따라서 블록 내에서 오류가 발생한 경우 처음부터 다시 시작해야 합니다.

  • InlineScript는 InlineScript 블록의 전체 길이에 대한 Windows PowerShell 세션을 보유하기 때문에 Runbook의 확장성에 영향을 줍니다.

  • Get-AutomationVariable 및 Get-AutomationPSCredential같은 작업은 InlineScript 블록에서 사용할 수 없습니다.

InlineScript사용해야 하는 경우 범위를 최소화해야 합니다. 예를 들어 Runbook이 각 항목에 동일한 작업을 적용하는 동안 컬렉션을 반복하는 경우 InlineScript 외부에서 루프가 발생합니다. 그렇게 하면 다음과 같은 이점을 얻을 수 있습니다.

  • 각 반복 이후 워크플로에 검사점 을 설정할 수 있습니다. 작업이 일시 중단되거나 중단된 후 다시 시작되는 경우 루프가 다시 시작될 수 있습니다.

  • ForEach "Parallel을 사용하여 컬렉션 항목을 동시에 처리할 수 있습니다.

Runbook에서 InlineScript사용하는 경우 다음 권장 사항을 염두에 두세요.

  • 그러나 $Using 범위 한정자를 사용하여 스크립트에 값을 전달할 수 있습니다. 예를 들어 InlineScript 외부에서 설정된 $abc 변수는 inlineScript 내에서 $using:abc가 됩니다.

  • InlineScript에서 출력을 반환하려면 출력을 변수에 할당하고 출력 스트림에 반환할 데이터를 출력합니다. 다음 예제에서는 문자열 hi 를 $output 변수에 할당합니다.

    $output = InlineScript { Write-Output "hi" }
    
  • InlineScript 범위 내에서 워크플로를 정의하지 않습니다. 일부 워크플로가 올바르게 작동하는 것처럼 보일 수 있지만 테스트된 시나리오는 아닙니다. 따라서 혼란스러운 오류 메시지나 예기치 않은 동작이 발생할 수 있습니다.

InlineScript 사용에 대한 자세한 내용은 워크플로about_InlineScript Windows PowerShell 명령 실행을 참조하세요.

다음 단계