batman
This commit is contained in:
@@ -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=<GatewayIP>,ip=<IPv4Format/CIDR>"
|
||||||
|
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
|
||||||
Executable
+167
@@ -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] <options>"
|
||||||
|
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
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#network-config
|
||||||
|
network:
|
||||||
|
version: 2
|
||||||
|
ethernets:
|
||||||
|
ens18:
|
||||||
|
dhcp4: true
|
||||||
@@ -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 ]
|
||||||
@@ -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"
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
network:
|
||||||
|
version: 2
|
||||||
|
ethernets:
|
||||||
|
vtnet0:
|
||||||
|
dhcp4: true
|
||||||
@@ -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"
|
||||||
|
|
||||||
Executable
+205
@@ -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=<GatewayIP>,ip=<IPv4Format/CIDR>\": " 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
|
||||||
Reference in New Issue
Block a user