Runbook の概念

 

発行: 2016年6月

適用対象: Windows Azure Pack for Windows Server,System Center 2012 R2 Orchestrator

Automation Runbook は Windows PowerShell ワークフローとして実装されています。 ここでは、オートメーション Runbook に共通するワークフローの重要な機能の概要について説明します。 ワークフローの詳細については、「Windows PowerShell ワークフローについて」をご覧ください。

Runbook の構造は、サービス管理オートメーション の Runbook と Microsoft Azure Automation の Runbook とで同じですが、両者は通常、異なるリソースを使用します。

Windows PowerShell のワークフロー

ワークフローは、一連のプログラムされ、接続された手順であり、長時間かかるタスクを実行したり、複数のデバイスや管理対象ノードで複数の手順を調整したりする必要があります。 通常のスクリプトよりもワークフローが優れている点は、複数のデバイスに対して 1 つの操作を同時に実行できる機能と、障害発生時に自動的に復旧する機能があることです。 Windows PowerShell ワークフローは、Windows Workflow Foundation を利用する Windows PowerShell スクリプトです。 ワークフローは Windows PowerShell 構文を使用して作成され、Windows PowerShell によって開始されますが、処理は Windows Workflow Foundation が行います。

基本構造

Windows PowerShell ワークフローは、Workflow キーワードから始まり、波かっこで囲まれたスクリプトの本文が続きます。 次の構文のように、ワークフロー名が Workflow キーワードに続きます。 ワークフロー名は、オートメーション Runbook 名と一致します。

Workflow Test-Runbook
{
   <Commands>
}

パラメーターをワークフローに追加するには、次の構文のように、Param キーワードを使用します。 Runbook を開始すると、管理ポータルからこれらのパラメーターの値を指定するようにメッセージが表示されます。 このサンプルでは、パラメーターを必須にするかどうかを指定するオプションの Parameter 属性を使用しています。

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

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

名前付け

ワークフローの名前は、Windows PowerShell で標準の Verb-Noun 形式に従って付けます。 使用が承認されている動詞の一覧については、「Approved Verbs for Windows PowerShell Commands (Windows PowerShell コマンドで承認されている動詞)」をご覧ください。 ワークフロー名は、オートメーション Runbook 名と一致している必要があります。 Runbook をインポートしている場合、ファイル名はワークフロー名と一致する必要があります。また、ファイルの末尾は .ps1 である必要があります。

制限事項

Windows PowerShell ワークフローと Windows PowerShell の制限事項と構文の違いの完全な一覧については、スクリプト ワークフローとスクリプトの構文に関する相違点についての記事をご覧ください。

アクティビティ

活動はワークフロー内の特定のタスクです。 スクリプトが 1 つまたは複数のコマンドで構成されるのと同様に、ワークフローは連続して実行される 1 つまたは複数の活動で構成されます。 ワークフローを実行すると、Windows PowerShell ワークフローは、Windows PowerShell コマンドレットの多くを自動的に活動に変換します。 Runbook でこのようなコマンドレットのいずれかを指定すると、実際には対応する活動が Windows Workflow Foundation で実行されます。 対応する活動がないコマンドレットの場合、Windows PowerShell ワークフローは InlineScript 活動内でそのコマンドレットを自動実行します。InlineScript ブロックに明示的に含めないと、除外され、ワークフローでは使用できないコマンドレットもあります。 この概念の詳細については、「Using Activities in Script Workflows (スクリプト ワークフローでの活動の使用)」をご覧ください。

ワークフローの活動は、操作を構成する共通のパラメーターを共有しています。 ワークフローの共通パラメーターの詳細については、「about_WorkflowCommonParameters」をご覧ください。

統合モジュール

統合モジュールは、Windows PowerShell モジュールを含み、オートメーション にインポートできるパッケージです。 Windows PowerShell モジュールには、オートメーション Runbook で使用できるコマンドレットが含まれています。 Operations Manager や Azure などの製品とサービスには、その操作に固有のコマンドレットが含まれるモジュールがあります。

オートメーション にインポートされた統合モジュールは自動的にすべての Runbook で使用できるようになります。オートメーション は Windows PowerShell 4.0 に基づいているので、モジュールの自動読み込みをサポートしています。つまり、インストールされているモジュールのコマンドレットは、Import-Module を使用してスクリプトにインポートしなくても使用できます。

すべての依存関係を 1 つのフォルダー内に配置できる限り、すべての Windows PowerShell モジュールをオートメーションにインポートできます。 モジュールがレジストリ設定または既定のパスにはないファイルに依存している場合は、インポートすることはできますが、オートメーション は依存関係を特定できないため、動作しない可能性が高くなります。 外部依存関係を持つモジュールを Runbook 内で使用するには、別のホストにインストールし、a8b7e82f-e3fc-4286-8570-8d5ded944b27#bkmk_InlineScript スクリプト ブロックを使用してアクセスします。

サービス管理オートメーション と共に外部依存関係を持つモジュールを使用するには、モジュールを各 Worker サーバーにインストールします。 このようなモジュールのコマンドレットは Runbook で使用できますが、オートメーション で検出されないため、活動の挿入ウィザードなどの機能をサポートできません。 この機能を使用するには、New-SmaPortableModule コマンドレットを使用してポータブル モジュールを作成できます。 このコマンドレットは、各コマンドレットのスタブを含み、オートメーションにインポートできるモジュールを作成します。 Runbook がこのようなコマンドレットのいずれかを使用すると、スタブはその呼び出しを外部モジュールの実際のコマンドレットにリダイレクトします。 このモジュールは、各 Worker サーバーにインストールする必要があります。そうしないと、失敗します。

並列実行

Windows PowerShell ワークフローの利点の 1 つは、一般的なスクリプトと同様に、コマンドを連続して実行するのではなく、並列実行する機能があることです。 複数の操作を実行すると、完了までに時間がかかる可能性があるので、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 キーワードは、Parallel スクリプト ブロック内のコマンドを連続して実行する場合に使用されます。Sequence スクリプト ブロックは、他のコマンドと並列して実行されますが、ブロック内のコマンドは連続して実行されます。 この処理には、以下のような構文を使用します。 この例では、Activity1、Activity2、および Activity3 は同時に開始されます。 Activity4 は、Activity3 が完了した後に開始されます。 Activity5 は、その他すべての活動が完了した後に開始されます

Parallel
{
  <Activity1>
  <Activity2>

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

チェックポイント

チェックポイントは、変数の現在の値と、そのポイントまでに生成された出力を含むワークフローの現在の状態から作成されるスナップショットです。 Runbook 内で最後に作成されたチェックポイントは、障害が発生した場合でもワークフローを再開できるように、オートメーション データベースに保存されます。 Runbook ジョブが完了すると、チェックポイント データは削除されます。

Checkpoint-Workflow 活動を使用して、ワークフローにチェックポイントを設定できます。 この活動を Runbook に含めると、直ちにチェックポイントが作成されます。 Runbook がエラーで一時停止すると、ジョブを再開したときに、最後に設定されたチェックポイントのポイントから再開されます。

次のサンプル コードでは、Activity2 で Runbook の一時停止が発生した後にエラーが発生します。 ジョブを再開すると、Activity2 は最後にチェックポイントが設定された直後であるため、Activity2 が開始されます。

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

エラーを引き起こす可能性があり、Runbook の再開時に繰り返さない方がよい活動の後に、Runbook にチェックポイントを設定する必要があります。 たとえば、バーチャル マシンを作成する Runbook があるとします。 この場合、バーチャル マシンを作成するコマンドの前と後の両方にチェックポイントを設定できます。 作成に失敗すると、Runbook の再開時に作成のコマンドが繰り返されます。 作成に成功して、その後に Runbook でエラーが発生した場合、Runbook を再開したときに、バーチャル マシンは再作成されません。

チェックポイントの詳細については、「Adding Checkpoints to a Script Workflow (スクリプト ワークフローへのチェックポイントの追加)」をご覧ください。

Runbook の一時停止

Suspend-Workflow 活動を使用して、Runbook を強制的に一時停止することができます。 この活動はチェックポイントを設定し、ワークフローを直ちに一時停止します。 ワークフローの一時停止は、別の活動セットを実行する前に手動の手順を実行する必要がある Runbook などに役立ちます。

ワークフローの一時停止の詳細については、「Making a Workflow Suspend Itself (ワークフローの一時停止)」をご覧ください。

InlineScript

InlineScript 活動は、別のワークフローではないセッションでコマンドのブロックを実行し、出力をワークフローに返します。 ワークフロー内のコマンドは Windows Workflow Foundation に送信され、処理されますが、InlineScript ブロック内のコマンドは Windows PowerShell で処理されます。 この活動は、PSComputerNamePSCredential などの標準ワークフローの共通パラメーターを使用します。これによって、コード ブロックを別のコンピューターまたは代替の資格情報を使用して実行するように指定できます。

InlineScript には、以下の構文を使用します。

InlineScript
{
  <Script Block>
} <Common Parameters>

Runbook で InlineScript を使用する最も一般的な例は、別のコンピューターでコードのブロックを実行することです。 InlineScript は、Runbook のコマンドレットが オートメーション にインストールされていない場合や、操作に対象コンピューターのローカルで実行するアクセス許可のみがある場合に必要です。 次の図をご覧ください。

InlineScript

別のコンピューターでコード ブロックを実行するには、PSComputer および PSCredential パラメーターを InlineScript 活動に使用します。 一般的に、このようなパラメーターの値を指定するには、a8b7e82f-e3fc-4286-8570-8d5ded944b27#bkmk_Credentials や a8b7e82f-e3fc-4286-8570-8d5ded944b27#bkmk_Connections などのグローバル リソースが使用されます。 次のサンプル コードは、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 ブロック全体にわたって Windows PowerShell セッションが保持されるため、InlineScript は Runbook の拡張性に影響を与えます。

  • Get-AutomationVariableGet-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 の使用方法の詳細については、「ワークフローでの Windows PowerShell コマンドの実行」および「about_InlineScript」をご覧ください。