---
- name: the first play
  hosts: localhost
  tasks:
    - name: show foobar fact before
      debug:
        var: ansible_foobar

    - name: set a persistent fact foobar
      set_fact:
        ansible_foobar: 'foobar_from_set_fact_cacheable'
        cacheable: true

    - name: show foobar fact after
      debug:
        var: ansible_foobar

    - name: assert ansible_foobar is correct value
      assert:
        that:
          - ansible_foobar == 'foobar_from_set_fact_cacheable'

    - name: set a non persistent fact that will not be cached
      set_fact:
        ansible_foobar_not_cached: 'this_should_not_be_cached'

    - name: show ansible_foobar_not_cached fact after being set
      debug:
        var: ansible_foobar_not_cached

    - name: assert ansible_foobar_not_cached is correct value
      assert:
        that:
          - ansible_foobar_not_cached == 'this_should_not_be_cached'

    - name: set another non persistent fact that will not be cached
      set_fact: "cacheable=no fact_not_cached='this_should_not_be_cached!'"

    - name: show fact_not_cached fact after being set
      debug:
        var: fact_not_cached

    - name: assert fact_not_cached is correct value
      assert:
        that:
          - fact_not_cached == 'this_should_not_be_cached!'

    - name: show foobar fact before (FQCN)
      debug:
        var: ansible_foobar_fqcn

    - name: set a persistent fact foobar (FQCN)
      set_fact:
        ansible_foobar_fqcn: 'foobar_fqcn_from_set_fact_cacheable'
        cacheable: true

    - name: show foobar fact after (FQCN)
      debug:
        var: ansible_foobar_fqcn

    - name: assert ansible_foobar_fqcn is correct value (FQCN)
      assert:
        that:
          - ansible_foobar_fqcn == 'foobar_fqcn_from_set_fact_cacheable'

    - name: set a non persistent fact that will not be cached (FQCN)
      set_fact:
        ansible_foobar_not_cached_fqcn: 'this_should_not_be_cached'

    - name: show ansible_foobar_not_cached_fqcn fact after being set (FQCN)
      debug:
        var: ansible_foobar_not_cached_fqcn

    - name: assert ansible_foobar_not_cached_fqcn is correct value (FQCN)
      assert:
        that:
          - ansible_foobar_not_cached_fqcn == 'this_should_not_be_cached'

    - name: set another non persistent fact that will not be cached (FQCN)
      set_fact: "cacheable=no fact_not_cached_fqcn='this_should_not_be_cached!'"

    - name: show fact_not_cached_fqcn fact after being set (FQCN)
      debug:
        var: fact_not_cached_fqcn

    - name: assert fact_not_cached_fqcn is correct value (FQCN)
      assert:
        that:
          - fact_not_cached_fqcn == 'this_should_not_be_cached!'

- name: the second play
  hosts: localhost
  tasks:
    - name: show foobar fact after second play
      debug:
        var: ansible_foobar

    - name: assert ansible_foobar is correct value
      assert:
        that:
          - ansible_foobar == 'foobar_from_set_fact_cacheable'

    - name: show foobar fact after second play (FQCN)
      debug:
        var: ansible_foobar_fqcn

    - name: assert ansible_foobar is correct value (FQCN)
      assert:
        that:
          - ansible_foobar_fqcn == 'foobar_fqcn_from_set_fact_cacheable'

- name: show ansible_nodename and ansible_os_family
  hosts: localhost
  tasks:
    - name: show nodename fact after second play
      debug:
        var: ansible_nodename
    - name: show os_family fact after second play (FQCN)
      debug:
        var: ansible_os_family

- name: show ansible_nodename and ansible_os_family overridden with var
  hosts: localhost
  vars:
    ansible_nodename: 'nodename_from_play_vars'
    ansible_os_family: 'os_family_from_play_vars'
  tasks:
    - name: show nodename fact after second play
      debug:
        var: ansible_nodename
    - name: show os_family fact after second play (FQCN)
      debug:
        var: ansible_os_family

- name: verify ansible_nodename from vars overrides the fact
  hosts: localhost
  vars:
    ansible_nodename: 'nodename_from_play_vars'
    ansible_os_family: 'os_family_from_play_vars'
  tasks:
    - name: show nodename fact
      debug:
        var: ansible_nodename

    - name: assert ansible_nodename is correct value
      assert:
        that:
          - ansible_nodename == 'nodename_from_play_vars'

    - name: show os_family fact (FQCN)
      debug:
        var: ansible_os_family

    - name: assert ansible_os_family is correct value (FQCN)
      assert:
        that:
          - ansible_os_family == 'os_family_from_play_vars'

- name: set_fact ansible_nodename and ansible_os_family
  hosts: localhost
  tasks:
    - name: set a persistent fact nodename
      set_fact:
        ansible_nodename: 'nodename_from_set_fact_cacheable'

    - name: show nodename fact
      debug:
        var: ansible_nodename

    - name: assert ansible_nodename is correct value
      assert:
        that:
          - ansible_nodename == 'nodename_from_set_fact_cacheable'

    - name: set a persistent fact os_family (FQCN)
      ansible.builtin.set_fact:
        ansible_os_family: 'os_family_from_set_fact_cacheable'

    - name: show os_family fact (FQCN)
      debug:
        var: ansible_os_family

    - name: assert ansible_os_family is correct value (FQCN)
      assert:
        that:
          - ansible_os_family == 'os_family_from_set_fact_cacheable'

- name: verify that set_fact ansible_xxx non_cacheable overrides ansible_xxx in vars
  hosts: localhost
  vars:
    ansible_nodename: 'nodename_from_play_vars'
    ansible_os_family: 'os_family_from_play_vars'
  tasks:
    - name: show nodename fact
      debug:
        var: ansible_nodename

    - name: assert ansible_nodename is correct value
      assert:
        that:
          - ansible_nodename == 'nodename_from_set_fact_cacheable'

    - name: show os_family fact (FQCN)
      debug:
        var: ansible_os_family

    - name: assert ansible_os_family is correct value (FQCN)
      assert:
        that:
          - ansible_os_family == 'os_family_from_set_fact_cacheable'

- name: verify that set_fact_cacheable in previous play overrides ansible_xxx in vars
  hosts: localhost
  vars:
    ansible_nodename: 'nodename_from_play_vars'
    ansible_os_family: 'os_family_from_play_vars'
  tasks:
    - name: show nodename fact
      debug:
        var: ansible_nodename

    - name: assert ansible_nodename is correct value
      assert:
        that:
          - ansible_nodename == 'nodename_from_set_fact_cacheable'

    - name: show os_family fact (FQCN)
      debug:
        var: ansible_os_family

    - name: assert ansible_os_family is correct value (FQCN)
      assert:
        that:
          - ansible_os_family == 'os_family_from_set_fact_cacheable'

- name: set_fact ansible_nodename and ansible_os_family cacheable
  hosts: localhost
  tasks:
    - name: set a persistent fact nodename
      set_fact:
        ansible_nodename: 'nodename_from_set_fact_cacheable'
        cacheable: true

    - name: show nodename fact
      debug:
        var: ansible_nodename

    - name: assert ansible_nodename is correct value
      assert:
        that:
          - ansible_nodename == 'nodename_from_set_fact_cacheable'

    - name: set a persistent fact os_family (FQCN)
      ansible.builtin.set_fact:
        ansible_os_family: 'os_family_from_set_fact_cacheable'
        cacheable: true

    - name: show os_family fact (FQCN)
      debug:
        var: ansible_os_family

    - name: assert ansible_os_family is correct value (FQCN)
      assert:
        that:
          - ansible_os_family == 'os_family_from_set_fact_cacheable'


- name: verify that set_fact_cacheable in previous play overrides ansible_xxx in vars
  hosts: localhost
  vars:
    ansible_nodename: 'nodename_from_play_vars'
    ansible_os_family: 'os_family_from_play_vars'
  tasks:
    - name: show nodename fact
      debug:
        var: ansible_nodename

    - name: assert ansible_nodename is correct value
      assert:
        that:
          - ansible_nodename == 'nodename_from_set_fact_cacheable'

    - name: show os_family fact (FQCN)
      debug:
        var: ansible_os_family

    - name: assert ansible_os_family is correct value (FQCN)
      assert:
        that:
          - ansible_os_family == 'os_family_from_set_fact_cacheable'

- name: the fourth play
  hosts: localhost
  vars:
    ansible_foobar: 'foobar_from_play_vars'
    ansible_foobar_fqcn: 'foobar_fqcn_from_play_vars'
  tasks:
    - name: show example fact
      debug:
        var: ansible_example

    - name: set a persistent fact example
      set_fact:
        ansible_example: 'foobar_from_set_fact_cacheable'
        cacheable: true

    - name: assert ansible_example is correct value
      assert:
        that:
          - ansible_example == 'foobar_from_set_fact_cacheable'

    - name: show example fact (FQCN)
      debug:
        var: ansible_example_fqcn

    - name: set a persistent fact example (FQCN)
      set_fact:
        ansible_example_fqcn: 'foobar_fqcn_from_set_fact_cacheable'
        cacheable: true

    - name: assert ansible_example_fqcn is correct value (FQCN)
      assert:
        that:
          - ansible_example_fqcn == 'foobar_fqcn_from_set_fact_cacheable'
