この問題は、次の例で最もよく説明されています。
2つの役割があります。
mailserver
:基本的なメールサーバー構成mailinglist
:メーリングリストアプリケーションメーリングリストソフトウェアは、受信メールをメーリングリストソフトウェアの「仮想受信ボックス」に転送するためにメールサーバーを必要とします。これには、メールサーバーの構成が必要です。ただし、メールサーバーは、メーリングリストの役割や、同様の構成要件を持つ他の役割については認識していません。
私がしたいのはこれです:
mailinglist
(および他の同様の役割)は、トランスポート構成を変数transport_config
に格納します。これは、$ email => $ spoolのような「トランスポートマップ」である可能性があります。mailinglist
は、mailserver
の役割によって異なります。mailserver
は、変数transport_config
を使用して「トランスポート」を構成します。Ansibleでこのようなことをする方法はありますか?またはこの問題の別の解決策?メールサーバーによっては複数のロールが存在する可能性があるため、{role: mailserver, transport_config: ...}
のようなロール変数を使用することは可能ですnot。
私が考えることができるのは回避策です。メールサーバーは、トランスポートマップが定義されている構成ディレクトリを読み取り/解析します。 mailinglist
およびその他の役割は、このディレクトリにファイルを追加します。ここでの問題は、このような構成ディレクトリを読み取り、メイン構成ファイルを生成する「構成ビルダー」が必要になることが多いことです。
「構成ビルダー」についてのコメントに応えて、 ansibleモジュールのアセンブル を参照してください。トリッキーな部分は、アセンブルモジュールを実行する前に、すべてのファイルを1か所にまとめることです。
それ以外の場合は、timaによるHost_およびgroup_varsの提案は理にかなっています。
これは、 ロールの依存関係 を使用して実行できます。
roles/mailinglist/meta/main.yml
の下のmailinglist
ロールに、次のようなものを追加します。
---
dependencies:
- { role: mailserver, transport_config: ... }
他の同様の役割についても同じようにします。
私はこれが長い間答えられていることを知っています、しかし私はただ実行可能な解決策を見つけただけで、それは少し卑劣です。
3番目のsettings
ロールを使用します。これにはタスクがなく、defaults/main.yml
の変数のみが含まれます。ドキュメントはこれについて少しあいまいですが、ここの値はすべてのdependentロールに波及するため、両方のロールがmeta/main.yml
ファイルを介してsettings
に依存している場合、両方が共通の値のセット。これらは、通常の方法でgroup_vars
ファイルを介してオーバーライドできます。
驚いたことに、そうです、settings
ロールは複数回使用されているので、タスクがないので問題ではなく、データはそこから依存関係のチェーンを上って流れることができます。
これは、Ansibleのまったく新しい形式のデータフローであり、可能だとは知りませんでした。
mailserver
構成ファイルをdotdee
のようなもので管理することを検討してください。
dotdee
を使用して、.d
ディレクトリに配置された一連のファイルから最終的な構成ファイルをアセンブルします。
あなたの場合、mailinglist
に依存するmailserver
ロールなどは、構成スニペットを.d
ディレクトリ(mailserver
ロールによって作成)にドロップし、コマンドを実行します。 dotdee --update /path/to/mailserver/conf
のようなmailserver
構成ファイルを更新します。
確かに、ここでのアプリについては十分に理解していませんが、ホスト変数またはグループ変数を使用して構成をロールに渡す方がよいと思います。ロールはデフォルトなどを保持でき、個別に設定したホスト/グループ変数の値を取得することを期待できます。これは、各アプリインスタンスを精神的なホストではなくホストとして扱うことを意味する場合があります。モデル化の方法は、ワークフロー、構成、アプリの多くの細かい点によって異なります。
この最近のスレッドは、この種のことのいくつかに触れています: https://groups.google.com/forum/#!topic/ansible-project/yrnsx2Mw6rc