--- - 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 {{ vmid }}" register: vm_status failed_when: false changed_when: false - name: Fail if template ID exists fail: msg: "VM ID {{ vmid }} already exists. Please choose a different ID or delete the existing VM." when: vm_status.rc == 0 - name: Download Cloud Image get_url: url: "{{ _image_url }}" dest: "/tmp/{{ _image_name }}" mode: '0644' - name: Install libguestfs-tools apt: name: libguestfs-tools state: present ignore_errors: yes - name: Create VM with hardware config command: > qm create {{ vmid }} --name "{{ template_name }}" --memory {{ memory }} --core {{ cores }} --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci --ostype l26 --serial0 socket --vga serial0 - name: Import Disk command: "qm importdisk {{ vmid }} /tmp/{{ _image_name }} {{ storage_pool }}" - name: Attach Disk to SCSI command: "qm set {{ vmid }} --scsi0 {{ storage_pool }}:vm-{{ vmid }}-disk-0" - name: Add Cloud-Init Drive command: "qm set {{ vmid }} --ide2 {{ storage_pool }}:cloudinit" - name: Set Boot Order command: "qm set {{ vmid }} --boot c --bootdisk scsi0" - name: Prepare SSH Keys File copy: content: | {{ admin_ssh_key }} {% for key in additional_ssh_keys %} {{ key }} {% endfor %} dest: "/tmp/ssh_keys_{{ vmid }}.pub" mode: '0600' - name: Configure Cloud-Init (SSH Keys, User, IP) command: > qm set {{ vmid }} --sshkeys /tmp/ssh_keys_{{ vmid }}.pub --ipconfig0 ip=dhcp - name: Resize Disk (Default 10G) command: "qm resize {{ vmid }} scsi0 10G" ignore_errors: yes - name: Convert to Template command: "qm template {{ vmid }}" - name: Remove Downloaded Image file: path: "/tmp/{{ _image_name }}" state: absent - name: Remove Temporary SSH Keys File file: path: "/tmp/ssh_keys_{{ vmid }}.pub" state: absent