commit a735835de1082458e5eb3c433fbd4610e14e32f5 Author: drostangreen Date: Mon Sep 21 23:57:12 2026 -0500 batman diff --git a/.env-example b/.env-example new file mode 100644 index 0000000..af1609d --- /dev/null +++ b/.env-example @@ -0,0 +1,41 @@ +#!/bin/bash + +BUILT_IN_CLOUDINIT=true + +if $BUILT_IN_CLOUDINIT; then + # Built-In Cloud-Init options + CIUSER=default + CIPASSWORD="password" + # Static IP would be "gw=,ip=" + IPCONFIG="ip=dhcp" + SSHKEYS="" + + QM_CLOUDINIT="--ciuser $CIUSER --cipassword $CIPASSWORD --ipconfig0 $IPCONFIG --sshkeys $SSHKEYS" +else + # Custom Snippets + SNIPPETS_LOCATION=local + CIUSER_FILE=default-user.yml + CINETWORK_FILE=default-network.yml + CIMETA_FILE=default-meta.yml + CIVENDOR_FILE=default-vendor.yml + + # Custom portions can be mixed and matched as needed. See below examples + # QM_CLOUDINIT="--cicustom user=$SNIPPETS_LOCATION:snippets/$CIUSER_FILE" + # QM_CLOUDINIT="--cicustom user=$SNIPPETS_LOCATION:snippets/$CIUSER_FILE,network=$SNIPPETS_LOCATION:snippets/$CINETWORK_FILE" + # QM_CLOUDINIT="--cicustom vendor=$SNIPPETS_LOCATION:snippets/$CIVENDOR_FILE" + QM_CLOUDINIT="--cicustom user=$SNIPPETS_LOCATION:snippets/$CIUSER_FILE,network=$SNIPPETS_LOCATION:snippets/$CINETWORK_FILE,meta=$SNIPPETS_LOCATION:snippets/$CIMETA_FILE,vendor=$SNIPPETS_LOCATION:snippets/$CIVENDOR_FILE" +fi + +# VM Option Defaults +AGENT=1 +BALLOON=0 +MEMORY=1024 +CORES=1 +BIOS_TYPE=ovmf +CPU_TYPE="cputype=host" +EFI_OPTS="1,efitype=4m,pre-enrolled-keys=0" +MACHINE_TYPE=q35 +OS_TYPE=l26 +SCSI_TYPE=virtio-scsi-pci +CPU_SOCKETS=1 +BRIDGE=vmbr0 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b984808 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +This is a collection of scripts and assets for Proxmox. diff --git a/bsd_template.sh b/bsd_template.sh new file mode 100755 index 0000000..cd24adc --- /dev/null +++ b/bsd_template.sh @@ -0,0 +1,167 @@ +#!/bin/bash + +BUILT_IN_CLOUDINIT=false + +AGENT="${AGENT:-1}" +BALLOON="${BALLOON:-0}" +MEMORY="${MEMORY:-1024}" +CORES="${CORES:-1}" +BIOS_TYPE="${BIOS_TYPE:-ovmf}" +CPU_TYPE="${CPU_TYPE:-cputype=host}" +EFI_OPTS="${EFI_OPTS:-1,efitype=4m,pre-enrolled-keys=0}" +MACHINE_TYPE="${MACHINE_TYPE:-q35}" +OS_TYPE="${OS_TYPE:-l26}" +SCSI_TYPE="${SCSI_TYPE:-virtio-scsi-pci}" +CPU_SOCKETS="${CPU_SOCKETS:-1}" +BRIDGE="${BRIDGE:-vmbr0}" + +FILE_SYSTEM="${FILE_SYSTEM:-zfs}" +VERSION="${VERSION:-15}" + +[ -f .env ] && source .env + +declare -A distros=() + +declare -A distro_array=( + [freebsd14-ufs]="https://download.freebsd.org/releases/VM-IMAGES/14.4-RELEASE/amd64/Latest/FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz" + [freebsd14-zfs]="https://download.freebsd.org/releases/VM-IMAGES/14.4-RELEASE/amd64/Latest/FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-zfs.qcow2.xz" + [freebsd15-ufs]="https://download.freebsd.org/releases/VM-IMAGES/15.1-RELEASE/amd64/Latest/FreeBSD-15.1-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz" + [freebsd15-zfs]="https://download.freebsd.org/releases/VM-IMAGES/15.1-RELEASE/amd64/Latest/FreeBSD-15.1-RELEASE-amd64-BASIC-CLOUDINIT-zfs.qcow2.xz" +) + +Help(){ + echo "Usage: $0 [FLAG] " + echo "" + echo "Required Flags:" + echo "-v Select the VMID to use for template" + echo "-s Select the PVE storage i.e. local-lvm" + echo "" + echo "Optional:" + echo "-n Selects version number i.e. 14 or 15" + echo "-N Selects both version numbers i.e. 14 and 15" + echo "-u Selects \"UFS\" as the File System" + echo "-U Selects both \"UFS\" versions" + echo "-z Selects \"ZFS\" as the File System" + echo "-Z Selects both \"ZFS\" versions" + echo "-a Selects all available versions" +} + +assertNotEmpty() { + : "${!1:? "$1 is required, see help (-h) for more info."}" +} + +download_image() { + local FILENAME=$(basename "$URL") + + wget "$URL" + unxz "$FILENAME" + mv "${FILENAME%.*}" $IMAGE +} + +create_template() { + # create VM, resize the disk, import disk and create Cloud Init drive. Then set default settings for vm + echo "Creating $VMID with name \"$DISTRO-template\""; qm create $VMID --agent $AGENT --balloon $BALLOON --memory $MEMORY --cores $CORES --bios $BIOS_TYPE --cpu $CPU_TYPE --efidisk0 $STORAGE:$EFI_OPTS --ide2 $STORAGE:cloudinit --machine $MACHINE_TYPE --ostype $OS_TYPE --scsihw $SCSI_TYPE --sockets $CPU_SOCKETS --name $DISTRO-template --net0 virtio,bridge=$BRIDGE > /dev/null + echo "Resizing disk"; qemu-img resize $IMAGE 10G > /dev/null + echo "Importing disk"; qm importdisk $VMID $IMAGE $STORAGE > /dev/null + echo "Setting Virtual Drive to scsi0"; qm set $VMID --scsihw virtio-scsi-pci --scsi0 $STORAGE:vm-$VMID-disk-1,discard=on > /dev/null + echo "Set bootdisk to scsi0"; qm set $VMID --boot c --bootdisk scsi0 > /dev/null + + # Define Cloud-Init parameters based on env file or the user interaction + assertNotEmpty QM_CLOUDINIT && echo "Set Cloud Init params"; qm set $VMID $QM_CLOUDINIT > /dev/null + + echo Converting $VMID to Template; qm template $VMID > /dev/null + + echo Deleting $IMAGE file; rm $IMAGE + + echo "Your new ${DISTRO^} template is ready!" +} + +while getopts hauUzZn:N:v:s: opt +do + case $opt in + h) + Help + exit 0 + ;; + + a) + for key in "${!distro_array[@]}"; do + distros["$key"]="${distro_array[$key]}" + done + ;; + + v) + VMID=$OPTARG + ;; + + u) + FILE_SYSTEM="ufs" + ;; + + U) + distros["freebsd14-ufs"]="${distro_array[freebsd14-ufs]}" + distros["freebsd15-ufs"]="${distro_array[freebsd15-ufs]}" + ;; + + z) + FILE_SYSTEM="zfs" + ;; + + Z) + distros["freebsd14-zfs"]="${distro_array[freebsd14-zfs]}" + distros["freebsd15-zfs"]="${distro_array[freebsd15-zfs]}" + ;; + + s) + STORAGE=$OPTARG + ;; + + n) + if [[ $OPTARG -eq 14 || $OPTARG -eq 15 ]]; then + VERSION=$OPTARG + distros["freebsd$OPTARG-$FILE_SYSTEM"]="${distro_array[freebsd$OPTARG-$FILE_SYSTEM]}" + else + echo "Invalid selection. Choices are 14 or 15..." + Help + exit 1 + fi + ;; + + N) + if [[ $OPTARG -eq 14 || $OPTARG -eq 15 ]]; then + distros["freebsd$OPTARG-ufs"]="${distro_array[freebsd$OPTARG-ufs]}" + distros["freebsd$OPTARG-zfs"]="${distro_array[freebsd$OPTARG-zfs]}" + else + echo "Invalid selection. Choices are 14 or 15..." + Help + exit 1 + fi + ;; + + \?) + echo "Invalid Flag" + exit 1 + ;; + + esac +done + +########################## Start of Script ################################# + +NAME="freebsd${VERSION}" +URL="${distro_array[freebsd$VERSION-$FILE_SYSTEM]}" + +assertNotEmpty VMID +assertNotEmpty STORAGE + +if [ ${#distros[@]} -eq 0 ]; then + distros["freebsd$VERSION-$FILE_SYSTEM"]="${distro_array[freebsd$VERSION-$FILE_SYSTEM]}" +fi + +for DISTRO in ${!distros[@]}; do + IMAGE=$NAME.qcow2 + URL=${distros[$DISTRO]} + download_image + create_template + ((VMID=VMID+1)) +done diff --git a/snippets/default-network.yml b/snippets/default-network.yml new file mode 100644 index 0000000..5322573 --- /dev/null +++ b/snippets/default-network.yml @@ -0,0 +1,6 @@ +#network-config +network: + version: 2 + ethernets: + ens18: + dhcp4: true diff --git a/snippets/default-user.yml b/snippets/default-user.yml new file mode 100644 index 0000000..49678da --- /dev/null +++ b/snippets/default-user.yml @@ -0,0 +1,28 @@ +#cloud-config + +packages: + - qemu-guest-agent + +package_upgrade: true + +users: + - name: tadmin + groups: users,admin,wheel + sudo: "ALL=(ALL) NOPASSWD:ALL" + shell: /bin/bash + lock_passwd: false + passwd: "$6$rounds=4096$PkHHyggqgsxl5vPU$/qJLUddhJ0nluAZiKB0DhNG1yyux2oaEKZdwU7shIcPfrSZJZnBeVmi3vTG9c98fdzwDiL0PEN.FOuCOPh.kC." + ssh_authorized_keys: + - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7BJlWLEuHf9Sx/q1xk8aGFxPfH3UmvyC2nGjREpCI7W0BGVm5FuZNJA9+F2TlzbuTyoGsbpCVqhn2fA8FB+KnjqLWf8beezpw5JGabuQinNoKuYSwDSVoIP5vCaGj6y0y19l5pEowPTNKef/krTSOU17AwMudoLq5Bv+z1yOv61lxIat4fk1iMn3yXTpvN5zoAKSOioQQLQu/OFJ/PjZrrdaXs7+LOo38mQdfdpe5vLsOTek1ZZl48VRoQvNO6M/glgZCdKnO5Hcx3KX/L6P7X/esTd/McAYcaIDWYiGo2cHtliDsr5M0NUgjwrwsIc4WVmkHNPIYOSlVDHvwkx3H tristan@q4os-pc" + - name: ansible + gecos: Ansible User + groups: users,admin,wheel + sudo: "ALL=(ALL) NOPASSWD:ALL" + shell: /bin/bash + lock_passwd: true + ssh_authorized_keys: + - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN/Kb8q4xM8E8WbLBFOqesGc1g354TK/kOZwnDRNh+3P ansible" + +runcmd: + - [ systemctl, enable, qemu-guest-agent ] + - [ systemctl, start, qemu-guest-agent ] diff --git a/snippets/freebsd-default-user.yml b/snippets/freebsd-default-user.yml new file mode 100644 index 0000000..842b9ec --- /dev/null +++ b/snippets/freebsd-default-user.yml @@ -0,0 +1,31 @@ +#cloud-config + +users: + - name: tadmin + groups: users,admin,wheel + sudo: "ALL=(ALL) NOPASSWD:ALL" + shell: /usr/local/bin/bash + lock_passwd: false + passwd: "$6$rounds=4096$PkHHyggqgsxl5vPU$/qJLUddhJ0nluAZiKB0DhNG1yyux2oaEKZdwU7shIcPfrSZJZnBeVmi3vTG9c98fdzwDiL0PEN.FOuCOPh.kC." + ssh_authorized_keys: + - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7BJlWLEuHf9Sx/q1xk8aGFxPfH3UmvyC2nGjREpCI7W0BGVm5FuZNJA9+F2TlzbuTyoGsbpCVqhn2fA8FB+KnjqLWf8beezpw5JGabuQinNoKuYSwDSVoIP5vCaGj6y0y19l5pEowPTNKef/krTSOU17AwMudoLq5Bv+z1yOv61lxIat4fk1iMn3yXTpvN5zoAKSOioQQLQu/OFJ/PjZrrdaXs7+LOo38mQdfdpe5vLsOTek1ZZl48VRoQvNO6M/glgZCdKnO5Hcx3KX/L6P7X/esTd/McAYcaIDWYiGo2cHtliDsr5M0NUgjwrwsIc4WVmkHNPIYOSlVDHvwkx3H tristan@q4os-pc" + - name: ansible + gecos: Ansible User + groups: users,admin,wheel + sudo: "ALL=(ALL) NOPASSWD:ALL" + shell: /usr/local/bin/bash + lock_passwd: true + ssh_authorized_keys: + - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN/Kb8q4xM8E8WbLBFOqesGc1g354TK/kOZwnDRNh+3P ansible" +packages: + - qemu-guest-agent + - bash + - sudo + +package_update: true +package_upgrade: true + +runcmd: + - sysrc qemu_guest_agent_enable="YES" + - service qemu-guest-agent start + - logger -t nuageinit "boot finished" diff --git a/snippets/freebsd-dhcp.yml b/snippets/freebsd-dhcp.yml new file mode 100644 index 0000000..38ecb76 --- /dev/null +++ b/snippets/freebsd-dhcp.yml @@ -0,0 +1,5 @@ +network: + version: 2 + ethernets: + vtnet0: + dhcp4: true diff --git a/snippets/vultr-default-user.yml b/snippets/vultr-default-user.yml new file mode 100644 index 0000000..296c6e4 --- /dev/null +++ b/snippets/vultr-default-user.yml @@ -0,0 +1,21 @@ +#cloud-config + +package_upgrade: true + +users: + - name: tadmin + groups: users,admin,wheel + sudo: "ALL=(ALL) NOPASSWD:ALL" + shell: /bin/bash + lock_passwd: true + ssh_authorized_keys: + - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7BJlWLEuHf9Sx/q1xk8aGFxPfH3UmvyC2nGjREpCI7W0BGVm5FuZNJA9+F2TlzbuTyoGsbpCVqhn2fA8FB+KnjqLWf8beezpw5JGabuQinNoKuYSwDSVoIP5vCaGj6y0y19l5pEowPTNKef/krTSOU17AwMudoLq5Bv+z1yOv61lxIat4fk1iMn3yXTpvN5zoAKSOioQQLQu/OFJ/PjZrrdaXs7+LOo38mQdfdpe5vLsOTek1ZZl48VRoQvNO6M/glgZCdKnO5Hcx3KX/L6P7X/esTd/McAYcaIDWYiGo2cHtliDsr5M0NUgjwrwsIc4WVmkHNPIYOSlVDHvwkx3H tristan@q4os-pc" + - name: ansible + gecos: Ansible User + groups: users,admin,wheel + sudo: "ALL=(ALL) NOPASSWD:ALL" + shell: /bin/bash + lock_passwd: true + ssh_authorized_keys: + - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN/Kb8q4xM8E8WbLBFOqesGc1g354TK/kOZwnDRNh+3P ansible" + diff --git a/template_create.sh b/template_create.sh new file mode 100755 index 0000000..55a78c1 --- /dev/null +++ b/template_create.sh @@ -0,0 +1,205 @@ +#!/bin/bash + +CUSTOM=false +BUILT_IN_CLOUDINIT=true + +CIUSER="${CIUSER:-default}" +CIPASSWORD="${CIPASSWORD:-password}" +IPCONFIG="${IPCONFIG:-ip=dhcp}" +SSHKEYS="${SSHKEYS:-}" +QM_CLOUDINIT="${QM_CLOUDINIT:---ciuser default --cipassword password --ipconfig0 ip=dhcp}" + +AGENT="${AGENT:-1}" +BALLOON="${BALLOON:-0}" +MEMORY="${MEMORY:-1024}" +CORES="${CORES:-1}" +BIOS_TYPE="${BIOS_TYPE:-ovmf}" +CPU_TYPE="${CPU_TYPE:-cputype=host}" +EFI_OPTS="${EFI_OPTS:-1,efitype=4m,pre-enrolled-keys=0}" +MACHINE_TYPE="${MACHINE_TYPE:-q35}" +OS_TYPE="${OS_TYPE:-l26}" +SCSI_TYPE="${SCSI_TYPE:-virtio-scsi-pci}" +CPU_SOCKETS="${CPU_SOCKETS:-1}" +BRIDGE="${BRIDGE:-vmbr0}" + +[ -f .env ] && source .env + +declare -A distros=() + +declare -A distro_array=( + [debian12]="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2" + [debian13]="https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2" + [ubuntu2204]="https://cloud-images.ubuntu.com/minimal/releases/jammy/release/ubuntu-22.04-minimal-cloudimg-amd64.img" + [ubuntu2404]="https://cloud-images.ubuntu.com/minimal/releases/noble/release/ubuntu-24.04-minimal-cloudimg-amd64.img" + [ubuntu2604]="https://cloud-images.ubuntu.com/minimal/releases/resolute/release/ubuntu-26.04-minimal-cloudimg-amd64.img" + [centos9]="https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-20230123.0.x86_64.qcow2" + [centos10]="https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-10-20230123.0.x86_64.qcow2" + [rocky9]="https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2" + [rocky10]="https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-GenericCloud-Base.latest.x86_64.qcow2" + [fedora44]="https://ftp2.osuosl.org/pub/fedora/linux/releases/44/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-44-1.7.x86_64.qcow2" + [opensuse156]="https://download.opensuse.org/repositories/Cloud:/Images:/Leap_15.6/images/openSUSE-Leap-15.6.x86_64-1.0.1-NoCloud.qcow2" +) + +Help(){ + echo Use this script with the following flags + echo "-v Select the VMID to use for template *REQUIRED" + echo "-s Select the PVE storage i.e. local-lvm *REQUIRED" + echo "-a Create all the templates listed below" + echo "-d Create Debian 12 & 13 templates" + echo "-u Create Ubuntu 22.04, 24.04 & 26.04 templates" + echo "-c Create CentOS 9 & 10 templates" + echo "-r Create Rocky 9 & 10 templates" + echo "-f Create Fedora 44 template" + echo "-o Create OpenSUSE 15.6 template" + echo "-k \"Custom\" image not in the above list." + echo " You will be prompted to provide the distro name" + echo " and the url for the qcow2 file." +} + +assertNotEmpty() { + : "${!1:? "$1 is required, see help (-h) for more info."}" +} + +download_image() { + echo "Downloading $IMAGE now"; wget -qO $IMAGE $URL + + if $CUSTOM; then + xz --test $IMAGE && mv $IMAGE $IMAGE.xz && unxz $IMAGE.xz + fi +} + +qcow2_modification() { + echo "Install qemu-guest-agent on first boot"; virt-customize -a $IMAGE --firstboot-install qemu-guest-agent > /dev/null + echo "Enable qemu-guest-agent service on first boot"; virt-customize -a $IMAGE --firstboot-command "systemctl enable --now qemu-guest-agent" > /dev/null + echo "Removing /etc/machine-id"; virt-customize -a $IMAGE --run-command '>/etc/machine-id' > /dev/null +} + +create_template() { + # create VM, resize the disk, import disk and create Cloud Init drive. Then set default settings for vm + echo "Creating $VMID with name \"$DISTRO-template\""; qm create $VMID --agent $AGENT --balloon $BALLOON --memory $MEMORY --cores $CORES --bios $BIOS_TYPE --cpu $CPU_TYPE --efidisk0 $STORAGE:$EFI_OPTS --ide2 $STORAGE:cloudinit --machine $MACHINE_TYPE --ostype $OS_TYPE --scsihw $SCSI_TYPE --sockets $CPU_SOCKETS --name $DISTRO-template --net0 virtio,bridge=$BRIDGE > /dev/null + echo "Resizing disk"; qemu-img resize $IMAGE 10G > /dev/null + echo "Importing disk"; qm importdisk $VMID $IMAGE $STORAGE > /dev/null + echo "Setting Virtual Drive to scsi0"; qm set $VMID --scsihw virtio-scsi-pci --scsi0 $STORAGE:vm-$VMID-disk-1,discard=on > /dev/null + echo "Set bootdisk to scsi0"; qm set $VMID --boot c --bootdisk scsi0 > /dev/null + + # Define Cloud-Init parameters based on env file or the user interaction + echo "Set Cloud Init params"; qm set $VMID $QM_CLOUDINIT > /dev/null + + echo Converting $VMID to Template; qm template $VMID > /dev/null + + echo Deleting $IMAGE file; rm $IMAGE + + echo "Your new ${DISTRO^} template is ready!" +} + +get_cloudinit_params() { + if [ ! -f .env ]; then + read -p "Enter username to be created: " CIUSER + read -sp "Enter password for user (optional): " CIPASSWORD + read -p "Do you want Static IP for template? (y/N) " + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Enter IP info" + read -p " Format is \"gw=,ip=\": " IPCONFIG + else + IPCONFIG="ip=dhcp" + fi + read -p "File path to ssh key for user (optional): " SSHKEYS + fi +} + +get_custom_info() { + read -p "Enter the distro name (no spaces): " DISTRO + echo "Enter the url for the download of the vm image" + read -p "(example: https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2) " URL + + assertNotEmpty DISTRO + assertNotEmpty URL +} + +while getopts hrocafdukv:s: opt +do + case $opt in + h) + Help + exit 0 + ;; + + a) + for key in "${!distro_array[@]}"; do + distros["$key"]="${distro_array[$key]}" + done + ;; + + v) + VMID=$OPTARG + ;; + + d) + distros[debian12]="${distro_array[debian12]}" + distros[debian13]="${distro_array[debian13]}" + ;; + + u) + distros[ubuntu2204]="${distro_array[ubuntu2204]}" + distros[ubuntu2404]="${distro_array[ubuntu2404]}" + distros[ubuntu2604]="${distro_array[ubuntu2604]}" + ;; + + f) + distros[fedora44]="${distro_array[fedora44]}" + ;; + + s) + STORAGE=$OPTARG + ;; + + k) + CUSTOM=true + ;; + + r) + distros[rocky9]="${distro_array[rocky9]}" + distros[rocky10]="${distro_array[rocky10]}" + ;; + + o) + distros[opensuse156]="${distro_array[opensuse156]}" + ;; + + c) + distros[centos9]="${distro_array[centos9]}" + distros[centos10]="${distro_array[centos10]}" + ;; + + \?) + echo "Invalid Flag" + exit 1 + ;; + + esac +done + +############## Start of Script ########################### + +# check that required items are present +assertNotEmpty VMID +assertNotEmpty STORAGE + +if $BUILT_IN_CLOUDINIT; then + echo "Checking for required package"; which virt-customize || apt update && apt install -y libguestfs-tools > /dev/null +fi + +if $CUSTOM; then + get_custom_info +fi + +get_cloudinit_params + +for DISTRO in ${!distros[@]}; do + IMAGE=$DISTRO.qcow2 + URL=${distros[$DISTRO]} + download_image + $BUILT_IN_CLOUDINIT && qcow2_modification + create_template + ((VMID=VMID+1)) +done