Skip to content

Commit

Permalink
Role: ansible - Local fact management optimisation
Browse files Browse the repository at this point in the history
  • Loading branch information
aybarsm committed Jul 6, 2024
1 parent 69b44fd commit a94aabf
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 32 deletions.
13 changes: 12 additions & 1 deletion roles/ansible/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
---
- name: Load role related variables
ansible.builtin.include_vars: main.yml
ansible.builtin.include_vars: main.yml

# - name: Include update local facts tasks for initiation
# ansible.builtin.include_tasks: update_local_facts.yml
# vars:
# ansible__local_fact_updates:
# - path: ansible.init
# value:
# when:
# - linux_role_ansible_enabled | bool
# - linux_role_ansible_manage_local_facts | bool
# - ansible_local[ansible__local_fact_name] is undefined
55 changes: 29 additions & 26 deletions roles/ansible/tasks/update_local_facts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,49 +7,52 @@
path: "{{ ansible__local_facts_dir }}"
register: ansible__ensure_local_facts_dir
when:
- linux_role_ansible_enabled | bool
- linux_role_ansible_manage_local_facts | bool
- ansible__role_enabled | bool
- ansible__manage_local_facts | bool
- ansible__local_fact_updates | default([]) | length > 0

- name: Temporarily assign host local facts to ansible facts
ansible.builtin.set_fact:
__ansible__local_facts: "{{ ansible_local[ansible__local_fact_name] | default({}) }}"
register: ansible__assign_local_facts
when:
- linux_role_ansible_enabled | bool
- linux_role_ansible_manage_local_facts | bool
- ansible__local_fact_updates | default([]) | length > 0
# - name: Temporarily assign host local facts to ansible facts
# ansible.builtin.set_fact:
# __ansible__local_facts: "{{ ansible_local[ansible__local_fact_name] | default({}) }}"
# register: ansible__assign_local_facts
# when:
# - ansible__role_enabled | bool
# - ansible__manage_local_facts | bool
# - ansible__local_fact_updates | default([]) | length > 0

- name: Update host local facts
ansible.utils.update_fact:
updates: "{{ local_fact_updates }}"
vars:
# 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') }}"
path_prefix: "ansible_local.{{ ansible__local_fact_name }}."
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', '^(?!' + (path_prefix | regex_escape) + ')(.*)$', path_prefix + '\\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
notify: "ansible__settle_local_facts"
when:
- linux_role_ansible_enabled | bool
- linux_role_ansible_manage_local_facts | bool
- ansible__role_enabled | bool
- ansible__manage_local_facts | bool
- ansible__local_fact_updates | default([]) | length > 0

- name: Undefine host local facts in ansible facts
ansible.builtin.set_fact:
__ansible__local_facts: "{{ undef() }}"
register: ansible__undefine_local_facts
when:
- linux_role_ansible_enabled | bool
- linux_role_ansible_manage_local_facts | bool
- ansible__local_fact_updates | default([]) | length > 0
# - name: Undefine host local facts in ansible facts
# ansible.builtin.set_fact:
# __ansible__local_facts: "{{ undef() }}"
# register: ansible__undefine_local_facts
# when:
# - ansible__role_enabled | bool
# - ansible__manage_local_facts | bool
# - ansible__local_fact_updates | default([]) | length > 0

- name: Settle local facts on the host if they have been modified
ansible.builtin.meta: 'flush_handlers'
when:
- linux_role_ansible_enabled | bool
- linux_role_ansible_manage_local_facts | bool
- ansible__role_enabled | bool
- ansible__manage_local_facts | bool
- ansible__local_fact_updates | default([]) | length > 0

- name: Re-read local facts on the host
Expand All @@ -58,8 +61,8 @@
filter: ansible_local
register: ansible__reread_local_facts
when:
- linux_role_ansible_enabled | bool
- linux_role_ansible_manage_local_facts | bool
- ansible__role_enabled | bool
- ansible__manage_local_facts | bool
- ansible__local_fact_updates | default([]) | length > 0
- ansible__settle_local_facts is defined
- ansible__settle_local_facts.changed
2 changes: 1 addition & 1 deletion roles/ansible/templates/aybarsm_linux.json.fact.j2
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{% set facts_ansible_settled = ansible_local[ansible__local_fact_name] | default({}) %}
{% set facts_role_update_settled = ansible__update_local_facts | default({}) %}
{% set facts_role_update_settled = ansible__update_local_facts.ansible_local[ansible__local_fact_name] | default({}) %}
{% set list_merge_strategy = ansible__local_fact_list_merge_strategy | default('prepend') %}
{% set final_local_facts = facts_ansible_settled | combine(facts_role_update_settled, recursive=true, list_merge=list_merge_strategy) %}
{{ final_local_facts | to_nice_json }}
6 changes: 6 additions & 0 deletions roles/package_manager/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ package_manager__upgrade_strategy: once
# Clean options temproarily removes all repos other than OS default repos before upgrade
package_manager__upgrade_mode: clean_full

# Shared Options:
package_manager__repo_list_disabled_template: common/repo_list_disabled.j2
package_manager__repo_list_disabled_comment: "This repository list temporarily disabled by ansible."
package_manager__upgrade_update_repo_cache: true
package_manager__repo_list_use_regex: true

# TODO: Implement this feature
# package_manager__package_simulation: true

Expand Down
4 changes: 4 additions & 0 deletions roles/package_manager/templates/common/repo_disabled.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# {{ ansible_managed }}
{% if package_manager__repo_list_disabled_comment is defined %}
{{ package_manager__repo_list_disabled_comment | comment }}
{% end if %}
34 changes: 31 additions & 3 deletions roles/package_manager/vars/common.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
__package_manager__clean_upgrade_modes: "{{ ['clean_'] | product(__package_manager__upgrade_modes) | map('join') }}"

package_manager__packages_all: "{{ package_manager__all |
aybarsm.helper.selectattr(__package_manager__config.packages.selectattr) |
aybarsm.helper.replace_aliases(__package_manager__config.packages.replace_aliases) |
Expand All @@ -21,4 +19,34 @@ package_manager__repos_all: "{{ package_manager__all |
package_manager__repo_lists_all: "{{ package_manager__all |
aybarsm.helper.selectattr(__package_manager__config.repo_lists.selectattr) |
aybarsm.helper.unique_recursive(__package_manager__config.repo_lists.uniques) |
default([]) }}"
default([]) }}"

__package_manager__clean_upgrade_modes: "{{ ['clean_'] | product(__package_manager__upgrade_modes) | map('join') }}"
__package_manager__repo_list_defaults: "{{ package_manager__repo_lists_all | selectattr('category', 'defined') | selectattr('category', 'equalto', 'default') | list }}"

__package_manager__upgrade_clean: "{{ package_manager__upgrade_mode in __package_manager__clean_upgrade_modes }}"
__package_manager__upgrade_mode: "{{ package_manager__upgrade_mode | regex_replace('clean_', '') }}"
__package_manager__upgrade_clean_eligible: "{{ __package_manager__upgrade_clean and __package_manager__repo_list_defaults | length > 0 }}"

__package_manager__upgrade_once: "{{ package_manager__upgrade_strategy == 'once' }}"
__package_manager__upgrade_always: "{{ package_manager__upgrade_strategy == 'always' }}"
__package_manager__upgrade_never: "{{ package_manager__upgrade_strategy == 'never' }}"
__package_manager__upgrade_execute: >-
{%- if __package_manager__upgrade_never -%}
{'decision': false, 'reason': 'Upgrade strategy is set to never.'}
{%- elif __package_manager__upgrade_clean and not __package_manager__upgrade_clean_eligible -%}
{'decision': false, 'reason': 'Upgrade strategy is set to clean, but no default repo list configuration found.'}
{%- elif __package_manager__upgrade_once -%}
{%- if ansible__role_enabled is undefined -%}
{'decision': false, 'reason': 'Upgrade strategy once requires aybarsm.linux.ansible role included.'}
{%- elif not ansible__role_enabled -%}
{'decision': false, 'reason': 'Upgrade strategy once requires aybarsm.linux.ansible role enabled. (ansible__role_enabled: true)'}
{%- elif not ansible__manage_local_facts -%}
{'decision': false, 'reason': 'Upgrade strategy once requires aybarsm.linux.ansible role local fact management enabled. (ansible__manage_local_facts: true)'}
{%- elif __package_manager__upgrade_once and __package_manager__upgrade_once_eligible and not __package_manager__upgrade_defined -%}
{'decision': true, 'reason': 'Upgrade strategy is set to once, and eligible.'}
{%- else -%}
{'decision': false, 'reason': 'Upgrade strategy is not set to always or once, or not eligible.'}
{%- endif -%}
__package_manager__upgrade_always or (__package_manager__upgrade_once and __package_manager__upgrade_once_eligible and not __package_manager__upgrade_defined) }}"
4 changes: 4 additions & 0 deletions roles/package_manager/vars/debian.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
__package_manager__upgrade_modes: ['full', 'safe', 'yes', 'dist']

package_manager__repo_list_dir: /etc/apt/sources.list.d
package_manager__repo_list_patterns: [".*\\.list$"]
package_manager__upgrade_dpkg_options: ''

__package_manager__config:
packages:
selectattr:
Expand Down
1 change: 0 additions & 1 deletion roles/package_manager/vars/redhat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ package_manager__repo_list_dir: /etc/yum.repos.d
package_manager__repo_list_use_regex: true
package_manager__repo_list_patterns: [".*\\.repo$"]


__package_manager__clean_upgrade_modes: "{{ ['clean_'] | product(__package_manager__upgrade_modes) | map('join') }}"

__package_manager__package_state_config:
Expand Down

0 comments on commit a94aabf

Please sign in to comment.