いくつかのデータを収集するホストがあり、それがグループ[collectors]
にあるとします。グループ[reporters]
にもホストがいます。だから私はgroups['collectors'][0]
IPアドレスからレポーターに変数を設定したいと思います。ただし、レポーターを設定するためのハンドブックは[collectors]
グループでは実行されないため、このホストのファクトは収集されません。 IPアドレスをハードコーディングしない方法はありますか?
次のようなことを行うことで、ほぼすべての在庫情報/変数にアクセスできます。
{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}
または、グループへのインデックスを使用して実行する場合:
{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}
大きなトリックは、関心のあるすべてのホスト/グループのファクトを収集する必要があるということです。そのため、レポーターグループに対して実行するプレイブックを変更して、適用されるノーオペレーション(ダミー)タスクを含めます。コレクターグループに。これにより、Ansibleはコレクターホストに関する事実を収集し、レポーターグループからアクセスできるようになります。したがって、レポーターハンドブックの上部に次のようなものを追加することができます。
- hosts: collectors
name: Gather facts from collectors
tasks: [ ]
空のブラケットは基本的にタスクが実行されないことを意味しますが、これによりAnsibleはコレクターに関する事実を収集するように強制され、レポーターに対して実行するタスクでそれらを参照できるようになります。
Ansibleのバージョン1.8の時点で、現在利用可能な fact-caching 機能があることにも触れなければならないことに気付きました。ファクトキャッシングは、Redisサーバーに依存して、プレイブックの実行間でファクトを保存します。これを有効にすると、1つのプレイブックが、以前に実行された別のプレイブックによって取得されたファクトを参照できます。 Ansibleドキュメントの例:
たとえば、何千ものホストを持つ非常に大規模なインフラストラクチャを想像してみてください。ファクトキャッシングは夜間に実行するように構成できますが、少数のサーバーセットの構成はアドホックまたは1日を通して定期的に実行できます。ファクトキャッシュが有効になっている場合、変数とそれらに関する情報を参照するためにすべてのサーバーを「ヒット」する必要はありません。