再利用可能な Playbook の作成

非常に大きな 1 つのファイルで Playbook を作成することは可能ですが (この方法で Playbook の学習を開始できます)、最終的にはファイルを再利用し、整理し始めます。Ansible では、これにはインクルード、インポート、およびロールの 3 つの方法があります。

インクルードおよびインポート (Ansible バージョン 2.4 で追加) を使用すると、大規模な Playbook を小さなファイルに分類できます。これは、複数の親 Playbook 全体で使用したり、同じ Playbook 内で複数回使用したりできます。

ロールを使用すると、複数のタスクを一緒にパッケージ化でき、変数、ハンドラー、またはモジュールやその他のプラグインを含めることができます。ロールはインクルードやインポートとは異なり、Ansible Galaxy を使用してアップロードおよび共有することもできます。

動的または静的

Ansible には再利用可能なコンテンツに対する操作モード (動的および静的) があります。

Ansible 2.0 では、動的 のインクルードの概念が導入されました。このようにすべてのインクルードを動的にすることにはいくつかの制限があるため、インクルードを 静的 に強制する機能は Ansible 2.1 で導入されました。include タスクは、静的構文と動的構文の両方を包含するため過負荷になるため、またタスクに設定したその他のオプションに基づいて include のデフォルト動作が変更する可能性があるため、Ansible 2.4 では includeimport の概念が導入されています。

include* タスク (include_tasksinclude_role など) を使用する場合は、動的 になります。 import* タスク (import_playbookimport_tasks など) を使用する場合は 静的 になります。

最小限の include タスク (Task ファイルおよび Playbook レベルの両方に使用) は引き続き利用できますが、非推奨 と見なされています。

動的と静的の相違点

操作のモードの 2 つは非常にシンプルです。

  • 動的な include は、そのタスクが発生した時点でランタイム時に処理されます。
  • Ansible は、Playbook の解析時にすべての静的インポートを事前に処理します。

タグ や条件付きステートメント (when:) などの Ansible タスクオプションが表示されます。

  • 動的 include の場合、タスクオプションは評価される動的タスクに のみ 適用され、子タスクにはコピーされません。
  • 静的インポートの場合、親タスクのオプションはインポート内に含まれるすべての子タスクにコピーされます。

Note

ロールは特殊なケースです。Ansible 2.3 よりも前のバージョンでは、ロールは常に特定のプレイの特殊な roles: オプションを使用して静的に組み込まれ、(pre_tasks が使用されていない限り) 他のプレイタスクの前に常に実行されていました。ロールはそのまま使用できますが、Ansible 2.3 では include_role オプションが導入され、ロールを他のタスクとインラインで実行できるようになりました。

インクルードとインポートのトレードオフと落とし穴

include*import* の使用には、いくつかの利点と、使用時に考慮すべきトレードオフがあります。

include* ステートメントを使用する主な利点はループです。インクルードでループが使用されると、インクルードされたタスクまたはロールが、ループの各項目に対して 1 回実行されます。

include* の使用には、import* ステートメントと比較するといくつかの制限があります。

  • 動的なインクルードにのみ存在するタグは、--list-tags 出力には表示されません。
  • 動的なインクルード内のタスクのみが --list-tasks 出力に表示されません。
  • notify を使用して、動的なインクルード内から取得したハンドラー名をトリガーすることはできません (以下の注記を参照してください)。
  • --start-at-task を使用して、動的なインクルード内のタスクで実行を開始することはできません。

import* を使用すると、動的インクルードには以下のような制限があります。

  • 上記のように、インポートではループを使用できません。
  • ターゲットファイルまたはロール名に変数を使用する場合、インベントリーソース (host/group 変数など) からの変数は使用できません。
  • インポートすると、ハンドラーの名前付きタスクがインポートされたタスクリストで上書きされるため、import* を使用するハンドラーは、名前で通知されてもトリガーとなりません。

Note

動的タスクでの notify の使用については、動的インクルード自体をトリガーしても構いません。これにより、インクルード内のすべてのタスクが実行されます。

See also

Utilities modules
ここで説明する include* モジュールおよび import* モジュールに関するドキュメント
Playbook の使用
基本的な Playbook 言語機能を確認します。
変数の使用
Playbook の変数の詳細
条件 (Conditional)
Playbook の条件
ループ
Playbook のループ
ベストプラクティス
実際の Playbook の管理に関するさまざまなヒント
Galaxy ユーザーガイド
Galaxy (ロール管理) におけるロールの共有方法
GitHub Ansible examples
Github プロジェクトソースにあるすべての Playbook ファイル
メーリングリスト
ご質問はございますか。サポートが必要ですか。ご提案はございますか。 Google グループの一覧をご覧ください。