template.sh hinzugefügt
This commit is contained in:
243
template.sh
Normal file
243
template.sh
Normal file
@@ -0,0 +1,243 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Sources using Openstack images
|
||||
declare -A sources
|
||||
declare -A template_ids
|
||||
declare -A result_ids
|
||||
|
||||
#!/bin/bash
|
||||
|
||||
# Sources using Openstack images
|
||||
declare -A sources
|
||||
declare -A template_ids
|
||||
declare -A result_ids
|
||||
|
||||
template_ids["Debian"]=10000
|
||||
template_ids["Ubuntu"]=10100
|
||||
template_ids["Almalinux"]=10200
|
||||
template_ids["ArchLinux"]=10300
|
||||
template_ids["Fedora"]=10400
|
||||
template_ids["Centos"]=10500
|
||||
template_ids["Rocky"]=10600
|
||||
template_ids["Gentoo"]=10700
|
||||
|
||||
# Debian Versions
|
||||
sources["Debian-12"]="https://root.jorden.info/Cloud-Image/Debian/debian-12-generic-amd64.qcow2"
|
||||
sources["Debian-11"]="https://root.jorden.info/Cloud-Image/Debian/debian-11-generic-amd64.qcow2"
|
||||
sources["Debian-10"]="https://root.jorden.info/Cloud-Image/Debian/debian-10-openstack-amd64.qcow2"
|
||||
|
||||
# Ubuntu Versions
|
||||
# Here we use a kvm image, because they are smaller than the openstack images
|
||||
sources["Ubuntu-24.04"]="https://root.jorden.info/Cloud-Image/Ubuntu/noble-server-cloudimg-amd64.img"
|
||||
sources["Ubuntu-22.04"]="https://root.jorden.info/Cloud-Image/Ubuntu/jammy-server-cloudimg-amd64.img"
|
||||
sources["Ubuntu-20.04"]="https://root.jorden.info/Cloud-Image/Ubuntu/focal-server-cloudimg-amd64.img"
|
||||
sources["Ubuntu-18.04"]="https://root.jorden.info/Cloud-Image/Ubuntu/bionic-server-cloudimg-amd64.img"
|
||||
|
||||
# AlmaLinux Versions
|
||||
sources["Almalinux-9"]="https://root.jorden.info/Cloud-Image/AlmaLinux/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2"
|
||||
sources["Almalinux-8"]="https://root.jorden.info/Cloud-Image/AlmaLinux/AlmaLinux-8-GenericCloud-latest.x86_64.qcow2"
|
||||
|
||||
# ArchLinux Versions
|
||||
sources["ArchLinux"]="https://root.jorden.info/Cloud-Image/ArchLinux/Arch-Linux-x86_64-cloudimg.qcow2"
|
||||
|
||||
# Fedora Versions
|
||||
sources["Fedora-41"]="https://root.jorden.info/Cloud-Image/Fedora/fedora-coreos-41.20250130.3.0-nutanix.x86_64.qcow2"
|
||||
|
||||
# CentOS Versions
|
||||
sources["Centos-9"]="https://root.jorden.info/Cloud-Image/CentOS/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2"
|
||||
sources["Centos-8"]="https://root.jorden.info/Cloud-Image/CentOS/CentOS-8-GenericCloud-8.4.2105-20210603.0.x86_64.qcow2"
|
||||
sources["Centos-7"]="https://root.jorden.info/Cloud-Image/CentOS/CentOS-7-x86_64-GenericCloud-2211.qcow2"
|
||||
|
||||
# Rocky Versions
|
||||
sources["Rocky-9"]="https://root.jorden.info/Cloud-Image/Rocky/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2"
|
||||
sources["Rocky-8"]="https://root.jorden.info/Cloud-Image/Rocky/Rocky-8-GenericCloud-Base.latest.x86_64.qcow2"
|
||||
|
||||
# Gentoo Versions
|
||||
sources["Gentoo"]="https://root.jorden.info/Cloud-Image/Gentoo/di-amd64-cloudinit-20250223T170333Z.qcow2"
|
||||
|
||||
download_template() {
|
||||
echo "[*] Downloading template $1..."
|
||||
wget -q --show-progress -O "$2" "$1"
|
||||
echo "[*] Download complete."
|
||||
}
|
||||
|
||||
vm_exists() {
|
||||
qm list | grep -q "$1"
|
||||
}
|
||||
|
||||
echo " # "
|
||||
echo " # #### ##### ##### ###### # # # # # ###### #### "
|
||||
echo " # # # # # # # # ## # # ## # # # # "
|
||||
echo " # # # # # # # ##### # # # # # # # ##### # # "
|
||||
echo " # # # # ##### # # # # # # ### # # # # # # # "
|
||||
echo " # # # # # # # # # # ## ### # # ## # # # "
|
||||
echo " ##### #### # # ##### ###### # # ### # # # # #### "
|
||||
echo " "
|
||||
echo ""
|
||||
echo " > Create Proxmox Templates <"
|
||||
echo ""
|
||||
|
||||
|
||||
# Check if script is run with root permissions
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
echo "[x] Please run this script with root privileges."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if Proxmox is installed
|
||||
if ! [ -f /etc/pve/pve-root-ca.pem ]; then
|
||||
echo "[x] Proxmox is not installed, please run this script in a Proxmox Environment."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[*] Installing dependencies..."
|
||||
apt -qq install -y libguestfs-tools wget dialog &> /dev/null
|
||||
|
||||
# Let user enter a storage name
|
||||
read -p "[?] Please enter a the name for the storage to save the template machines to (default=local-lvm): " -r storage
|
||||
storage=${storage:-"local-lvm"}
|
||||
|
||||
# Let user choose whether to delete templates after creation
|
||||
read -p "[?] Do you want to delete the downloaded images after creation? (y/n, default=y): " -r delete_templates
|
||||
delete_templates=${delete_templates:-y}
|
||||
|
||||
read -p "[?] Do you want to delete existing templates? (y/n, default=n): " -r delete_previous
|
||||
delete_previous=${delete_previous:-n}
|
||||
|
||||
read -p "[?] Use CPU type host instead of kvm64 by default? (y/n, default=y): " -r use_cpu_host
|
||||
use_cpu_host=${use_cpu_host:-y}
|
||||
|
||||
clear
|
||||
|
||||
# Let user select distros to download
|
||||
cmd=(dialog --separate-output --title "Distro Selection" --checklist "Select distros to create templates for:" 22 76 16)
|
||||
options=(
|
||||
$(for key in "${!sources[@]}"; do
|
||||
echo "$key"
|
||||
echo "$key"
|
||||
echo "on"
|
||||
done)
|
||||
)
|
||||
choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
|
||||
|
||||
clear
|
||||
|
||||
# Check if storage exists in Proxmox
|
||||
if ! (pvesm list "$storage" | grep -q "$storage"); then
|
||||
echo "[x] Storage does not exist in Proxmox or does not have any hosts, please choose another name."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Delete existing templates
|
||||
if [ "$delete_previous" = "y" ]; then
|
||||
echo "[*] Deleting existing templates..."
|
||||
|
||||
vm_list=$(qm list | grep template | awk '{print $1}')
|
||||
for vm_id in "${template_ids[@]}"; do
|
||||
for i in $(seq $vm_id $(($vm_id + ${#sources[@]}))); do
|
||||
if echo "$vm_list" | grep -q "$i"; then
|
||||
qm destroy "$i"
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
echo "[*] Deletion complete."
|
||||
fi
|
||||
|
||||
start=$(date +%s)
|
||||
|
||||
sorted=$(for i in "${!choices[@]}"; do echo "${choices[i]}"; done | sort)
|
||||
for source in $sorted; do
|
||||
if vm_exists "template-$source"; then
|
||||
echo "[*] Template for $source already exists, skipping..."
|
||||
continue
|
||||
fi
|
||||
|
||||
distro=$(echo "$source" | cut -d'-' -f1)
|
||||
vm_id=${template_ids[$distro]}
|
||||
|
||||
while vm_exists "$vm_id"; do
|
||||
echo "[*] VM with ID $vm_id already exists, trying next id..."
|
||||
vm_id=$(($vm_id + 1))
|
||||
done
|
||||
|
||||
echo "[*] Creating template for $source..."
|
||||
|
||||
extension="${sources[$source]##*.}"
|
||||
image_path="/tmp/$source.$extension"
|
||||
download_template "${sources[$source]}" "$image_path"
|
||||
|
||||
echo "[*] Customizing image, please wait..."
|
||||
virt-customize -a "$image_path" \
|
||||
--install qemu-guest-agent \
|
||||
--run-command 'sed -i "s/ssh_pwauth:.*0/ssh_pwauth: 1/" /etc/cloud/cloud.cfg' \
|
||||
--run-command 'sed -i "s/ssh_pwauth:.*[Ff]alse/ssh_pwauth: true/" /etc/cloud/cloud.cfg' \
|
||||
--run-command 'sed -i "s/disable_root:.*[Tt]rue/disable_root: false/" /etc/cloud/cloud.cfg' \
|
||||
--run-command 'sed -i "s/disable_root:.*1/disable_root: 0/" /etc/cloud/cloud.cfg' \
|
||||
--run-command 'sed -i "s/lock_passwd:.*[Tt]rue/lock_passwd: false/" /etc/cloud/cloud.cfg' \
|
||||
--run-command 'sed -i "s/lock_passwd:.*1/lock_passwd: 0/" /etc/cloud/cloud.cfg' \
|
||||
--run-command 'sed -i "s/PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config' \
|
||||
--run-command 'sed -i "s/PermitRootLogin [Nn]o/PermitRootLogin yes/" /etc/ssh/sshd_config' \
|
||||
--run-command 'sed -i "s/#PermitRootLogin [Yy]es/PermitRootLogin yes/" /etc/ssh/sshd_config' \
|
||||
--run-command 'sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config' \
|
||||
--run-command 'sed -i "s/KbdInteractiveAuthentication [Nn]o/#KbdInteractiveAuthentication no/" /etc/ssh/sshd_config' \
|
||||
--run-command 'sed -i "s/[#M]axAuthTries 6/MaxAuthTries 20/" /etc/ssh/sshd_config' \
|
||||
--no-logfile
|
||||
|
||||
echo "[*] Creating new VM with ID $vm_id..."
|
||||
is_x86_64_v2=$(echo "${sources[$source]}" | grep -c "x86_64")
|
||||
cpu_type="kvm64"
|
||||
if [ "$use_cpu_host" = "y" ]; then
|
||||
cpu_type="host"
|
||||
fi
|
||||
|
||||
if [ "$is_x86_64_v2" -eq 1 ]; then
|
||||
cpu_type="x86-64-v2"
|
||||
fi
|
||||
|
||||
qm create $vm_id --name "$source" --memory 512 --cores 1 --net0 virtio,bridge=vmbr0,firewall=1 --agent enabled=1,fstrim_cloned_disks=1 --cpu $cpu_type
|
||||
|
||||
echo "[*] Importing template image..."
|
||||
qm importdisk $vm_id "/tmp/$source.$extension" "$storage" -format qcow2
|
||||
|
||||
echo "[*] Attaching disk to template..."
|
||||
qm set $vm_id --scsihw virtio-scsi-pci --scsi0 "$storage:vm-$vm_id-disk-0"
|
||||
|
||||
echo "[*] Applying important settings..."
|
||||
qm set $vm_id --ide2 "$storage:cloudinit" --boot c --bootdisk scsi0 --serial0 socket --vga std
|
||||
|
||||
echo "[*] Adding empty CDROM Drive..."
|
||||
qm set $vm_id --ide1 none,media=cdrom
|
||||
|
||||
echo "[*] Resizing disk..."
|
||||
qm resize $vm_id scsi0 +2G
|
||||
|
||||
echo "[*] Creating template from VM..."
|
||||
qm template $vm_id
|
||||
|
||||
if [ "$delete_templates" = "y" ]; then
|
||||
echo "[*] Deleting downloaded image file:"
|
||||
rm -v $image_path
|
||||
fi
|
||||
|
||||
result_ids[$source]="$vm_id"
|
||||
template_ids[$distro]=$(($vm_id+1))
|
||||
|
||||
echo "[*] Template creation for $source complete."
|
||||
done
|
||||
|
||||
end=$(date +%s)
|
||||
echo "[*] Script execution finished after $((($end-$start)/60)) min $((($end-$start)%60)) sec."
|
||||
|
||||
created_count=${#result_ids[@]}
|
||||
if [ "$created_count" -eq 0 ]; then
|
||||
echo "[!] No new templates were created."
|
||||
exit 0
|
||||
else
|
||||
echo "[*] The following templates were created:"
|
||||
for source in "${!result_ids[@]}"; do
|
||||
echo " - $source: ${result_ids[$source]}"
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user