--- - 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 ( hostname if hostname is defined and (hostname | string | length) > 0 else inventory_hostname ) }} system_id_effective: >- {{ system.id if system.id is defined and (system.id | string | length) > 0 else (vm_id | default('')) }} system_cpus_effective: >- {{ system.cpus if system.cpus is defined and (system.cpus | int) > 0 else (vm_cpus | default(0)) }} system_memory_mb_effective: >- {{ system.memory_mb if system.memory_mb is defined and (system.memory_mb | int) > 0 else (vm_memory | default(0)) }} system_balloon_mb_effective: >- {{ system.balloon_mb if system.balloon_mb is defined and (system.balloon_mb | int) > 0 else (vm_ballo | default('')) }} system_network_effective: >- {{ system.network if system.network is defined and (system.network | string | length) > 0 else (vm_nif | default('')) }} system_vlan_effective: >- {{ system.vlan if system.vlan is defined and (system.vlan | string | length) > 0 else (vlan_name | default('')) }} system_ip_effective: >- {{ system.ip if system.ip is defined and (system.ip | string | length) > 0 else (vm_ip | default('')) }} system_prefix_effective: >- {{ system.prefix if system.prefix is defined and (system.prefix | int) > 0 else (vm_nms | default('')) }} system_gateway_effective: >- {{ system.gateway if system.gateway is defined and (system.gateway | string | length) > 0 else (vm_gw | default('')) }} system_dns_servers_effective: >- {{ system.dns_servers if system.dns_servers is defined else (vm_dns | default([])) }} system_dns_search_effective: >- {{ system.dns_search if system.dns_search is defined else (vm_dns_search | default([])) }} system_path_effective: >- {{ system.path if system.path is defined and (system.path | string | length) > 0 else ( system.hypervisor_path if system.hypervisor_path is defined and (system.hypervisor_path | string | length) > 0 else (vm_path | default('')) ) }} 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_legacy: >- {{ [ {'size': vm_size} ] if (system_disks_raw | length) == 0 and (vm_size is defined and (vm_size | float) > 0) else [] }} system_disks_effective: >- {{ system_disks_raw if (system_disks_raw | length) > 0 else system_disks_legacy }} system_disk_device_prefix: >- {{ '/dev/vd' if (install_type | default('')) == 'virtual' and (hypervisor | default('')) == 'libvirt' else ( '/dev/xvd' if (install_type | default('')) == 'virtual' and (hypervisor | default('')) == 'xen' else ( '/dev/sd' if (install_type | default('')) == 'virtual' and (hypervisor | 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 - name: Set legacy vm_* aliases (compat) ansible.builtin.set_fact: vm_id: "{{ system_cfg.id }}" vm_cpus: "{{ system_cfg.cpus }}" vm_memory: "{{ system_cfg.memory_mb }}" vm_ballo: "{{ system_cfg.balloon_mb }}" vm_nif: "{{ system_cfg.network }}" vlan_name: "{{ system_cfg.vlan }}" vm_ip: "{{ system_cfg.ip }}" vm_nms: "{{ system_cfg.prefix }}" vm_gw: "{{ system_cfg.gateway }}" vm_dns: "{{ system_cfg.dns_servers }}" vm_dns_search: "{{ system_cfg.dns_search }}" vm_path: "{{ system_cfg.path }}" vm_size: "{{ (system_cfg.disks | default([]) | first | default({})).size | default(0) }}" changed_when: false