web-dev-qa-db-ja.com

依存ロールを使用してAnsibleロールを構成する

この問題は、次の例で最もよく説明されています。

2つの役割があります。

  • mailserver:基本的なメールサーバー構成
  • mailinglist:メーリングリストアプリケーション

メーリングリストソフトウェアは、受信メールをメーリングリストソフトウェアの「仮想受信ボックス」に転送するためにメールサーバーを必要とします。これには、メールサーバーの構成が必要です。ただし、メールサーバーは、メーリングリストの役割や、同様の構成要件を持つ他の役割については認識していません。

私がしたいのはこれです:

  • mailinglist(および他の同様の役割)は、トランスポート構成を変数transport_configに格納します。これは、$ email => $ spoolのような「トランスポートマップ」である可能性があります。
  • mailinglistは、mailserverの役割によって異なります。
  • mailserverは、変数transport_configを使用して「トランスポート」を構成します。

Ansibleでこのようなことをする方法はありますか?またはこの問題の別の解決策?メールサーバーによっては複数のロールが存在する可能性があるため、{role: mailserver, transport_config: ...}のようなロール変数を使用することは可能ですnot

私が考えることができるのは回避策です。メールサーバーは、トランスポートマップが定義されている構成ディレクトリを読み取り/解析します。 mailinglistおよびその他の役割は、このディレクトリにファイルを追加します。ここでの問題は、このような構成ディレクトリを読み取り、メイン構成ファイルを生成する「構成ビルダー」が必要になることが多いことです。

11
Christian

「構成ビルダー」についてのコメントに応えて、 ansibleモジュールのアセンブル を参照してください。トリッキーな部分は、アセンブルモジュールを実行する前に、すべてのファイルを1か所にまとめることです。

それ以外の場合は、timaによるHost_およびgroup_varsの提案は理にかなっています。

4
encoded

これは、 ロールの依存関係 を使用して実行できます。

roles/mailinglist/meta/main.ymlの下のmailinglistロールに、次のようなものを追加します。

---
dependencies:
  - { role: mailserver, transport_config: ... }

他の同様の役割についても同じようにします。

20
Ben Whaley

私はこれが長い間答えられていることを知っています、しかし私はただ実行可能な解決策を見つけただけで、それは少し卑劣です。

3番目のsettingsロールを使用します。これにはタスクがなく、defaults/main.ymlの変数のみが含まれます。ドキュメントはこれについて少しあいまいですが、ここの値はすべてのdependentロールに波及するため、両方のロールがmeta/main.ymlファイルを介してsettingsに依存している場合、両方が共通の値のセット。これらは、通常の方法でgroup_varsファイルを介してオーバーライドできます。

驚いたことに、そうです、settingsロールは複数回使用されているので、タスクがないので問題ではなく、データはそこから依存関係のチェーンを上って流れることができます。

これは、Ansibleのまったく新しい形式のデータフローであり、可能だとは知りませんでした。

2
Stuart Watt

mailserver構成ファイルをdotdeeのようなもので管理することを検討してください。

dotdeeを使用して、.dディレクトリに配置された一連のファイルから最終的な構成ファイルをアセンブルします。

あなたの場合、mailinglistに依存するmailserverロールなどは、構成スニペットを.dディレクトリ(mailserverロールによって作成)にドロップし、コマンドを実行します。 dotdee --update /path/to/mailserver/confのようなmailserver構成ファイルを更新します。

2
LeoRochael

確かに、ここでのアプリについては十分に理解していませんが、ホスト変数またはグループ変数を使用して構成をロールに渡す方がよいと思います。ロールはデフォルトなどを保持でき、個別に設定したホスト/グループ変数の値を取得することを期待できます。これは、各アプリインスタンスを精神的なホストではなくホストとして扱うことを意味する場合があります。モデル化の方法は、ワークフロー、構成、アプリの多くの細かい点によって異なります。

この最近のスレッドは、この種のことのいくつかに触れています: https://groups.google.com/forum/#!topic/ansible-project/yrnsx2Mw6rc

0
tima