From 2c141b9c40d0b329cbb24d49e5b8efc953fded42 Mon Sep 17 00:00:00 2001 From: Murat Aybars <39916128+aybarsm@users.noreply.github.com> Date: Sat, 6 Jul 2024 11:57:56 +0100 Subject: [PATCH] Ansible local fact management template --- roles/ansible/defaults/main.yml | 1 + roles/ansible/handlers/main.yml | 9 --------- roles/ansible/tasks/update_local_facts.yml | 4 ++-- roles/ansible/templates/aybarsm_linux.json.fact.j2 | 12 ++++++------ 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/roles/ansible/defaults/main.yml b/roles/ansible/defaults/main.yml index 03d5b22..76a2dfb 100644 --- a/roles/ansible/defaults/main.yml +++ b/roles/ansible/defaults/main.yml @@ -6,4 +6,5 @@ ansible__local_facts_dir: "{{ (not lookup('config', 'DEFAULT_FACT_PATH')) | tern ansible__local_fact_name: aybarsm_linux ansible__local_fact_file: "{{ ansible__local_facts_dir }}/{{ ansible__local_fact_name }}.fact" ansible__local_fact_template: "{{ ansible__local_fact_name }}.json.fact.j2" +ansible__local_fact_list_merge_strategy: prepend diff --git a/roles/ansible/handlers/main.yml b/roles/ansible/handlers/main.yml index 2ab404a..de0d929 100644 --- a/roles/ansible/handlers/main.yml +++ b/roles/ansible/handlers/main.yml @@ -1,19 +1,10 @@ --- -# REVIEW: Execute the handler without when control, let the task decide to notify or not - name: Settle local facts on host if changed become: true ansible.builtin.template: src: "{{ ansible__local_fact_template }}" dest: "{{ ansible__local_fact_file }}" backup: "{{ ansible__local_fact_backup | default(omit) | bool }}" - vars: - on_host: "{{ ansible_local[ansible__local_fact_name] | default({}) | b64encode }}" - on_runtime: "{{ ansible__local_facts | default({}) | b64encode }}" - ansible_callback_diy_runner_on_skipped_msg: | - skipping: [{{ inventory_hostname }}] - msg: {{ (not ansible_check_mode and on_host != on_runtime) | ternary("Host local facts not changed.", "DRY-RUN") }} - ansible_callback_diy_runner_on_skipped_msg_color: green - when: on_host != on_runtime register: ansible__local_facts_settle listen: "ansible__local_facts_settle" notify: "ansible__local_facts_reread" diff --git a/roles/ansible/tasks/update_local_facts.yml b/roles/ansible/tasks/update_local_facts.yml index 46528f6..a0ef19d 100644 --- a/roles/ansible/tasks/update_local_facts.yml +++ b/roles/ansible/tasks/update_local_facts.yml @@ -3,9 +3,9 @@ ansible.utils.update_fact: updates: "{{ local_fact_updates }}" vars: - update_paths: "{{ ansible__local_fact_updates | map(attribute='path') | + update_paths: "{{ ansible__local_fact_updates | map(attribute='path') | map('regex_replace', '^ansible_local\\.' + ansible__local_fact_name + '\\.|^ansible_local\\.', '') | - map('regex_replace', '^(?!__ansible__local_facts\\.)(.*)$', '__ansible__local_facts.\\1') }}" + map('regex_replace', '^(?!ansible__local_facts\\.)(.*)$', 'ansible__local_facts.\\1') }}" local_fact_updates: "{{ {'path': update_paths, 'value': (ansible__local_fact_updates | map(attribute='value'))} | aybarsm.helper.to_list_of_dicts }}" register: ansible__update_local_facts diff --git a/roles/ansible/templates/aybarsm_linux.json.fact.j2 b/roles/ansible/templates/aybarsm_linux.json.fact.j2 index 97f5ff3..b4b802b 100644 --- a/roles/ansible/templates/aybarsm_linux.json.fact.j2 +++ b/roles/ansible/templates/aybarsm_linux.json.fact.j2 @@ -1,6 +1,6 @@ -{% if __ansible__local_facts is defined %} -{{ __ansible__local_facts | to_nice_json }} -{% else %} -{ -} -{% endif %} \ No newline at end of file +{% set facts_ansible_settled = ansible_local[ansible__local_fact_name] | default({}) %} +{% set facts_role_settled = ansible__local_facts | default({}) %} +{% set facts_role_update_settled = ansible__update_local_facts | default({}) %} +{% set list_merge_strategy = ansible__local_fact_list_merge_strategy | default('prepend') %} +{% set final_local_facts = facts_ansible_settled | combine(facts_role_settled, facts_role_update_settled, recursive=true, list_merge=list_merge_strategy) %} +{{ final_local_facts | to_nice_json }} \ No newline at end of file