292 lines
9.1 KiB
YAML
292 lines
9.1 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 (
|
|
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
|