Documentation

21. ジョブスライス

sliced job という用語は、分散されたジョブのコンセプトのことです。分散されたジョブは、大多数のホストでジョブを実行する場合に使用し、インベントリーのサブセット上で、複数の Ansible Playbook それぞれを実行することで、クラスターで並行してスケジューリングができます。

デフォルトでは、Ansible は単一のコントロールインスタンスからジョブを実行します。ホスト間のオーケストレーションが必要ないジョブの場合、ジョブスライスは、クラスター内の複数のノードに作業を分散する automation controller の機能を利用します。ジョブスライスは、ジョブテンプレートのフィールド job_slice_count を追加して、Ansible 実行をスライスするジョブの数を指定することで機能します。この数が 1 より大きい場合、automation controller はジョブではなくジョブテンプレートからワークフローを生成します。インベントリーが、複数のスライスジョブに均等に分散され、ワークフロージョブが起動し、通常のワークフローのように続行されます。ジョブを起動すると、API はジョブリソース (job_slice_count = 1 の場合) か、ワークフロージョブのリソースを返します。対応のユーザーインターフェースで、適切な画面にリダイレクトされ、実行のステータスが表示されます。

21.1. ジョブスライスの留意事項

ジョブスライスの設定時には以下を考慮してください。

  • スライスされたジョブは、ワークフロージョブを作成してからジョブを作成すること。

  • ジョブスライスはジョブテンプレート、インベントリー、スライス数で構成されること。

  • 実行時に、スライスされたジョブは、各インベントリーを「スライスサイズ」のチャンクに分割します。次に、適切なインベントリーのチャンクごとに、Ansible Playbook 実行のジョブをキューに追加します。Ansible Playbook にフィードしたインベントリーは、元のインベントリーを縮小したバージョンで、特定のスライスのホストだけを含みます。ジョブリストに表示される、完了したスライスジョブは随時、実行済みのスライスジョブ数で、ラベルがつけられます。

_images/sliced-job-shown-jobs-list-view.png
  • スライスされたジョブでのスケジュールの動作は、通常通りです (フォーク数、容量に合わせたキューへの追加、インベントリーマッピングをもとにしたインスタンスグループへの割り当て)。

注釈

ジョブスライスは、ジョブの実行を水平方向にスケーリングすることを目的としています。ジョブテンプレートでジョブスライスを有効にすると、処理対象のインベントリーが起動時に設定されたスライスの数に分割され、スライスごとにジョブが開始されます。

スライスの数は、コントローラーノードの数と同じかそれ以下になることが予想されます。ジョブスライスの数を極端に多く (たとえば、数千) 設定することはできますが、パフォーマンスが低下する可能性があります。これは、ジョブスケジューラーが、スライスされたジョブとなる数千のワークフローノードを同時にスケジュールするように設計されていないためです。

  • スライスされたジョブテンプレートにプロンプトや追加の変数が指定されている場合に、標準のジョブテンプレートと同じ動作をし、スライス後のワークフロージョブに含まれるスライスジョブセット全体に、全変数と制限が適用されます。ただし、スライスされたジョブに制限が課された場合には、この制限が原因で、スライスにホストが割り当てられず、これらのスライスが失敗するので、ジョブ全体が失敗してしまいます。

  • 分散されたジョブのジョブスライスのステータスは、ワークフロージョブと同じ方法で計算されます。サブジョブでの失敗した内容が未処理の場合は、失敗となります。

警告

(個別のホストだけに変更を適用するのではなく) ホスト全体でオーケストレーションを行う予定のジョブは、スライスジョブとして設定しないようにしてください。スライスジョブとして設定してしまうと、ジョブが失敗する可能性があり、automation controller では、スライスジョブとして設定されている場合に、失敗した Playbook の検出や対応は試行されません。

21.2. ジョブスライスの実行動作

ジョブをスライスすると、どのノードでも実行でき、(たとえば、システム内に容量が十分にない場合など) 同時に実行されないことがあります。スライスジョブの実行中は、ジョブの詳細で現在実行中のワークフローとジョブスライス以外に、個別の詳細を確認するためのリンクが表示されます。

_images/sliced-job-shown-jobs-output-view.png

デフォルトでは、ジョブテンプレートは通常同時に実行されるようには設定されていません (API で allow_simultaneous を有効にするか、UI で 同時実行ジョブの有効化 にチェックを入れる必要があります)。スライスすることで、この動作が上書きされ、対象の設定にチェックが入れられていない場合でも allow_simultaneous が有効とみなされます。これの指定方法や、ジョブテンプレート設定でのジョブスライス数の指定方法に関する情報は、「ジョブテンプレート」を参照してください。

ジョブテンプレート」のセクションでは、ユーザーインターフェースの以下の操作を実行する方法が追加で提供されています。

  • スライスジョブが複数あるジョブテンプレートでワークフロージョブを起動する

  • スライスジョブのテンプレート軌道跡にワークフロー全体または個別ジョブをキャンセルする

  • スライスジョブの実行が完了した後にワークフロー全体または個別ジョブを再起動する

  • ジョブテンプレートの起動後にワークフローとスライスジョブに関する情報を表示する

  • スライスジョブ作成後に特定のスライスジョブを検索する (次のセクション「ジョブスライスの検索」を参照)

21.3. ジョブスライスの検索

スライスジョブの検索を簡素化するには、検索機能を使用して検索フィルターを適用します。

  • ジョブリストに適用してスライスジョブだけを表示

  • ジョブリストに適用してジョブスライスの親ワークフロージョブのみを表示

  • ジョブテンプレートリストに適用してスライスジョブを生成するジョブテンプレートのみを表示

ジョブリストのスライスジョブのみを表示するには、他の多くの場合と同様に、タイプ (ここではジョブ) または unified_jobs でフィルタリングできます。

/api/v2/jobs/?job_slice_count__gt=1

ジョブスライスの親ワークフロージョブのみを表示する方法:

/api/v2/workflow_jobs/?job_template__isnull=false

スライスジョブを生成するジョブテンプレートのみを表示する方法:

/api/v2/job_templates/?job_slice_count__gt=1