私はローカル開発環境(複数のVM)をセットアップするために使用しているかなり複雑なAnsibleプロジェクトの前に座っており、Ansibleによって収集されたファクトを使用して/etc/hosts
すべてのVM上のファイル。残念ながら、(-limitパラメーターを使用して)1つのホストのみのプレイブックを実行したい場合、他のホストのファクトが(明らかに)欠落しています。
プレイブックを特定の1つのホストに制限した場合でも、Ansibleにすべてのホストのファクトを収集させる方法はありますか?
すべてのホストからファクトを収集するためにプレイブックにプレイを追加しようとしましたが、もちろん-limitパラメータで指定された1つのホストに制限されます。このプレイを他のプレイよりも前にすべてのホストで強制的に実行する方法があれば、それは完璧です。
私は少しググってみましたが、redisによるファクトキャッシングのソリューションを見つけましたが、私たちのプレイブックはローカルで使用されているため、追加のソフトウェアの必要性を避けたかったのです。私はそれが大したことではないことを知っていますが、私は単に「よりクリーンな」Ansibleのみのソリューションを探していて、それが存在するかどうか疑問に思っていました。
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
...
一般に、すべてのホストでタスクを実行したくない場合でも、すべてのホストのファクトを取得するには、次のようにします。
- hosts: all
tasks: [ ]
しかし、あなたが述べたように、--limitパラメータはこれが適用されるホストを制限します。
プレイで--limitパラメータを無視するようにAnsibleに単純に指示する方法はないと思います。ただし、Ansible内で完全にやりたいことを行う別の方法がある場合があります。
私は個人的には使用していませんが、Ansible 1.8以降は ファクトキャッシング を使用できます。簡単に言えば、ファクトキャッシングを有効にすると、Ansibleはredisサーバーを使用して、遭遇するホストに関するすべてのファクトをキャッシュし、その後のプレイブックでそれらを参照できるようになります。
ファクトキャッシュを有効にすると、現在の/ usr/bin/ansible-playbookの実行では通信されていないにもかかわらず、あるグループのマシンが他のグループのマシンに関する変数を参照する可能性があります。
これは2016年にまだ明確な解決策がない場合の問題のようですが、Ansibleの新しいバージョンは「jsonfile」ファクトキャッシングバックエンドを提供します。今、私はansible all -m setup
でプレイブックを実行する前に--limit
オプション。ジャズには十分!
http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching
プレイブックを次のように変更できます。
...
- hosts: "{{ limit_hosts|default('default_group') }}"
tasks:
...
...
そして、それを実行すると、some_var
が定義されていない場合(通常の状態)、default_group
インベントリグループで実行されますが、次のように実行すると、
ansible-playbook --extra-vars "limit_hosts=myHost" myplaybook.yml
次に、それはあなたのmyHost
でのみ実行されますが、ファクトの収集や実際には他の何かのために、異なるhosts: ..
宣言を持つ他のセクションを持つこともできます。