ジョブの最も基本的な特徴は、1 つまたは複数のコマンドをあるノードセットに対してまとめて実行できることにあります。コマンドシーケンス(連続したコマンド)は_ワークフロー_と呼ばれ、ワークフローの各ステップには、コマンド呼び出しが定義されています。

ジョブワークフローの各ステップは、ジョブの一覧画面またはジョブの編集フォームにてジョブの詳細として表示されます。

ワークフローの定義

ワークフローはグラフィカルコンソールから、または XML or YAML ドキュメントをサーバーに読み込ませることで定義できます。

グラフィカルコンソールではステップの追加・編集・削除・順序の入れ替えが出来るようになっています。

テキスト形式でジョブを定義することを好むユーザは、2 つの定義方法を参照するといいでしょう:

グラフィカルコンソールの中でジョブを定義しておいて、そこから rd-jobs(1) Shell ツールが利用する定義ファイルをエクスポートすることも可能です。

ジョブ定義ファイルのエクスポートおよび、ジョブ定義ファイルのインポートを参照してください。

ワークフローコントロールの設定

ワークフローの実行は、Keepgoing(続行)と Strategy(計画)という 2 種類の重要な設定によってコントロールされています。

Workflow controls

Workflow controls

Keepgoing:これはあるステップにてエラーが起きた際どうするかをコントロールします:

  • No: 直ちに失敗とします。(デフォルト)
  • Yes:次のステップに進みます。

デフォルトでは直ちに失敗となりますが、場合によっては実行を続けるよう設定することもできます。

Strategy: 実行順序のオーダーとノードへのコマンドディスパッチをコントロールします:

  • Node-oriented: 次のノードに進む前にすべてのワークフローを実行します(デフォルト)
  • Step-oriented: 次のノードの前にすべてのノード上の各ステップを実行します。

以下のイラストでは、2 つのノードに対して 3 つのステップがどのように進められるかを対比させています。

Node-oriented フローはこうなります:

1.   NodeA    step#1
2.     "      step#2
3.     "      step#3
4.   NodeB    step#1
5.     "      step#2
6.     "      step#3

Step-oriented フローはこうなります:

1.   NodeA    step#1
2.   NodeB      "
3.   NodeA    step#2
4.   NodeB      "
5.   NodeA    step#2
6.   NodeB      "

Node-oriented フローが一般的であることも踏まえて、あなたが自動化しているプロセスでどちらのフローを使うのが適切か決めることになります。

ワークフローの各ステップ

以下の章では、様々な種類のコマンドを呼び出す各ステップを 1 つのセットとして、どのようにワークフローを作るか説明します。

新しいジョブ定義を作る際、ワークフローのフォームはデフォルトの状態であり、ワークフローステップの定義はされていません。ワークフローのエディターで最初のステップの定義としてフォームにシェルコマンドを入力するようになっています。

Add a step

Add a step

新しいステップを追加するには、ワークフローのエディターフォームの中の "Add a step" リンクを押すだけです。これで、どのような種類のワークフローステップを追加したいか選択するようダイアログが出ます。フォームの中を埋めたら、"Save" を押してシーケンスの中に保存します。"Cancel" を押すとフォームが閉じられ、シーケンスの変更は保存されません。

Workflow step types

Workflow step types

新しいステップは、常にシーケンスの最後に加えられます。ステップの順番を管理するにはステップの順序を変更するを見てください。

この先のいくつかの章ではコマンドステップの各種類の詳細について説明します。

コマンドステップ

システムコマンドを呼び出すには、コマンドステップを使ってください。これはジョブを作る際のデフォルトのワークフロータイプです。リモートホストで実行したいコマンドを入力してください。

Command step type

Command step type

これは dispatch を使ってコマンドを呼びだすことに似ています:

dispatch [filter-options] -- command

スクリプトステップ

入力されたシェルスクリプトを実行します。テキストフィールドからスクリプトに引数を渡すこともできます。

Script step type

Script step type

これは dispatch を用いてコマンドを呼びだすことに似ています:

dispatch [filter-options] --stdin -- args <<EOF 
script content here 
EOF

スクリプトファイルステップ

フィルタリングされたノードセットに対してのみローカルスクリプトを実行します。テキストフィールドにスクリプトへの引数を指定できます。

Script file step type

Script file step type

これは dispatch を使ってスクリプトファイルを呼びだすことに似ています:

dispatch [filter-options] -s scriptfile -- args

スクリプト URL ステップ

URL からスクリプトをダウンロードし、フィルタリングされたノードセットに対してそれを実行します。テキストフィールドにスクリプトへの引数を指定できます。

Script URL step type

Script URL step type

これは dispatch を使ってスクリプト URL を呼びだすことに似ています:

dispatch [filter-options] -u URL -- args

URL には実行時に展開されるコンテキスト変数を入れることができます。

ジョブリファレンスステップ

もう一つ保存されたジョブを呼ぶには、Job reference step(ジョブリファレンスステップ)を作成してください。ジョブの名前とそのジョブグループを入力します。

Job step type

Job step type

ジョブリファレンスのフォームは保存されているジョブの中から選択しやす閲覧画面を提供します。"Choose A Job..." リンクを押し、希望するジョブを選んでください。

最後に、オプションが定義されたジョブならそれらをコマンドライン引数としてテキストフィールドに指定したり、現在のジョブへ入力オプションを渡すための変数として使うことができます。フォーマット:

-optname <value> -optname <value> ...

オプションを指定するためのフォーマットは run コマンドラインツールにてオプションを指定する場合と全く同じです、オプションに対して変数を指定することもできます。例えば:

-opt1 something -opt2 ${option.opt2}

この例では、"opt1" オプションに対して、"something" をセットし、"opt2" オプションをトップレベルのジョブからジョブリファレンスに直接渡しています。

これは run を用いて他のジョブを呼ぶことに似ています:

run [filter-options] -j group/jobname -- -opt1 something -opt2 somethingelse

ジョブがオプションを必要としていて、それが指定されていない場合 "defalutValue" が定義されていればそれを使います。オプションが "defaultValue" を持っていない場合、必要なオプションが指定されていないということでジョブの実行は失敗します。

ステップの順番を変える

ジョブのアローアイコンをドラッグ & ドロップして好きな場所に移動することで各ステップの順番を編集できます。青い水平線バーは、ドラッグしているジョブがどこに置かれるか分かりやすくしてくれます。

Job step reorder

Job step reorder

選択したジョブをドロップすると希望する位置に着き、ステップの順番が更新されます。

ステップの順番変更を元に戻したい場合は、各ステップの上にある "Undo" リンクを押してください。

"Redo" ボタンは最新の "Undo" によって元に戻したものを再度変更しなおします。

"Revert All Changes" ボタンを押すと、全ての変更を戻してオリジナルの状態に戻します。

変更の保存

一旦ワークフローステップが定義され順番が決められると、ワークフローを新規作成する場合は "Create" ボタン、既にあるワークフローの編集の場合は "Update" ボタンによって変更を保存できます。

コンテキスト変数

あるジョブステップは実行される際、ジョブステップ自身にアクセス可能なある "context" 変数のセットを持っています。ジョブコンテキスト job ・ノードコンテキスト node ・オプションコンテキスト option といったいくつかのコンテキスト変数があります。

ジョブコンテキスト変数:

  • job.name: ジョブの名前
  • job.group: ジョブのグループ
  • job.id: ジョブの ID
  • job.execid: 現在の実行 ID
  • job.username: ジョブを実行しているユーザー名
  • job.project: プロジェクト名

ノードコンテキスト変数:

  • node.name: ジョブが実行されているノード名
  • node.hostname: ノードのホスト名
  • node.username: リモートユーザー名
  • node.description: ノードの説明
  • node.tags: カンマ区切りのタグ
  • node.os-*: ノードの OS 属性 : name, version, arch, family
  • node.*: ノードに定義されている全てのノード属性

オプションコンテキスト変数は、option.NAME として参照します(詳細については次のチャプターのジョブオプションを見てください。)

コンテキスト変数の使用方法

ジョブステップの中でコンテキスト変数を使う方法がいくつかあり、それぞれ文法が微妙に違います:

  • コマンドやスクリプトの引数とジョブリファレンスの引数
    ${ctx.name}
  • インラインのスクリプトコンテンツ (注釈を参照
    @ctx.name@

    : インラインスクリプトコンテンツの変数展開は Script File ステップでは行えません。スクリプトファイルは実行時に変数展開されるわけではないからです。

  • 環境変数 (注釈を参照
    $RD_CTX_NAME

    環境変数用の文法では、文字が全て大文字になり、句読点がアンダースコアに置き換えられ、名前に接頭辞 RD_ が付きます。 : SSH サーバーに必要なことについては、管理者向けガイドの SSH チャプター リモートコマンドを通して環境変数を渡すを参照してください。

まとめ

ここまでであなたはもうジョブワークフローがどういったものか、具体的にはワークフローの定義の仕方やどんなジョブステップを追加する事ができるかといったことを理解しています。

次のチャプターでは、Rundeck のジョブオプションの機能をカバーしていきます。