再利用可能な 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 では include
と import
の概念が導入されています。
include*
タスク (include_tasks
、include_role
など) を使用する場合は、動的 になります。
import*
タスク (import_playbook
、import_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 グループの一覧をご覧ください。