--- - 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