web-dev-qa-db-ja.com

すべてのホストでファクト収集を強制する

私はローカル開発環境(複数のVM)をセットアップするために使用しているかなり複雑なAnsibleプロジェクトの前に座っており、Ansibleによって収集されたファクトを使用して/etc/hostsすべてのVM上のファイル。残念ながら、(-limitパラメーターを使用して)1つのホストのみのプレイブックを実行したい場合、他のホストのファクトが(明らかに)欠落しています。

プレイブックを特定の1つのホストに制限した場合でも、Ansibleにすべてのホストのファクトを収集させる方法はありますか?

すべてのホストからファクトを収集するためにプレイブックにプレイを追加しようとしましたが、もちろん-limitパラメータで指定された1つのホストに制限されます。このプレイを他のプレイよりも前にすべてのホストで強制的に実行する方法があれば、それは完璧です。

私は少しググってみましたが、redisによるファクトキャッシングのソリューションを見つけましたが、私たちのプレイブックはローカルで使用されているため、追加のソフトウェアの必要性を避けたかったのです。私はそれが大したことではないことを知っていますが、私は単に「よりクリーンな」Ansibleのみのソリューションを探していて、それが存在するかどうか疑問に思っていました。

23
tehK

Ansibleバージョン2では、委任されたファクトを使用してこれを行うためのクリーンで公式な方法が導入されました(参照: http://docs.ansible.com/ansible/latest/playbooks_delegation.html#delegated-facts )。

when: hostvars[item]['ansible_default_ipv4'] is not definedは、すでに事実を知っているホスト内の事実をチェックしないことを確認するためのチェックです。

---
# This play will still work as intended if called with --limit "<Host>" or --tags "some_tag"

- name: Hostfile generation
  hosts: all
  become: true

  pre_tasks:
    - name: Gather facts from ALL hosts (regardless of limit or tags)
      setup:
      delegate_to: "{{ item }}"
      delegate_facts: True
      when: hostvars[item]['ansible_default_ipv4'] is not defined
      with_items: "{{ groups['all'] }}"

  tasks:
    - template:
        src: "templates/hosts.j2"
        dest: "/etc/hosts"
      tags:
        - hostfile

     ...
20
corford

一般に、すべてのホストでタスクを実行したくない場合でも、すべてのホストのファクトを取得するには、次のようにします。

- hosts: all
  tasks: [ ]  

しかし、あなたが述べたように、--limitパラメータはこれが適用されるホストを制限します。

プレイで--limitパラメータを無視するようにAnsibleに単純に指示する方法はないと思います。ただし、Ansible内で完全にやりたいことを行う別の方法がある場合があります。

私は個人的には使用していませんが、Ansible 1.8以降は ファクトキャッシング を使用できます。簡単に言えば、ファクトキャッシングを有効にすると、Ansibleはredisサーバーを使用して、遭遇するホストに関するすべてのファクトをキャッシュし、その後のプレイブックでそれらを参照できるようになります。

ファクトキャッシュを有効にすると、現在の/ usr/bin/ansible-playbookの実行では通信されていないにもかかわらず、あるグループのマシンが他のグループのマシンに関する変数を参照する可能性があります。

10
Bruce P

これは2016年にまだ明確な解決策がない場合の問題のようですが、Ansibleの新しいバージョンは「jsonfile」ファクトキャッシングバックエンドを提供します。今、私はansible all -m setupでプレイブックを実行する前に--limitオプション。ジャズには十分!

http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching

6
mwp

プレイブックを次のように変更できます。

...
- hosts: "{{ limit_hosts|default('default_group') }}"
  tasks:
    ...
...

そして、それを実行すると、some_varが定義されていない場合(通常の状態)、default_groupインベントリグループで実行されますが、次のように実行すると、

ansible-playbook --extra-vars "limit_hosts=myHost" myplaybook.yml

次に、それはあなたのmyHostでのみ実行されますが、ファクトの収集や実際には他の何かのために、異なるhosts: ..宣言を持つ他のセクションを持つこともできます。

1
Arik Kfir