私はAnsibleを--limitで動作させようとしています。そのためには、fact_cachingでキャッシュしている他のホストに関するファクトが必要です。タスクを実行せずに、すべてのホスト上のすべてのファクトを収集してキャッシュするために、どのコマンドを実行する必要がありますか? setup module のようなものは、収集した事実をキャッシュすれば完璧ですが、そうではないようです。
これが私が問題を解決する方法です:
1.-プレイブック(site.yml)でファクト収集を有効にします:
gather_facts: yes
2.-ansible.cfgで ファクトキャッシング を有効にします:
2.1.-オプション1-redisをインストールする時間がある場合は、これを使用します。
[defaults]
gathering = smart
fact_caching = redis
# two hours timeout
fact_caching_timeout = 7200
2.2.-オプション2-これを使用して今すぐテストするのは簡単ですが、redisよりも遅くなります。
[defaults]
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/facts_cache
# two hours timeout
fact_caching_timeout = 7200
3.-ファクトキャッシュを更新または作成します。これを行うには、実行pingという1つのタスクだけで新しいロール(キャッシュ更新)を作成します。 pingを使用するのは、これが最も単純で最速のansibleタスクであるため、キャッシュを非常に高速に更新するのに役立ちます。
- name: Pinging server to update facts cache
ping:
ご挨拶、
1行だけで新しいプレイブックを作成する:
- hosts: all
それを実行すると、すべてのファクトが収集され、fact_cachingがオンの場合、-limitを使用して将来のプレイブックで使用するためにそれらがキャッシュされます。
以下は、/usr/bin/ansible
を使用して、ファクトを収集し、指定されたディレクトリに格納するアドホックタスクを実行する方法を示す例です。
$ ANSIBLE_CONFIG=facts.cfg ansible r4i1 -i lab -m setup
facts.cfg
の内容は次のとおりです
[defaults]
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /home/lab/facts
そして、ホストの出力の例
$ head /home/lab/facts/r4i1
{
"ansible_all_ipv4_addresses": [
"10.10.20.89"
],
"ansible_all_ipv6_addresses": [
"fe80::46a8:42ff:fe18:141c"
],
"ansible_apparmor": {
"status": "disabled"
},
絶対的な最速の方法は、バージョン1.8で導入されたAnsibleの ファクトキャッシング を利用することです。ファクトを保存するにはredisサーバーを使用する必要がありますが、プレイブックの実行の間にファクトを保存できます。ドキュメントに記載されているように:
たとえば、何千ものホストを持つ非常に大規模なインフラストラクチャを想像してみてください。ファクトキャッシングは夜間に実行するように構成できますが、サーバーの小さなセットの構成はアドホックまたは1日を通して定期的に実行できます。ファクトキャッシングが有効になっていると、変数とそれらに関する情報を参照するためにすべてのサーバーを「ヒット」する必要はありません。
--limitの問題は、ansibleが対話するすべてのホストを制限するため、all
のような特別なホストグループが影響を与えることさえ制限することです。 --limitを使用せず、代わりにホストグループを使用した場合は、次のようにすることができます。
---
- hosts: all
tasks: []
- hosts: my_Host_group
tasks:
- name: task1
...
- name: task2
...
この例では、最初のプレイで、hosts: all
を指定してから、所有しているすべてのホストのファクトを強制的に収集します。 2回目のプレイでは、グループmy_Host_group
内のホストで目的のタスクを実行します。