diff --git a/ansible/infra/nodito/33_proxmox_debian_cloud_template.yml b/ansible/infra/nodito/33_proxmox_debian_cloud_template.yml new file mode 100644 index 0000000..ff69525 --- /dev/null +++ b/ansible/infra/nodito/33_proxmox_debian_cloud_template.yml @@ -0,0 +1,142 @@ +- name: Create Proxmox template from Debian cloud image (no VM clone) + hosts: nodito + become: true + vars_files: + - ../../infra_vars.yml + - nodito_vars.yml + + vars: + # Defaults (override via vars_files or --extra-vars as needed) + debian_cloud_image_url: "https://cloud.debian.org/images/cloud/trixie/20251006-2257/debian-13-genericcloud-amd64-20251006-2257.qcow2" + debian_cloud_image_filename: "debian-13-genericcloud-amd64-20251006-2257.qcow2" + debian_cloud_image_dest_dir: "/var/lib/vz/template/iso" + debian_cloud_image_dest_path: "{{ debian_cloud_image_dest_dir }}/{{ debian_cloud_image_filename }}" + + proxmox_template_vmid: 9001 + proxmox_template_name: "debian-13-cloud-init" + proxmox_template_memory_mb: 1024 + proxmox_template_sockets: 1 + proxmox_template_cores: 1 + proxmox_template_bridge: "vmbr0" + proxmox_template_cpu_type: "host" + proxmox_template_disk_size_gb: 10 + + # Cloud-init defaults applied at template level (optional). You can override per-VM later. + proxmox_ciuser: "counterweight" # Default login user to create; distro default may already exist + proxmox_sshkey_path: "/home/{{ new_user }}/.ssh/authorized_keys" # Path to pubkey file for cloud-init injection + proxmox_ci_upgrade: true # If true, run package upgrade on first boot + + # Storage to import disk into; use existing storage like local-lvm or your ZFS pool name + proxmox_image_storage: "{{ zfs_pool_name }}" + + tasks: + - name: Verify Proxmox VE is running + command: pveversion + register: pve_version_check + changed_when: false + failed_when: pve_version_check.rc != 0 + + + + - name: Ensure destination directory exists for cloud image + file: + path: "{{ debian_cloud_image_dest_dir }}" + state: directory + mode: '0755' + + - name: Check if Debian cloud image already present + stat: + path: "{{ debian_cloud_image_dest_path }}" + register: debian_image_stat + + - name: Download Debian cloud image (qcow2) + get_url: + url: "{{ debian_cloud_image_url }}" + dest: "{{ debian_cloud_image_dest_path }}" + mode: '0644' + force: false + when: not debian_image_stat.stat.exists + + - name: Check if VMID already exists + command: qm config {{ proxmox_template_vmid }} + register: vmid_config_check + failed_when: false + changed_when: false + + - name: Determine if VM is already a template + set_fact: + vm_already_template: "{{ 'template: 1' in vmid_config_check.stdout }}" + when: vmid_config_check.rc == 0 + + - name: Create base VM for template (no disk yet) + command: > + qm create {{ proxmox_template_vmid }} + --name {{ proxmox_template_name }} + --numa 0 --ostype l26 + --cpu cputype={{ proxmox_template_cpu_type }} + --cores {{ proxmox_template_cores }} + --sockets {{ proxmox_template_sockets }} + --memory {{ proxmox_template_memory_mb }} + --net0 virtio,bridge={{ proxmox_template_bridge }} + when: + - vmid_config_check.rc != 0 + + - name: Import Debian cloud image as disk to storage + command: > + qm importdisk {{ proxmox_template_vmid }} + {{ debian_cloud_image_dest_path }} + {{ proxmox_image_storage }} + register: importdisk_result + changed_when: '"Successfully imported disk" in importdisk_result.stdout' + when: + - vmid_config_check.rc != 0 or not vm_already_template + + - name: Build consolidated qm set argument list (simplified) + set_fact: + qm_set_args: >- + {{ + [ + '--scsihw virtio-scsi-pci', + '--scsi0 ' ~ proxmox_image_storage ~ ':vm-' ~ proxmox_template_vmid ~ '-disk-0', + '--ide2 ' ~ proxmox_image_storage ~ ':cloudinit', + '--ipconfig0 ip=dhcp', + '--boot c', + '--bootdisk scsi0', + '--serial0 socket', + '--vga serial0', + '--agent enabled=1', + '--ciuser ' ~ proxmox_ciuser, + '--sshkey ' ~ proxmox_sshkey_path + ] + + (proxmox_ci_upgrade | bool + | ternary(['--ciupgrade 1'], [])) + }} + when: + - vmid_config_check.rc != 0 or not vm_already_template + + - name: Apply consolidated qm set + command: > + qm set {{ proxmox_template_vmid }} {{ qm_set_args | join(' ') }} + when: + - vmid_config_check.rc != 0 or not vm_already_template + + - name: Resize primary disk to requested size + command: > + qm resize {{ proxmox_template_vmid }} scsi0 {{ proxmox_template_disk_size_gb }}G + when: + - vmid_config_check.rc != 0 or not vm_already_template + + - name: Convert VM to template + command: qm template {{ proxmox_template_vmid }} + when: + - vmid_config_check.rc == 0 and not vm_already_template or vmid_config_check.rc != 0 + + - name: Show resulting template configuration + command: qm config {{ proxmox_template_vmid }} + register: final_template_config + changed_when: false + + - name: Debug final template config + debug: + msg: "{{ final_template_config.stdout }}" +