Json and local facts.

Hi,

I am working on some tasks related with local facts and not sure whether followig issue is a bug or is designed.
Following ansible documentation localfacts can be in JSON or INI format. I’ve choosen JSON format - is much more easier to write variables like this:

module:
name: “apache”
version: “1.0.4”
status: “Installed”

Saving this with following task brings result:

  • name: Write variable to json file
    copy: content=“{{ module }}” dest=/etc/ansible/facts.d/{{ module.name }}.fact
    owner=root group=root mode=0644

Result:
{‘status’: ‘Installed’, ‘version’: ‘1.0.4’, ‘name’: ‘apache’}

However python is not able read this anymore - including ansible:

ok: [IP-HERE] => {
“msg”: “work - variable: {u’apache’: u’error loading fact - please check content’}”
}

Command from python:

cat apache.fact | python -mjson.tool

Expecting property name: line 1 column 1 (char 1)

Converting this local facts with following task / command - automatically allow read this file by python and ansible.

  • name: Fix wrong json format in local facts
    shell: sed -i “s/'/"/g” *.fact chdir=/etc/ansible/facts.d/

Could you advice whether I should raise this on Github bug list or this is working exectly as should?

Best regards,
Marcin Praczko

Anyone has clue for this question, we have same issue, we are doing something like:

At one ansible playbook, to collect some local facts, and save those facts into a file (using copy content), the saved file looks like:

{u’status’: u’Installed’, u’version’: u’1.0.4’, u’name’: u’apache’}

Later on, there is other ansible playbook will load those facts back in (using local_vars), even we replace the single quote, the facts file still cannot be loaded back, because there is leading “u” at each element,

Thanks
Jack

You should be using the “to_json” filter to convert the python data structure to JSON. Or potentially even the “to_nice_json” filter.

Such as:

  • name: Write variable to json file
    copy: content=‘{{ module|to_json }}’ dest=/etc/ansible/facts.d/{{ module.name }}.fact
    owner=root group=root mode=0644

That works, thank you so much.