Skip to content

Commit

Permalink
Pre - Proxmox cluster query improvement
Browse files Browse the repository at this point in the history
  • Loading branch information
aybarsm committed Sep 1, 2024
1 parent 43d5448 commit 7f5370b
Show file tree
Hide file tree
Showing 7 changed files with 194 additions and 88 deletions.
3 changes: 2 additions & 1 deletion roles/package_manager/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}"
22 changes: 13 additions & 9 deletions roles/proxmox/defaults/main.yml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
63 changes: 50 additions & 13 deletions roles/proxmox/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
8 changes: 2 additions & 6 deletions roles/proxmox/tasks/package_manager.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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([])) }}"
package_manager__all: "{{ __proxmox__purpose_packages }}"
101 changes: 53 additions & 48 deletions roles/proxmox/tasks/set_facts.yml
Original file line number Diff line number Diff line change
@@ -1,69 +1,74 @@
---
- 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:
- proxmox__clusters is defined
- 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
54 changes: 54 additions & 0 deletions roles/proxmox/tasks/set_role_facts.yml
Original file line number Diff line number Diff line change
@@ -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
31 changes: 20 additions & 11 deletions roles/proxmox/vars/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [] -%}
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit 7f5370b

Please sign in to comment.