このエントリーをはてなブックマークに追加

AnsibleのFact Cachingを使う

この記事はAnsible Advent Calendar 2014の3日目の記事です。

注釈

初出時まったくのデタラメ書いていました。申し訳ございません!

Fact Cachingとは、Ansible 1.8から導入された機能で、Factを他のホストからも使えるようにする機能です。

webサーバーとdbサーバーの2つがあり、webサーバーはdbサーバーのアドレスを知らなければならない、としましょう。このためには、

- hosts: db
  tasks: []

- hosts: web
  tasks:
    - template: ...

とし、webサーバーに対するtemplateで{{hostvars['db']['ansible_os_family'] }}としてdbのアドレスを使えます。

こうすればできますが、webサーバーに対するplaybookなのにまずdbサーバーに対して実行しなければなりません。Fact Cachingは一定時間取得したFactをキャッシュしておくことで、dbサーバーに対するplaybook実行をする必要がなくなります。

Fact Cachingを使ってみる

デフォルトでは無効化されているので、以下の設定をansible.cfgに記載します。

[defaults]
fact_caching = redis
fact_caching_timeout = 86400 # seconds

キャッシュしたfactを保存する場所は現在のところredisのみです。

redisに保存する

redisを使うには、redisのpythonライブラリを入れる必要があるので、

pip install redis

する必要がります。

ちなみにredisには以下の2つのkeyが登録されるようです。

  • "ansible_cache_keys"
  • "ansible_factstargetmachine"

ファイルに保存する

ドキュメントには書かれていませんが、redisの他に

  • jsonfile
  • memcached
  • memory

が使えます。このうちjsonfileを使うにはこうします。

[defaults]
fact_caching = jsonfile
fact_caching_connection = /tmp/cache
fact_caching_timeout = 86400 # seconds

が、まだこの辺りは公式ではないので流動的なのと、日本語が入っていると

https://github.com/ansible/ansible/blob/60b51ef6c3e4eeca5ee1170ba32bc39284db97ae/lib/ansible/utils/__init__.py#L232

のあたりでJSONを書き出せずにこけたりするので、しばしお待ちください。(Issueあげ中)