第21章 ジョブスライス
スライスされたジョブは、分散ジョブの概念を指します。分散されたジョブは、大多数のホストでジョブを実行する場合に使用し、インベントリーのサブセット上で、複数の Ansible Playbook それぞれを実行することで、クラスターで並行してスケジューリングができます。
デフォルトでは、Ansible は単一のコントロールインスタンスからジョブを実行します。クロスホストオーケストレーションを必要としないジョブの場合、ジョブスライスは、クラスター内の複数のノードに作業を分散する Automation Controller の機能を利用します。
ジョブスライスは、ジョブテンプレートフィールド job_slice_count
を追加することで機能します。これは、Ansible 実行をスライスするジョブの数を指定します。この数値が 1
より大きい場合、Automation controller はジョブではなくジョブテンプレートからワークフローを生成します。インベントリーはスライスジョブ間で均等に分散されます。その後、ワークフロージョブが開始され、通常のワークフローであるかのように処理が進みます。
ジョブを起動すると、API はジョブリソース (job_slice_count = 1 の場合) またはワークフロージョブリソースのいずれかを返します。対応するユーザーインターフェイス (UI) は適切な画面にリダイレクトされ、実行のステータスが表示されます。
21.1. ジョブスライスの留意事項
ジョブスライスの設定時には以下を考慮してください。
- スライスされたジョブはワークフロージョブを作成し、さらにワークフロージョブがジョブを作成します。
- ジョブスライスは、ジョブテンプレート、インベントリー、スライス数で構成されます。
スライスされたジョブが実行されると、各インベントリーがいくつかの「スライスサイズ」のチャンクに分割されます。次に、適切なインベントリーの各チャンクで ansible-playbook 実行のジョブをキューに入れます。ansible-playbook に入力されるインベントリーは、対象となる特定のスライスにあるホストのみを含む元のインベントリーの短縮バージョンです。Jobs リストに表示される完了したスライスジョブには、実行されたスライスジョブの数とともにラベルが付けられます。
スライスされたジョブでのスケジュールの動作は、通常通りです (フォーク数、容量に合わせたキューへの追加、インベントリーマッピングをもとにしたインスタンスグループへの割り当て)。
注記ジョブスライスは、ジョブの実行を水平方向にスケーリングすることを目的としています。ジョブテンプレートでジョブスライスを有効にすると、処理対象のインベントリーが起動時に設定されたスライスの数に分割され、スライスごとにジョブが開始されます。
通常、スライスの数は、コントローラーノードの数と同じかそれ以下になります。ジョブスライスの数を極端に多く (例: 数千) 設定できますが、パフォーマンスが低下する可能性があります。これは、ジョブスケジューラーが、スライスされたジョブとなる数千のワークフローノードを同時にスケジュールするように設計されていないためです。
- プロンプトまたは追加の変数を含むスライスジョブテンプレートは、標準ジョブテンプレートと同じように動作し、結果として得られるワークフロージョブ内のスライスジョブのセット全体にすべての変数と制限を適用します。たださい、スライスされたジョブに制限が課された場合には、この制限が原因で、スライスにホストが割り当てられず、これらのスライスが失敗するので、ジョブ全体が失敗してしまいます。
- 分散されたジョブのジョブスライスのステータスは、ワークフロージョブと同じ方法で計算されます。サブジョブでの失敗した内容が未処理の場合は、失敗となります。
- (個別ホストへの変更適用などではなく) ホスト全体でオーケストレーションする予定のジョブは、スライスジョブとして設定しないでください。
- スライスジョブとして設定されたジョブは失敗する可能性があり、automation controller は、スライスジョブとして実行して失敗する Playbook の検出や説明は行いません。