--- - name: Ensure system input is a dictionary ansible.builtin.set_fact: system: "{{ system | default({}) }}" - name: Validate system input types ansible.builtin.assert: that: - system is mapping - system.network is not defined or system.network is mapping - system.root is not defined or system.root is mapping - system.luks is not defined or system.luks is mapping - system.features is not defined or system.features is mapping fail_msg: "system and its nested keys (network, root, luks, features) must be dictionaries." quiet: true - name: Validate DNS lists (not strings) when: system.network is defined and system.network.dns is defined ansible.builtin.assert: that: - system.network.dns.servers is not defined or (system.network.dns.servers is iterable and system.network.dns.servers is not string) - system.network.dns.search is not defined or (system.network.dns.search is iterable and system.network.dns.search is not string) fail_msg: "system.network.dns.servers and system.network.dns.search must be lists, not strings." quiet: true - name: Validate system features input types when: system.features is defined loop: "{{ system_defaults.features | dict2items | map(attribute='key') | list }}" loop_control: label: "system.features.{{ item }}" ansible.builtin.assert: that: - (system_defaults.features[item] is not mapping) or ((system.features[item] | default({})) is mapping) fail_msg: "system.features.{{ item }} must be a dictionary." quiet: true - name: Validate system LUKS TPM2 input type when: system.luks is defined and system.luks is mapping ansible.builtin.assert: that: - system.luks.tpm2 is not defined or system.luks.tpm2 is mapping fail_msg: "system.luks.tpm2 must be a dictionary." quiet: true