--- - name: Resolve Image Variables (List) set_fact: _image_url: "{{ image_list[image_alias].url }}" _image_name: "{{ image_list[image_alias].filename }}" when: image_source_type == 'list' - name: Resolve Image Variables (URL) set_fact: _image_url: "{{ custom_image_url }}" _image_name: "{{ custom_image_name }}" when: image_source_type == 'url' - name: Check if template already exists command: "qm status {{ template_id }}" register: vm_status failed_when: false changed_when: false - name: Fail if template ID exists fail: msg: "VM ID {{ template_id }} already exists. Please delete it or choose a different ID." when: vm_status.rc == 0 - name: Download Cloud Image get_url: url: "{{ _image_url }}" dest: "/tmp/{{ _image_name }}" mode: '0644' - name: Install libguestfs-tools (for virt-customize if needed) apt: name: libguestfs-tools state: present ignore_errors: yes - name: Create VM with hardware config command: > qm create {{ template_id }} --name "{{ template_name }}" --memory {{ template_memory }} --core {{ template_cores }} --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci --ostype l26 --serial0 socket --vga serial0 - name: Import Disk command: "qm importdisk {{ template_id }} /tmp/{{ _image_name }} {{ storage_pool }}" - name: Attach Disk to SCSI command: "qm set {{ template_id }} --scsi0 {{ storage_pool }}:vm-{{ template_id }}-disk-0" - name: Add Cloud-Init Drive command: "qm set {{ template_id }} --ide2 {{ storage_pool }}:cloudinit" - name: Set Boot Order command: "qm set {{ template_id }} --boot c --bootdisk scsi0" - name: Configure Cloud-Init (Optional Admin Key) block: - name: Prepare SSH Keys File copy: content: "{{ admin_ssh_key }}" dest: "/tmp/ssh_key_{{ template_id }}.pub" mode: '0600' - name: Set SSH Keys on Template command: "qm set {{ template_id }} --sshkeys /tmp/ssh_key_{{ template_id }}.pub" - name: Cleanup Key File file: path: "/tmp/ssh_key_{{ template_id }}.pub" state: absent when: embed_admin_ssh_key | bool and admin_ssh_key | length > 0 - name: Set Cloud-Init IP Config (DHCP) command: "qm set {{ template_id }} --ipconfig0 ip=dhcp" - name: Resize Disk (to Minimum 10G) command: "qm resize {{ template_id }} scsi0 10G" ignore_errors: yes - name: Convert to Template command: "qm template {{ template_id }}" - name: Remove Downloaded Image file: path: "/tmp/{{ _image_name }}" state: absent