Ansibleで別のホストのホスト変数にアクセスする方法は?


45

いくつかのデータを収集するホストがあり、それがグループにあるとしましょう[collectors]。グループにホストもいます[reporters]groups['collectors'][0]IPアドレスからレポーターに変数を設定したいと思います。ただし、レポーターを設定するためのプレイブックは[collectors]グループで実行されないため、このホストのファクトは収集されません。IPアドレスをハードコーディングしない方法はありますか?

回答:


87

次のようなことを行うことで、ほとんどすべての在庫ファクト/変数にアクセスできます。

{{ 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がコレクターに関する事実を収集するように強制し、レポーターに対して実行するタスクでそれらを参照できるようにします。

編集#1

Ansibleのバージョン1.8の時点で、ファクトキャッシング機能が利用可能になったことにも言及する必要があることに気付きました。ファクトキャッシングは、プレイブックの実行の間にファクトを保存するためにredisサーバーに依存しています。これを有効にすると、あるプレイブックは、以前に実行された別のプレイブックによって取得されたファクトを参照できます。Ansibleドキュメントの例:

たとえば、数千のホストがある非常に大規模なインフラストラクチャを想像してください。ファクトキャッシングは夜間に実行するように構成できますが、少数のサーバーセットの構成は、アドホックまたは1日を通して定期的に実行できます。ファクトキャッシングを有効にすると、すべてのサーバーを「ヒット」させて変数とそれらに関する情報を参照する必要がなくなります。


2
連想索引を変数として設定する方法はありますか?例では、ansible localhost --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}}"
corretge

上記の回答に追加するには、Ansible FAQを参照してください:docs.ansible.com/ansible/faq.htmlで詳細を説明します。ホストグループのループ処理や、特定のホストを取得するための変数の設定などグループで。
einarc

空のタスクリストを持つノードからファクトを取得するアイデアをありがとう。
ペッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.