--- # create-clones.yml - Create and configure clones from template with error handling - name: "[CLONES] Validate clone list is not empty" ansible.builtin.fail: msg: "No clones defined in 'clones' variable" when: - create_clones | default(false) - clones is not defined or clones | length == 0 - name: "[CLONES] Process each clone" block: - name: "[CLONES] Check if clone already exists" ansible.builtin.include_tasks: helpers.yml vars: helper_task: check_vm_exists target_vm_id: "{{ clone.id }}" - name: "[CLONES] Display clone status" ansible.builtin.debug: msg: "Clone {{ clone.id }} ({{ clone.hostname }}) - Status: {{ 'EXISTS' if vm_exists else 'WILL BE CREATED' }}" - name: "[CLONES] Clone VM from template" block: - name: "[CLONES] Execute clone command" ansible.builtin.command: > qm clone {{ vm_id }} {{ clone.id }} --name {{ clone.hostname }} --full {{ clone.full | default(0) }} register: clone_cmd when: not vm_exists - name: "[CLONES] Verify clone was created" ansible.builtin.include_tasks: helpers.yml vars: helper_task: check_vm_exists target_vm_id: "{{ clone.id }}" when: not vm_exists - name: "[CLONES] Ensure clone creation succeeded" ansible.builtin.assert: that: - vm_exists | bool fail_msg: "Failed to create clone {{ clone.id }}" when: not vm_exists - name: "[CLONES] Wait for clone to be ready" ansible.builtin.pause: seconds: 2 when: not vm_exists rescue: - name: "[CLONES] Handle clone creation error" ansible.builtin.fail: msg: | Failed to clone VM {{ vm_id }} to {{ clone.id }}: {{ ansible_failed_result | default('Unknown error') }} - name: "[CLONES] Configure Cloud-Init for clone (if needed)" block: - name: "[CLONES] Set clone hostname and IP" ansible.builtin.command: > qm set {{ clone.id }} --hostname {{ clone.hostname }} --ipconfig0 "ip={{ clone.ip }},gw={{ clone.gateway }}" register: clone_config when: not vm_exists - name: "[CLONES] Apply SSH keys to clone" ansible.builtin.command: > qm set {{ clone.id }} --sshkeys local:snippets/{{ vm_id }}-sshkey.pub when: not vm_exists rescue: - name: "[CLONES] Handle clone configuration error" ansible.builtin.debug: msg: "WARNING: Could not fully configure clone {{ clone.id }}. You may need to configure manually." - name: "[CLONES] Start clone VM" ansible.builtin.command: "qm start {{ clone.id }}" register: clone_start retries: "{{ max_retries }}" delay: "{{ retry_delay }}" until: clone_start is succeeded when: not vm_exists - name: "[CLONES] Wait for clone to boot" ansible.builtin.pause: seconds: 3 - name: "[CLONES] Display clone creation result" ansible.builtin.debug: msg: | {% if vm_exists %} ℹ Clone {{ clone.id }} ({{ clone.hostname }}) already exists - skipped {% else %} ✓ Clone created and started - ID: {{ clone.id }} - Hostname: {{ clone.hostname }} - IP: {{ clone.ip }} - Full clone: {{ clone.full | default(0) }} {% endif %} loop: "{{ clones }}" loop_control: loop_var: clone when: create_clones | default(false) - name: "[CLONES] Skip clone creation (disabled)" ansible.builtin.debug: msg: "ℹ Clone creation is disabled. Set 'create_clones: true' to enable." when: not (create_clones | default(false))