はじめに
インシデント管理ツールとして知られる「PagerDuty」ですが、自動化のサービスとして「PagerDuty Runbook Automation」があります。
以下の記事で、概要と基本的な使い方を簡単に紹介しました。
【PagerDuty Runbook Automation】全体像とアーキテクチャ概要について
今回は、いくつかの機能を活用してジョブを作成する手順を紹介したいと思います。
ジョブの作り方
プロジェクトの作成などの事前準備については省略させていただきます。
ジョブは、対象プロジェクトのジョブメニューを開いて、Create a new Job で作成できます。

実行したい処理については、ジョブ編集画面の Workflow タブを開いて、ステップを追加していきます。

ステップにはさまざまな処理を定義できます。
例えば、以下の通り、AWS環境に対しては、EC2 などのリソースを操作するようなステップや CloudWatch Logs からログを取得するようなステップが用意されています。
もしやりたいことに該当するステップがない場合は、コマンドステップやスクリプトステップで実行したい処理を定義することができます。

ジョブの作成方法については、以下ドキュメントで紹介されていますのでご参照ください。
Creating a Rundeck Job
作りたいジョブ
以下の記事で解説されています通り、PagerDuty Runbook Automation は、PagerDuty と連携したインシデント対応の自動化に活用できます。

PagerDutyを活用したインシデント対応の自動化
PagerDuty自動化関連機能まとめ+内製システムとの比較
【PagerDuty・AWS】Runbook AutomationにてAmazon EC2 サーバー内の調査を自動化するまでの道のり
インシデント対応の自動化で活用する場合、定義した処理(ステップ)を順番に実行するだけでなく、動作確認など途中の処理結果に応じて、後続の処理を変えたいこともあると思います。例えば、動作確認が正常であれば「処理 A」を実行し、動作確認が異常であれば「処理 B」を実行する、といった条件分岐を定義したいケースです。
今回は以下の様な条件分岐ありの処理フローを定義したジョブを作るために活用する機能について紹介します。

上記のフローを作成するためには、以下の処理を定義する必要があります。
| やりたいこと | PagerDuty Runbook Automation での実装方法 |
| 動作確認結果を後続で使用できるよう変数等で保持する。 | 動作確認を行うステップにログフィルターを定義して、動作確認の結果をデータ変数に格納する。 |
| 動作確認結果に基づいて、後続処理を分岐させる。 | ジョブワークフローで Ruleset を使用して、動作確認の結果(変数の値)に基づいた条件分岐を定義する。 |

そのため、以下の機能について紹介いたします。
- 変数の使用
- 情報の取得(ログフィルター)
- 条件分岐の使用(Ruleset/グローバル変数ワークフローステップ)
変数の使用
ジョブで定義できる変数は、コンテキスト変数(Context Variables)と呼ばれ、色々な種類が用意されています。
ステップの実行結果を取得するにはデータ変数を使用します。
| 種類 | 概要 |
| オプション変数 (option.*) | ジョブ実行時にユーザーが入力、またはAPI等で指定したパラメータ |
| データ変数 (data.*) | ジョブのステップ実行中に動的に生成・取得される変数 |
| ノード変数 (node.*) | 現在実行中のノードに関する属性情報(ホスト名、OS、タグなど) |
| ジョブ変数 (job.*) | 実行中のジョブに関するメタデータ(ジョブ名、ID、プロジェクト名、実行ユーザーなど) |
| 実行変数 (execution.*) | 実行ステータスやIDなどの情報(通知のコンテキストで使用) |
今回は使用しませんが、データ変数以外によく使いそうなものとして、オプション変数 (option.*) があります。
オプション変数 (option.*)
ジョブ実行時にインプットとして渡されるものです。
使用したい場合、ジョブ編集画面の上部で作成することができます。

オプション変数を指定すると、ジョブの実行画面でオプション変数の入力を求められます。(入力を必須 or 任意に設定できます。)
情報の取得(ログフィルター)
ジョブ内の各ステップで実行した処理結果を取得するために、ログフィルターという機能を使用します。
ログフィルターは各ステップの歯車マークのプルダウンから設定できます。
複数の値を取得したい場合には、複数のログフィルターを作成する必要があります。

ログフィルターとして色々なプラグインが用意されていますが、よく使用しそうなものとして、以下のプラグインがあります。
| 種類 | 概要 |
| Key-Value Data | ログから「キー = 値」のパターンや正規表現を使用して、データを抽出します。 |
| JSON jq key/value mapper | jqライブラリを使用して、JSON出力の中から特定の値を抽出します。 |
以下の画像は Key-Value Data ログフィルターですが、この場合、ログの行の先頭が 「 RUNDECK:DATA: 」 で始まり、その後に「キー = 値」が続く出力を取得できます。( RUNDECK:DATA:responseCode=200 など)

ログフィルターで取得された情報は、ログ出力画面にて Key/Value の形式で表示されます。
以下画像の場合、後続のステップで ${data.responseCode} を指定することで、変数の値を使用できます。(スクリプトで使用する場合、@data.responseCode@ を指定)

なお、ログフィルターはステップ単位で定義することもできますし、Global Log Filters を使用するとワークフロー全体で有効なログフィルターを定義することもできます。

条件分岐の使用(Ruleset/グローバル変数ワークフローステップ)
単純に上から順番に実行するだけで無く、Ruleset を使用するとプログラミングのような条件分岐をジョブの実行フローに組み込むことができます。(Ruleset は商用版でのみ使用できます)
例えば、「指定した変数の値が『A』の場合のみステップ2を実行し、それ以外の場合はスキップする」といった判断を自動化できます。
Ruleset
この機能はジョブ編集画面のストラテジを Ruleset に指定することで使用できます。

Rulesetのルールの記載方法については、公式ドキュメントに記載がありますが、ANDやORといった条件指定が可能です。
例えば、以下の画像で定義しているルールの場合、次の動作となります。
- ステップ1 ~ 3が順番に実行される
- ステップ4 ~ 6は以下の通り分岐する
- 変数「export.responseCode」の値が100以上、かつ、400未満の場合:ステップ4を実行(ステップ5 , 6はスキップ)
- 変数「export.responseCode」の値が100未満、または、400以上の場合:ステップ5 , 6を実行(ステップ4はスキップ)

グローバル変数ワークフローステップ(Global Variable Workflow Step)
なお、ログフィルターで取得した値(データ変数)を Ruleset で使用するには、グローバル変数ワークフローステップ(Global Variable Workflow Step)という機能を使用して、データ変数のスコープ(有効範囲)を広げる必要があります。
データ変数はその変数を生成したノード内でのみ有効ですが、グローバル変数ワークフローステップを使用すると、その値をジョブ全体で利用できるように昇格させることができます。

まとめ
今回紹介した機能を組み合わせることで、以下の様に条件分岐を含んだ処理フローを実装できます。
- 動作確認を行うステップにログフィルターを定義して、動作確認の結果をデータ変数に格納する。
- グローバル変数ワークフローステップを使用して、データ変数のスコープ(有効範囲)を広げる
- Ruleset を使用して、動作確認の結果(変数の値)に基づいた条件分岐を定義する。

手動運用が抱える課題を解決し、より効率的で信頼性の高いシステム運用体制を構築するために、ぜひ PagerDuty Runbook Automation の導入をご検討ください。
弊社では、現在インシデント対応を「PagerDuty」と「AMS」というシステムを用いて自動化しております。
その知見を生かし、お客様のシステムの内製化支援等も行っていますので、ご興味がある方は、アイレットへお気軽にご相談ください。
最後までご覧いただきありがとうございました。
