# AWX as an Ansible Fact Cache AWX can store and retrieve per-host facts via an Ansible Fact Cache Plugin. This behavior is configurable on a per-job-template basis. When enabled, AWX will serve fact requests for all Hosts in an Inventory related to the Job running. This allows users to use Job Templates with `--limit` while still having access to the entire Inventory of Host facts. ## AWX Fact Cache Implementation Details ### AWX Injection In order to understand the behavior of AWX as a fact cache you will need to understand how fact caching is achieved in AWX. When a Job launches with `use_fact_cache=True`, AWX will write all `ansible_facts` associated with each Host in the associated Inventory as JSON files on the local file system (one JSON file per host). Jobs invoked with `use_fact_cache=False` will not write `ansible_facts` files. ### Ansible plugin usage When `use_fact_cache=True`, Ansible will be configured to use the `jsonfile` cache plugin. Any `get()` call to the fact cache interface in Ansible will result in a JSON file lookup for the host-specific set of facts. Any `set()` call to the fact cache will result in a JSON file being written to the local file system. ### AWX Cache to DB When a Job with `use_fact_cache=True` finishes running, AWX will look at all of the local JSON files that represent the fact data. Any records with file modification times that have increased (because Ansible updated the file via `cache.set()`) will result in the latest value being saved to the database. On subsequent playbook runs, AWX will _only_ inject cached facts that are _newer_ than `settings.ANSIBLE_FACT_CACHE_TIMEOUT` seconds. ## AWX Fact Logging New and changed facts will be logged via AWX's logging facility. Specifically, to the `system_tracking` namespace or logger. The logging payload will include the fields: `host_name`, `inventory_id`, and `ansible_facts`. Where `ansible_facts` is a dictionary of all ansible facts for `host_name` in AWX Inventory `inventory_id`. ## Integration Testing * ensure `clear_facts` set's `hosts//ansible_facts` to `{}` * ensure that `gather_facts: False` does NOT result in clearing existing facts * ensure that the when a host fact timeout is reached, that the facts are not used from the cache