diff --git a/roles/package_manager/defaults/main.yml b/roles/package_manager/defaults/main.yml index fda9446..70fae3e 100644 --- a/roles/package_manager/defaults/main.yml +++ b/roles/package_manager/defaults/main.yml @@ -36,4 +36,5 @@ package_manager__repo_list_use_regex: true package_manager__default: [] package_manager__group: [] package_manager__host: [] -package_manager__all: "{{ package_manager__host + package_manager__group + package_manager__default }}" + +package_manager__all: "{{ package_manager__host + package_manager__group + package_manager__default }}" \ No newline at end of file diff --git a/roles/proxmox/defaults/main.yml b/roles/proxmox/defaults/main.yml index f055425..9f0d3c9 100644 --- a/roles/proxmox/defaults/main.yml +++ b/roles/proxmox/defaults/main.yml @@ -1,15 +1,19 @@ proxmox__role_enabled: false # TODO: Implement managing the purpose package setup for repos and package versioning. -# proxmox__manage_repo_keys: false -# proxmox__manage_repos: false -# proxmox__manage_packages: false -# proxmox__manage_grub: false -# proxmox__manage_hostname: false -# proxmox__manage_hosts: false -# proxmox__manage_sshd_config: false -# proxmox__manage_ssh_config: false -# proxmox__manage_cluster: false +proxmox__manage_repo_keys: false +proxmox__manage_repos: false +proxmox__manage_packages: false +proxmox__manage_grub: false +proxmox__manage_hostname: false +proxmox__manage_hosts: false +proxmox__manage_sshd_config: false +proxmox__manage_ssh_config: false +proxmox__manage_cluster: false + +# Hostname configuration +proxmox__hostname: "{{ inventory_hostname_short }}" +proxmox__domain: local # Cluster configuration # For target inventory specs, consult https://docs.ansible.com/ansible/latest/inventory_guide/intro_patterns.html for more information diff --git a/roles/proxmox/tasks/main.yml b/roles/proxmox/tasks/main.yml index d306bb2..8df68f9 100644 --- a/roles/proxmox/tasks/main.yml +++ b/roles/proxmox/tasks/main.yml @@ -7,19 +7,56 @@ ansible.builtin.include_tasks: file: set_facts.yml -- name: Import aybarsm package_manager role - ansible.builtin.import_role: - name: aybarsm.linux.package_manager - when: - - proxmox__role_enabled - - __proxmox__use_package_manager - -- name: Import aybarsm grub role - ansible.builtin.import_role: - name: aybarsm.linux.grub - when: - - proxmox__role_enabled - - proxmox__manage_grub +# - name: Import aybarsm package_manager role +# ansible.builtin.import_role: +# name: aybarsm.linux.package_manager +# when: +# - proxmox__role_enabled +# - proxmox__manage_repo_keys or proxmox__manage_repos or proxmox__manage_packages + +# - name: Import aybarsm grub role +# ansible.builtin.import_role: +# name: aybarsm.linux.grub +# when: +# - proxmox__role_enabled +# - proxmox__manage_grub + +# - name: Include package manager tasks +# ansible.builtin.include_tasks: +# file: package_manager.yml +# when: +# - proxmox__role_enabled +# - proxmox__manage_repo_keys or proxmox__manage_repos or proxmox__manage_packages + +# - name: Import aybarsm package_manager role +# ansible.builtin.import_role: +# name: aybarsm.linux.package_manager +# vars: +# package_manager__role_enabled: false +# package_manager__default: "{{ __proxmox__purpose_packages }}" + +# - name: Include package manager tasks +# ansible.builtin.include_tasks: +# file: package_manager.yml +# vars: +# node_repo_keys: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo_key') if proxmox__manage_repo_keys else [] }}" +# node_repos: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo') if proxmox__manage_repos else [] }}" +# node_packages: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'package') if proxmox__manage_packages else [] }}" +# use_package_manager: "{{ proxmox__manage_repo_keys or proxmox__manage_repos or proxmox__manage_packages }}" +# package_manager__role_enabled: "{{ use_package_manager if use_package_manager else omit }}" +# package_manager__manage_repo_keys: "{{ proxmox__manage_repo_keys }}" +# package_manager__manage_repos: "{{ proxmox__manage_repos }}" +# package_manager__manage_packages: "{{ proxmox__manage_packages }}" +# package_manager__host: "{{ node_repo_keys + node_repos + node_packages + (package_manager__host | default([])) if use_package_manager else omit }}" + +# - name: Import aybarsm package_manager role +# ansible.builtin.import_role: +# name: aybarsm.linux.package_manager +# when: +# - proxmox__role_enabled +# - proxmox__manage_repo_keys or proxmox__manage_repos or proxmox__manage_packages + + # - name: Import aybarsm network role # ansible.builtin.import_role: diff --git a/roles/proxmox/tasks/package_manager.yml b/roles/proxmox/tasks/package_manager.yml index 12db457..a6e0d56 100644 --- a/roles/proxmox/tasks/package_manager.yml +++ b/roles/proxmox/tasks/package_manager.yml @@ -3,12 +3,8 @@ ansible.builtin.include_role: name: aybarsm.linux.package_manager vars: - package_manager__role_enabled: true - package_manager__package_strategy: specific + package_manager__role_enabled: "{{ proxmox__manage_repo_keys or proxmox__manage_repos or proxmox__manage_packages }}" package_manager__manage_repo_keys: "{{ proxmox__manage_repo_keys }}" package_manager__manage_repos: "{{ proxmox__manage_repos }}" package_manager__manage_packages: "{{ proxmox__manage_packages }}" - node_repo_keys: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo_key') if proxmox__manage_repo_keys else [] }}" - node_repos: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo') if proxmox__manage_repos else [] }}" - node_packages: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'package') if proxmox__manage_packages else [] }}" - package_manager__host: "{{ node_repo_keys + node_repos + node_packages + (package_manager__host | default([])) }}" \ No newline at end of file + package_manager__all: "{{ __proxmox__purpose_packages }}" \ No newline at end of file diff --git a/roles/proxmox/tasks/set_facts.yml b/roles/proxmox/tasks/set_facts.yml index f120994..71efc37 100644 --- a/roles/proxmox/tasks/set_facts.yml +++ b/roles/proxmox/tasks/set_facts.yml @@ -1,16 +1,15 @@ --- -- name: Set fact for main proxmox cluster configuration +- name: Set main fact for main proxmox cluster configuration ansible.builtin.set_fact: __proxmox__cluster_configs: "{{ (__proxmox__cluster_configs | default([]) + cluster_config) | sort(attribute='name,host') }}" vars: - cluster_inventory: "{{ lookup('ansible.builtin.inventory_hostnames', item.target) | split(',') }}" - cluster_query: "{{ __proxmox__cluster_query | replace('__MEMBERS__', ('[`' + (cluster_inventory | join('`,`')) + '`]')) }}" + cluster_inventory: "{{ lookup('ansible.builtin.inventory_hostnames', item.target) }}" + # cluster_query: "{{ __proxmox__cluster_query | replace('__MEMBERS__', ('[`' + (cluster_inventory | join('`,`')) + '`]')) }}" + cluster_query: "{{ __proxmox__cluster_query | replace('__MEMBERS__', ('[`' + (cluster_inventory | replace(',', '`,`')) + '`]')) }}" cluster_node_config: "{{ dict(hostvars) | community.general.json_query(cluster_query) | sort(attribute='host') }}" cluster_default_init: "{{ cluster_node_config | map(attribute='host') | first }}" cluster_config: "{{ cluster_node_config | map('combine', ({'init': cluster_default_init} | combine(item))) }}" loop: "{{ proxmox__clusters }}" - loop_control: - index_var: config_index delegate_to: localhost run_once: true when: @@ -18,52 +17,58 @@ - proxmox__clusters | length > 0 - __proxmox__cluster_query is defined -- name: Set facts for proxmox cluster configuration - ansible.builtin.set_fact: - __proxmox__cluster: "{{ {'members': cluster_members} | combine(cluster_play) if cluster_play else None }}" - __proxmox__cluster_eligible: "{{ cluster_eligible }}" +# - name: Set facts for proxmox cluster configuration +# ansible.builtin.set_fact: +# __proxmox__cluster: "{{ {'members': cluster_members} | combine(cluster_play) if cluster_play else None }}" +# __proxmox__cluster_eligible: "{{ cluster_eligible }}" - __proxmox__use_package_manager: "{{ use_package_manager }}" - package_manager__role_enabled: "{{ use_package_manager if use_package_manager else omit }}" - package_manager__host: "{{ node_repo_keys + node_repos + node_packages + (package_manager__host | default([])) if use_package_manager else omit }}" +# package_manager__role_enabled: "{{ use_package_manager if use_package_manager else omit }}" +# package_manager__manage_repo_keys: "{{ proxmox__manage_repo_keys }}" +# package_manager__manage_repos: "{{ proxmox__manage_repos }}" +# package_manager__manage_packages: "{{ proxmox__manage_packages }}" +# package_manager__host: "{{ node_repo_keys + node_repos + node_packages + (package_manager__host | default([])) if use_package_manager else omit }}" - grub__role_enabled: "{{ proxmox__manage_grub if proxmox__manage_grub else omit }}" - grub__change_strategy: "{{ __proxmox__grub_change_strategy if proxmox__manage_grub else omit }}" +# grub__role_enabled: "{{ proxmox__manage_grub if proxmox__manage_grub else omit }}" +# grub__change_strategy: "{{ __proxmox__grub_change_strategy if proxmox__manage_grub else omit }}" - network__hosts_auto_discovery: False - network__hostname: "{{ cluster_play.fqdn | default(cluster_play.hostname) if cluster_play and proxmox__manage_hostname else omit }}" - network__host: "{{ node_hosts + (network__host | default([])) }}" - auth__host: "{{ [(node_auth_default | combine(node_auth))] + (auth__host | default([])) if cluster_eligible else (auth__host | default([])) }}" - vars: - cluster_play: "{{ __proxmox__cluster_configs | - selectattr('host', 'eq', inventory_hostname) | first | default(None) }}" - cluster_members: "{{ __proxmox__cluster_configs | - selectattr('name', 'eq', cluster_play.name) | - rejectattr('host', 'eq', inventory_hostname) | - aybarsm.helper.only_with(['host', 'fqdn', 'hostname', 'links']) if cluster_play else None }}" - cluster_required: "{{ [inventory_hostname] + (cluster_members | map(attribute='host') | list) if cluster_play else None }}" - cluster_eligible: "{{ ansible_play_batch | intersect(cluster_required) | length == cluster_required | length if cluster_play else False }}" +# network__role_enabled: "{{ use_network if use_network else omit }}" +# network__manage_hostname: "{{ proxmox__manage_hostname }}" +# network__manage_hosts: "{{ proxmox__manage_hosts if proxmox__manage_hosts else omit }}" +# network__hosts_auto_discovery: "{{ False if proxmox__manage_hosts else omit }}" +# network__hostname: "{{ cluster_play.fqdn | default(cluster_play.hostname) if network__hostname is undefined and proxmox__manage_hostname else omit }}" +# network__host: "{{ node_hosts + (network__host | default([])) if cluster_play and proxmox__manage_hosts else omit }}" - use_package_manager: "{{ proxmox__manage_repo_keys or proxmox__manage_repos or proxmox__manage_packages }}" - use_grub: "{{ proxmox__manage_grub }}" +# auth__host: "{{ [(node_auth_default | combine(node_auth))] + (auth__host | default([])) if cluster_eligible else (auth__host | default([])) }}" +# vars: +# cluster_play: "{{ __proxmox__cluster_configs | +# selectattr('host', 'eq', inventory_hostname) | first | default(None) }}" +# cluster_members: "{{ __proxmox__cluster_configs | +# selectattr('name', 'eq', cluster_play.name) | +# rejectattr('host', 'eq', inventory_hostname) | +# aybarsm.helper.only_with(['host', 'fqdn', 'hostname', 'links']) if cluster_play else None }}" +# cluster_required: "{{ [inventory_hostname] + (cluster_members | map(attribute='host') | list) if cluster_play else None }}" +# cluster_eligible: "{{ ansible_play_batch | intersect(cluster_required) | length == cluster_required | length if cluster_play else False }}" - node_repo_keys: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo_key') if proxmox__manage_repo_keys else [] }}" - node_repos: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo') if proxmox__manage_repos else [] }}" - node_packages: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'package') if proxmox__manage_packages else [] }}" +# use_package_manager: "{{ proxmox__manage_repo_keys or proxmox__manage_repos or proxmox__manage_packages }}" +# use_network: "{{ proxmox__manage_hostname or proxmox__manage_hosts }}" - cluster_hosts: "{{ [cluster_play | aybarsm.helper.only_with(['hostname', 'fqdn', 'links'])] + cluster_members if cluster_play else None }}" - node_hosts: "{{ { - 'ip': (cluster_hosts | map(attribute='links') | map('first')), - 'hostname': (cluster_hosts | map(attribute='hostname')), - 'fqdn': (cluster_hosts | map(attribute='fqdn')) - } | aybarsm.helper.to_list_of_dicts({'type': 'host'}) if cluster_play and proxmox__manage_hosts else [] }}" - node_auth_all: "{{ (auth__host | default([])) + (auth__group | default([])) + (auth__default | default([])) }}" - node_auth_default: "{{ node_auth_all | aybarsm.helper.selectattr(__proxmox__auth_selectattr) | first if cluster_play else {} }}" - node_auth: - type: user - name: root - generate_ssh_key: true - ssh_key_comment: "{{ node_auth_default.ssh_key_comment | default('root@' + inventory_hostname_short) }}" - distribute_ssh_key: "{{ cluster_required | difference([inventory_hostname]) if cluster_play else [] }}" - when: - - __proxmox__cluster_configs | length > 0 +# node_repo_keys: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo_key') if proxmox__manage_repo_keys else [] }}" +# node_repos: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo') if proxmox__manage_repos else [] }}" +# node_packages: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'package') if proxmox__manage_packages else [] }}" + +# cluster_hosts: "{{ [cluster_play | aybarsm.helper.only_with(['hostname', 'fqdn', 'links'])] + cluster_members if cluster_play else None }}" +# node_hosts: "{{ { +# 'ip': (cluster_hosts | map(attribute='links') | map('first')), +# 'hostname': (cluster_hosts | map(attribute='hostname')), +# 'fqdn': (cluster_hosts | map(attribute='fqdn')) +# } | aybarsm.helper.to_list_of_dicts({'type': 'host'}) if cluster_play and proxmox__manage_hosts else [] }}" +# node_auth_all: "{{ (auth__host | default([])) + (auth__group | default([])) + (auth__default | default([])) }}" +# node_auth_default: "{{ node_auth_all | aybarsm.helper.selectattr(__proxmox__auth_selectattr) | first if cluster_play else {} }}" +# node_auth: +# type: user +# name: root +# generate_ssh_key: true +# ssh_key_comment: "{{ node_auth_default.ssh_key_comment | default('root@' + inventory_hostname_short) }}" +# distribute_ssh_key: "{{ cluster_required | difference([inventory_hostname]) if cluster_play else [] }}" +# when: +# - __proxmox__cluster_configs | length > 0 diff --git a/roles/proxmox/tasks/set_role_facts.yml b/roles/proxmox/tasks/set_role_facts.yml new file mode 100644 index 0000000..2304366 --- /dev/null +++ b/roles/proxmox/tasks/set_role_facts.yml @@ -0,0 +1,54 @@ +--- +- name: Set facts for proxmox dependent roles + ansible.builtin.set_fact: + package_manager__role_enabled: "{{ use_package_manager if use_package_manager else omit }}" + package_manager__manage_repo_keys: "{{ proxmox__manage_repo_keys }}" + package_manager__manage_repos: "{{ proxmox__manage_repos }}" + package_manager__manage_packages: "{{ proxmox__manage_packages }}" + package_manager__package_strategy: specific + package_manager__host: "{{ node_repo_keys + node_repos + node_packages + (package_manager__host | default([])) if use_package_manager else omit }}" + + grub__role_enabled: "{{ proxmox__manage_grub if proxmox__manage_grub else omit }}" + grub__change_strategy: "{{ __proxmox__grub_change_strategy if proxmox__manage_grub else omit }}" + + network__role_enabled: "{{ use_network if use_network else omit }}" + network__manage_hostname: "{{ proxmox__manage_hostname if proxmox__manage_hostname else omit }}" + network__manage_hosts: "{{ proxmox__manage_hosts if proxmox__manage_hosts else omit }}" + network__hosts_auto_discovery: "{{ proxmox__manage_hosts if proxmox__manage_hosts else omit }}" + network__hostname: "{{ cluster_play.fqdn | default(cluster_play.hostname) if network__hostname is undefined and proxmox__manage_hostname else omit }}" + network__host: "{{ node_hosts + (network__host | default([])) if cluster_play and proxmox__manage_hosts else omit }}" + + auth__host: "{{ [(node_auth_default | combine(node_auth))] + (auth__host | default([])) if cluster_eligible else (auth__host | default([])) }}" + vars: + cluster_play: "{{ __proxmox__cluster_configs | + selectattr('host', 'eq', inventory_hostname) | first | default(None) }}" + cluster_members: "{{ __proxmox__cluster_configs | + selectattr('name', 'eq', cluster_play.name) | + rejectattr('host', 'eq', inventory_hostname) | + aybarsm.helper.only_with(['host', 'fqdn', 'hostname', 'links']) if cluster_play else None }}" + cluster_required: "{{ [inventory_hostname] + (cluster_members | map(attribute='host') | list) if cluster_play else None }}" + cluster_eligible: "{{ ansible_play_batch | intersect(cluster_required) | length == cluster_required | length if cluster_play else False }}" + + use_package_manager: "{{ proxmox__manage_repo_keys or proxmox__manage_repos or proxmox__manage_packages }}" + use_network: "{{ proxmox__manage_hostname or proxmox__manage_hosts }}" + + node_repo_keys: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo_key') if proxmox__manage_repo_keys else [] }}" + node_repos: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'repo') if proxmox__manage_repos else [] }}" + node_packages: "{{ __proxmox__purpose_packages | selectattr('type', 'eq', 'package') if proxmox__manage_packages else [] }}" + + cluster_hosts: "{{ [cluster_play | aybarsm.helper.only_with(['hostname', 'fqdn', 'links'])] + cluster_members if cluster_play else None }}" + node_hosts: "{{ { + 'ip': (cluster_hosts | map(attribute='links') | map('first')), + 'hostname': (cluster_hosts | map(attribute='hostname')), + 'fqdn': (cluster_hosts | map(attribute='fqdn')) + } | aybarsm.helper.to_list_of_dicts({'type': 'host'}) if cluster_play and proxmox__manage_hosts else [] }}" + node_auth_all: "{{ (auth__host | default([])) + (auth__group | default([])) + (auth__default | default([])) }}" + node_auth_default: "{{ node_auth_all | aybarsm.helper.selectattr(__proxmox__auth_selectattr) | first if cluster_play else {} }}" + node_auth: + type: user + name: root + generate_ssh_key: true + ssh_key_comment: "{{ node_auth_default.ssh_key_comment | default('root@' + inventory_hostname_short) }}" + distribute_ssh_key: "{{ cluster_required | difference([inventory_hostname]) if cluster_play else [] }}" + when: + - __proxmox__cluster_configs | length > 0 diff --git a/roles/proxmox/vars/main.yml b/roles/proxmox/vars/main.yml index 239bfcb..1399a29 100644 --- a/roles/proxmox/vars/main.yml +++ b/roles/proxmox/vars/main.yml @@ -2,11 +2,6 @@ # proxmox__host > proxmox__group > proxmox__default proxmox__all: "{{ proxmox__default | combine(proxmox__group, proxmox__host, recursive=true, list_merge='replace') }}" -__proxmox__grub_change_strategy: - module: command - cmd: 'proxmox-boot-tool refresh' - immediate: true - __proxmox__purpose_packages: >- {%- set proxmox_repo_keys = [proxmox__repo_keys[ansible_distribution_release] | combine({'type': 'repo_key', 'state': 'present'})] -%} {%- set proxmox_repos = [] -%} @@ -55,13 +50,27 @@ __proxmox__purpose_packages: >- {%- endif -%} {{ proxmox_repo_keys + proxmox_repos + proxmox_packages }} -__proxmox_cluster_links: >- - {%- set proxmox_links = [] -%} - {%- if proxmox__manage_purpose_package_setup is defined and proxmox__manage_purpose_package_setup and proxmox__all.purposes is defined -%} - {%- endif -%} +TODO: Remove this block after testing +# __proxmox_cluster_links: >- +# {%- set proxmox_links = [] -%} +# {%- if proxmox__manage_purpose_package_setup is defined and proxmox__manage_purpose_package_setup and proxmox__all.purposes is defined -%} +# {%- endif -%} + +__proxmox__grub_change_strategy: + module: command + cmd: 'proxmox-boot-tool refresh' + immediate: true + +# __proxmox__cluster_query: '*.{host: inventory_hostname, fqdn: ansible_facts.fqdn, hostname: ansible_facts.hostname, links: proxmox__cluster_links} | +# [?not_null(links) && contains(__MEMBERS__, host)]' -__proxmox__cluster_query: '*.{host: inventory_hostname, fqdn: ansible_facts.fqdn, hostname: ansible_facts.hostname, links: proxmox__cluster_links} | - [?not_null(links) && contains(__MEMBERS__, host)]' +__proxmox__cluster_query: '*.{ + host: inventory_hostname, + hostname: proxmox__hostname, + domain: proxmox__domain, + fqdn: join(`.`, [not_null(proxmox__hostname, ``), not_null(proxmox__domain, ``)]), + links: proxmox__cluster_links} | + [?not_null(hostname) && not_null(domain) && not_null(links) && contains(__MEMBERS__, host)]' __proxmox__auth_selectattr: - when: