diff --git a/roles/ansible/tasks/main.yml b/roles/ansible/tasks/main.yml index e5970b8..126bfd5 100644 --- a/roles/ansible/tasks/main.yml +++ b/roles/ansible/tasks/main.yml @@ -1,3 +1,14 @@ --- - name: Load role related variables - ansible.builtin.include_vars: main.yml \ No newline at end of file + 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 \ No newline at end of file diff --git a/roles/ansible/tasks/update_local_facts.yml b/roles/ansible/tasks/update_local_facts.yml index fc1d8c4..e20d8ba 100644 --- a/roles/ansible/tasks/update_local_facts.yml +++ b/roles/ansible/tasks/update_local_facts.yml @@ -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 @@ -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 \ No newline at end of file diff --git a/roles/ansible/templates/aybarsm_linux.json.fact.j2 b/roles/ansible/templates/aybarsm_linux.json.fact.j2 index b8dbfc5..63ba846 100644 --- a/roles/ansible/templates/aybarsm_linux.json.fact.j2 +++ b/roles/ansible/templates/aybarsm_linux.json.fact.j2 @@ -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 }} \ No newline at end of file diff --git a/roles/package_manager/defaults/main.yml b/roles/package_manager/defaults/main.yml index f59c7f9..e373f96 100644 --- a/roles/package_manager/defaults/main.yml +++ b/roles/package_manager/defaults/main.yml @@ -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 diff --git a/roles/package_manager/templates/common/repo_disabled.j2 b/roles/package_manager/templates/common/repo_disabled.j2 new file mode 100644 index 0000000..c4d1ddd --- /dev/null +++ b/roles/package_manager/templates/common/repo_disabled.j2 @@ -0,0 +1,4 @@ +# {{ ansible_managed }} +{% if package_manager__repo_list_disabled_comment is defined %} +{{ package_manager__repo_list_disabled_comment | comment }} +{% end if %} \ No newline at end of file diff --git a/roles/package_manager/vars/common.yml b/roles/package_manager/vars/common.yml index 6e1194e..0fc03a3 100644 --- a/roles/package_manager/vars/common.yml +++ b/roles/package_manager/vars/common.yml @@ -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) | @@ -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([]) }}" \ No newline at end of file + 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) }}" \ No newline at end of file diff --git a/roles/package_manager/vars/debian.yml b/roles/package_manager/vars/debian.yml index 2db56bf..37db278 100644 --- a/roles/package_manager/vars/debian.yml +++ b/roles/package_manager/vars/debian.yml @@ -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: diff --git a/roles/package_manager/vars/redhat.yml b/roles/package_manager/vars/redhat.yml index f170240..210c516 100644 --- a/roles/package_manager/vars/redhat.yml +++ b/roles/package_manager/vars/redhat.yml @@ -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: