259 lines
7.7 KiB
YAML
259 lines
7.7 KiB
YAML
---
|
|
- name: Ensure system input is a dictionary
|
|
ansible.builtin.set_fact:
|
|
system: "{{ system | default({}) }}"
|
|
changed_when: false
|
|
|
|
- name: Validate system input type
|
|
ansible.builtin.assert:
|
|
that:
|
|
- system is mapping
|
|
fail_msg: "system must be a dictionary"
|
|
quiet: true
|
|
|
|
- name: Normalize base system fields
|
|
vars:
|
|
system_name_effective: >-
|
|
{{
|
|
system.name
|
|
if system.name is defined and (system.name | string | length) > 0
|
|
else inventory_hostname
|
|
}}
|
|
system_id_effective: >-
|
|
{{
|
|
system.id
|
|
if system.id is defined and (system.id | string | length) > 0
|
|
else ''
|
|
}}
|
|
system_cpus_effective: >-
|
|
{{
|
|
system.cpus
|
|
if system.cpus is defined and (system.cpus | int) > 0
|
|
else 0
|
|
}}
|
|
system_memory_mb_effective: >-
|
|
{{
|
|
system.memory_mb
|
|
if system.memory_mb is defined and (system.memory_mb | int) > 0
|
|
else 0
|
|
}}
|
|
system_balloon_mb_effective: >-
|
|
{{
|
|
system.balloon_mb
|
|
if system.balloon_mb is defined and (system.balloon_mb | int) > 0
|
|
else 0
|
|
}}
|
|
system_network_effective: >-
|
|
{{
|
|
system.network
|
|
if system.network is defined and (system.network | string | length) > 0
|
|
else ''
|
|
}}
|
|
system_vlan_effective: >-
|
|
{{
|
|
system.vlan
|
|
if system.vlan is defined and (system.vlan | string | length) > 0
|
|
else ''
|
|
}}
|
|
system_ip_effective: >-
|
|
{{
|
|
system.ip
|
|
if system.ip is defined and (system.ip | string | length) > 0
|
|
else ''
|
|
}}
|
|
system_prefix_effective: >-
|
|
{{
|
|
system.prefix
|
|
if system.prefix is defined and (system.prefix | int) > 0
|
|
else ''
|
|
}}
|
|
system_gateway_effective: >-
|
|
{{
|
|
system.gateway
|
|
if system.gateway is defined and (system.gateway | string | length) > 0
|
|
else ''
|
|
}}
|
|
system_dns_servers_effective: >-
|
|
{{
|
|
system.dns_servers
|
|
if system.dns_servers is defined
|
|
else []
|
|
}}
|
|
system_dns_search_effective: >-
|
|
{{
|
|
system.dns_search
|
|
if system.dns_search is defined
|
|
else []
|
|
}}
|
|
system_path_effective: >-
|
|
{{
|
|
system.path
|
|
if system.path is defined and (system.path | string | length) > 0
|
|
else ''
|
|
}}
|
|
ansible.builtin.set_fact:
|
|
hostname: "{{ system_name_effective }}"
|
|
system_cfg: >-
|
|
{{
|
|
system_defaults
|
|
| combine(system, recursive=True)
|
|
| combine(
|
|
{
|
|
'name': system_name_effective,
|
|
'id': system_id_effective,
|
|
'cpus': system_cpus_effective,
|
|
'memory_mb': system_memory_mb_effective,
|
|
'balloon_mb': system_balloon_mb_effective,
|
|
'network': system_network_effective,
|
|
'vlan': system_vlan_effective,
|
|
'ip': system_ip_effective,
|
|
'prefix': system_prefix_effective,
|
|
'gateway': system_gateway_effective,
|
|
'dns_servers': system_dns_servers_effective,
|
|
'dns_search': system_dns_search_effective,
|
|
'path': system_path_effective
|
|
},
|
|
recursive=True
|
|
)
|
|
}}
|
|
changed_when: false
|
|
|
|
- name: Normalize system disks input
|
|
vars:
|
|
system_disk_defaults:
|
|
size: 0
|
|
device: ""
|
|
mount: ""
|
|
fstype: ""
|
|
label: ""
|
|
opts: "defaults"
|
|
system_disks_raw: >-
|
|
{{
|
|
system_cfg.disks
|
|
if system_cfg.disks is defined
|
|
else []
|
|
}}
|
|
system_disks_effective: >-
|
|
{{
|
|
system_disks_raw
|
|
}}
|
|
system_disk_device_prefix: >-
|
|
{{
|
|
'/dev/vd'
|
|
if (install_type | default('')) == 'virtual' and (hypervisor_type | default('')) == 'libvirt'
|
|
else (
|
|
'/dev/xvd'
|
|
if (install_type | default('')) == 'virtual' and (hypervisor_type | default('')) == 'xen'
|
|
else (
|
|
'/dev/sd'
|
|
if (install_type | default('')) == 'virtual'
|
|
and (hypervisor_type | default('')) in ['proxmox', 'vmware']
|
|
else ''
|
|
)
|
|
)
|
|
}}
|
|
system_disk_letter_map: "abcdefghijklmnopqrstuvwxyz"
|
|
block:
|
|
- name: Validate system disks type
|
|
ansible.builtin.assert:
|
|
that:
|
|
- system_disks_effective is sequence
|
|
fail_msg: "system.disks must be a list"
|
|
quiet: true
|
|
|
|
- name: Validate system disk items
|
|
ansible.builtin.assert:
|
|
that:
|
|
- item is mapping
|
|
fail_msg: "Each system disk entry must be a dictionary"
|
|
quiet: true
|
|
loop: "{{ system_disks_effective }}"
|
|
loop_control:
|
|
label: "{{ item | to_json }}"
|
|
|
|
- name: Validate system disk count
|
|
ansible.builtin.assert:
|
|
that:
|
|
- (system_disks_effective | length) <= 26
|
|
fail_msg: "system.disks supports at most 26 entries."
|
|
quiet: true
|
|
|
|
- name: Build normalized system disk configuration
|
|
ansible.builtin.set_fact:
|
|
system_disks_cfg: "{{ system_disks_cfg | default([]) + [system_disk_cfg] }}"
|
|
vars:
|
|
disk_idx: "{{ ansible_loop.index0 }}"
|
|
disk_letter: "{{ system_disk_letter_map[disk_idx] }}"
|
|
disk_device_default: >-
|
|
{{
|
|
(
|
|
install_drive
|
|
if disk_idx == 0 and install_drive is defined and (install_drive | string | length) > 0
|
|
else (system_disk_device_prefix ~ disk_letter)
|
|
)
|
|
if (install_type | default('')) == 'virtual'
|
|
else (
|
|
install_drive
|
|
if disk_idx == 0 and install_drive is defined and (install_drive | string | length) > 0
|
|
else ''
|
|
)
|
|
}}
|
|
system_disk_cfg_base: "{{ system_disk_defaults | combine(item, recursive=True) }}"
|
|
system_disk_cfg_tmp: >-
|
|
{{
|
|
system_disk_cfg_base
|
|
| combine(
|
|
{
|
|
'device': (
|
|
system_disk_cfg_base.device
|
|
if system_disk_cfg_base.device | string | length > 0
|
|
else disk_device_default
|
|
),
|
|
'fstype': (
|
|
system_disk_cfg_base.fstype
|
|
if system_disk_cfg_base.fstype | string | length > 0
|
|
else (
|
|
'ext4'
|
|
if system_disk_cfg_base.mount | string | length > 0
|
|
else ''
|
|
)
|
|
)
|
|
},
|
|
recursive=True
|
|
)
|
|
}}
|
|
system_disk_partition_device: >-
|
|
{{
|
|
system_disk_cfg_tmp.device
|
|
~ ('p1' if (system_disk_cfg_tmp.device | regex_search('\\d$')) else '1')
|
|
}}
|
|
system_disk_cfg: >-
|
|
{{
|
|
system_disk_cfg_tmp
|
|
| combine(
|
|
{
|
|
'partition': system_disk_partition_device
|
|
},
|
|
recursive=True
|
|
)
|
|
}}
|
|
loop: "{{ system_disks_effective }}"
|
|
loop_control:
|
|
loop_var: item
|
|
extended: true
|
|
label: "{{ item | to_json }}"
|
|
|
|
- name: Update system configuration with normalized disks
|
|
ansible.builtin.set_fact:
|
|
system_cfg: "{{ system_cfg | combine({'disks': system_disks_cfg | default([])}, recursive=True) }}"
|
|
changed_when: false
|
|
|
|
- name: Set install_drive from system disk definition (if needed)
|
|
when:
|
|
- (install_drive is not defined) or (install_drive | string | length) == 0
|
|
- system_disks_cfg | length > 0
|
|
- system_disks_cfg[0].device | string | length > 0
|
|
ansible.builtin.set_fact:
|
|
install_drive: "{{ system_disks_cfg[0].device }}"
|
|
changed_when: false
|