How to add something to ansible_facts?

Hi,
maybe I am being stupid here, but why doesn’t it work, that when I call the

set_fact

module, and then run the

setup

module, my newly set fact is not returned?
What else do I have to do?

You can start by providing an example playbook.

For example:

`

  • name: Get date
    command curl http://some-url
    register: my_date

  • name: Set fact
    set_fact:
    my_date_as_fact: my_date

  • name: Gather facts
    setup:
    register: {{ ansible_facts }}

  • name: Print facts
    debug: msg={{ ansible_facts }}

`

“my_date_as_fact” is not included in the output.

Hi there,

Try doing,

-name: Set fact
set_fact:
my_date_as_fact: my_date

That is what I have, it was a typo in my post.

This is what I have now, and it is still not working.

`

  • name: Get app version
    command: curl -H application/json localhost:8088/rs
    register: get_version
    ignore_errors: true

  • name: Set app version as fact
    set_fact:
    fact_app_version:
    app_version: “{{ ((get_version | default({‘stdout’:‘N/A’})).stdout | from_json).version }}”
    ignore_errors: true

  • name: Gather facts
    setup:
    register: ansible_facts

  • name: Send facts somewhere
    local_action:
    module: uri
    url: “{{ some_url }}”
    method: PUT
    body: “{{ ansible_facts | combine(fact_app_version) | to_json }}”
    status_code: 204
    body_format: json

`

The error is:

`
FAILED! => {“failed”: true, “msg”: “the field ‘args’ has an invalid value (), and could not be converted to an dict. Error was: No JSON object could be decoded\n\nThe error appears to have been in ‘update-facts.yml’: line 18, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Set app version as fact\n ^ here\n”}

`

I am fairly certain what I am trying to do should be rather simply, however the more I dig into it, the uglier it gets.
I want to add an optional fact to the dictionary of facts, and then send all facts somewhere.

What is the suggested approach do accomplish this?

This is what I have now, and it is still not working.
- name: Get app version
  command: curl -H application/json localhost:8088/rs
  register: get_version
  ignore_errors: true

- name: Set app version as fact
  set_fact:
    fact_app_version:
          app_version: "{{ ((get_version |
default({'stdout':'N/A'})).stdout | from_json).version }}"
  ignore_errors: true

- name: Gather facts
  setup:
  register: ansible_facts

Remove the register:, you don't need it.
If gather_facts is set to true you can remove the entire "Gather facts" task.

- name: Send facts somewhere
  local_action:
    module: uri
    url: "{{ some_url }}"
    method: PUT
    body: "{{ ansible_facts | combine(fact_app_version) | to_json }}"
    status_code: 204
    body_format: json

Change body to
body: "{{ hostvars[inventory_hostname] }}"

I am fairly certain what I am trying to do should be rather simply, however
the more I dig into it, the uglier it gets.
I want to add an optional fact to the dictionary of facts, and then send
all facts somewhere.
What is the suggested approach do accomplish this?

hostvars should contain all you need as it contains all your facts, variables and groups.

@Kai Stian Olstad

Thank you, the magic that is hostvars[inventory_hostname] was exactly what I was looking for!

However I do have another question:

Is there a way to easily filter this list to at least exclude the temporary variables that got introduced during the playbook run, for example from “register” ?