diff --git a/createvm.sh b/createvm.sh new file mode 100644 index 0000000..a46f9dc --- /dev/null +++ b/createvm.sh @@ -0,0 +1,376 @@ +#!/bin/bash + +# Log naar een bestand, inclusief foutmeldingen +exec > >(tee -a ./createvm.log) 2>&1 + +# Log de start van het script +echo "Script gestart op: $(date)" + +while true; do + read -p "Voer de VMID in (getal): " VMID + if [[ "$VMID" =~ ^[0-9]+$ ]]; then + # Controleer of de VM al bestaat direct na invoer + if qm list | awk '{print $1}' | grep -q "^$VMID$"; then + echo "Een VM of template met ID $VMID bestaat al." + read -p "Wil je deze overschrijven? (j/n): " antwoord + if [[ ! "$antwoord" =~ ^[jJ]$ ]]; then + echo "Afgebroken door de gebruiker." + exit 0 + fi + + # Indien bevestigd, verwijder de bestaande VM + echo "Verwijderen van de bestaande VM met ID $VMID..." + qm stop $VMID --skiplock # Stop de VM als deze draait + qm destroy $VMID --destroy-unreferenced-disks 1 --purge 1 # Verwijder de VM inclusief de schijven + echo "De bestaande VM met ID $VMID is verwijderd." + # Op dit punt willen we niet opnieuw om een VMID vragen, maar doorgaan met de rest van het script + break + else + echo "Geen bestaande VM met ID $VMID gevonden." + break # Verlaat de loop als er geen bestaande VM is gevonden + fi + else + echo "Ongeldige invoer. Voer een geldig getal in voor de VMID." + fi +done + +# Keuze voor het downloaden van het besturingssysteem +while true; do + echo "Kies het besturingssysteem dat je wilt downloaden:" + echo "1) OS-LOOS" + echo "2) Debian 11" + echo "3) Debian 12" + echo "4) Ubuntu 22.04" + echo "5) Ubuntu 24.04" + echo "6) Almalinux 9" + echo "7) Windows server 2025 EVAL GUI TODO" + echo "8) Windows server 2025 EVAL TODO" + read -p "Voer je keuze in (1 - 8 ): " OSKEUZE + + case $OSKEUZE in + 1) + IMAGE_URL="" + IMAGE_NAME="" + echo "OS-LOOS geselecteerd." + break + ;; + 2) + IMAGE_URL="https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-generic-amd64.qcow2" + IMAGE_NAME="debian-11-generic-amd64.qcow2" + echo "Debian 11 geselecteerd." + break + ;; + 3) + IMAGE_URL="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2" + IMAGE_NAME="debian-12-generic-amd64.qcow2" + echo "Debian 12 geselecteerd." + break + ;; + 4) + IMAGE_URL="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img" + IMAGE_NAME="jammy-server-cloudimg-amd64.img" + echo "Ubuntu 22.04 geselecteerd." + break + ;; + 5) + IMAGE_URL="https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img" + IMAGE_NAME="noble-server-cloudimg-amd64.img" + echo "Ubuntu 24.04 geselecteerd." + break + ;; + 6) + IMAGE_URL="https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2" + IMAGE_NAME="AlmaLinux-9-GenericCloud-latest.x86_64.qcow2" + echo "Almalinux 9 geselecteerd." + break + ;; + 7) + IMAGE_URL="" + IMAGE_NAME="" + echo "Windows server 2025 EVAL GUI geselecteerd." + break + ;; + 8) + IMAGE_URL="" + IMAGE_NAME="" + echo "Windows server 2025 EVAL geselecteerd." + break + ;; + *) + echo "Ongeldige keuze. Voer 1 - 8 in." + ;; + esac +done + +# Vraag de gebruiker om de naam van de VM +read -p "Voer de naam van de VM in: " VMNAME + +# Vraag de gebruiker om de gebruikersnaam +read -p "Voer de gewenste gebruikersnaam in: " VMUSER + +# Variabelen initialiseren +VMPASSWORD="" +SSH_KEYS_PATH="" +SSH_KEY_TEXT="" + +# Vraag de gebruiker om het wachtwoord en controleer de bevestiging +while true; do + read -s -p "Voer het gewenste wachtwoord in (laat leeg om alleen SSH keys te gebruiken): " VMPASSWORD + echo # Nieuwe regel na wachtwoordinvoer + + # Als er een wachtwoord is opgegeven, vraag om bevestiging + if [ -n "$VMPASSWORD" ]; then + read -s -p "Bevestig het wachtwoord: " VMPASSWORD_CONFIRM + echo # Nieuwe regel na bevestiging + # Controleer of de wachtwoorden overeenkomen + if [ "$VMPASSWORD" != "$VMPASSWORD_CONFIRM" ]; then + echo "De wachtwoorden komen niet overeen. Probeer het opnieuw." + continue # Ga terug naar het begin van de loop om opnieuw te vragen + fi + fi + + # Vraag de gebruiker of hij/zij een SSH-sleutelpad of een directe invoer wil gebruiken + echo "Wil je een SSH-sleutel als bestand opgeven of direct als tekst invoeren? (Kies een van de 2 en druk op enter om over te slaan als je al een wachtwoord ingevoerd heb.)" + echo "1) Pad naar SSH-sleutelbestand" + echo "2) SSH-sleutel als tekst invoeren" + read -p "Maak een keuze (1 of 2): " SSHKEUZE + + case $SSHKEUZE in + 1) + # Vraag de gebruiker om het pad naar de SSH-sleutels en controleer of het bestand bestaat + read -p "Voer het pad naar de SSH-sleutels in (optioneel, druk op Enter om over te slaan): " SSH_KEYS_PATH1 + if [ -n "$SSH_KEYS_PATH1" ] && [ -f "$SSH_KEYS_PATH1" ]; then + cp "$SSH_KEYS_PATH1" /tmp/temporary_ssh_key.pub + # Sla de naam van het tijdelijke bestand op in een variabele + SSH_KEYS_PATH="/tmp/temporary_ssh_key.pub" + echo "SSH-sleutels gevonden op: $SSH_KEYS_PATH" + else + SSH_KEYS_PATH="" + echo "Geen geldig bestand opgegeven. Ga verder zonder SSH-sleutelbestand." + fi + ;; + 2) + read -p "Voer de SSH-sleutel in (plak je sleutel en druk op Enter): " SSH_KEY_TEXT + if [ -n "$SSH_KEY_TEXT" ]; then + # Sla de ingevoerde sleutel tijdelijk op in een bestand + SSH_KEYS_PATH="/tmp/temporary_ssh_key.pub" + echo "$SSH_KEY_TEXT" > "$SSH_KEYS_PATH" + echo "SSH-sleutel opgeslagen als tijdelijk bestand: $SSH_KEYS_PATH" + else + SSH_KEYS_PATH="" + echo "Geen SSH-sleutel ingevoerd. Ga verder zonder SSH-sleutel." + fi + ;; + *) + echo "Ongeldige keuze. Probeer het opnieuw." + continue + ;; + esac + + # Als er een wachtwoord is opgegeven of een SSH-sleutelpad (of tekst) is opgegeven, ga door + if [ -n "$VMPASSWORD" ] || [ -n "$SSH_KEYS_PATH" ]; then + # Geef een samenvatting van de invoer + if [ -n "$VMPASSWORD" ]; then + echo "Wachtwoord: Ingesteld" + else + echo "Wachtwoord: Niet ingesteld, alleen SSH-sleutels zullen worden gebruikt." + fi + + if [ -n "$SSH_KEYS_PATH" ]; then + echo "SSH-sleutels gevonden of ingevoerd als tekst." + else + echo "SSH-sleutels: Niet opgegeven" + fi + + break # Verlaat de loop als een van de twee opties is ingesteld + else + # Als beide ontbreken, toon een foutmelding en herhaal de prompt + echo "Error: Er moet ten minste een wachtwoord of een SSH-sleutel worden opgegeven." + fi +done + +# Vraag de gebruiker om de disk grootte en valideer dat het alleen cijfers zijn +while true; do + read -p "Voer de gewenste disk grootte in GiB: " DISK_SIZE + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + echo "Geldige disk grootte: ${DISK_SIZE} GiB" + break # Verlaat de loop als de invoer correct is + else + echo "Ongeldige invoer. Voer een geldig getal in voor de disk grootte (bijv. 10)." + fi +done + +# Functie om beschikbare opslaglocaties op te halen en te laten kiezen +function kies_storage() { + echo "Beschikbare storage op de Proxmox server:" + + # Haal de beschikbare opslaglocaties op + STORAGE_LIST=$(pvesm status | awk 'NR>1 {print $1}') # Skip de eerste regel (header) + + # Controleer of er opslaglocaties beschikbaar zijn + if [ -z "$STORAGE_LIST" ]; then + echo "Geen opslaglocaties gevonden op de server." + exit 1 + fi + + # Toon de beschikbare opslaglocaties en laat de gebruiker kiezen + PS3="Kies de gewenste storage locatie: " + select STORAGE in $STORAGE_LIST; do + if [[ -n "$STORAGE" ]]; then + echo "Je hebt gekozen voor opslaglocatie: $STORAGE" + break + else + echo "Ongeldige keuze, probeer het opnieuw." + fi + done +} + +# Roep de functie aan om de opslag te kiezen +kies_storage + +# Vraag de gebruiker of hij de VM als template wil instellen +read -p "Wil je de VM omzetten naar een template? (j/n): " template_keuze + +# Weergeven van de ingevoerde variabelen +echo "Gekozen instellingen:" +echo "VMID: $VMID" +echo "STORAGE: $STORAGE" +echo "VMNAME: $VMNAME" +echo "VMUSER: $VMUSER" +echo "DISK_SIZE: $DISK_SIZE" +echo "SSH_KEYS_PATH: $SSH_KEYS_PATH" +echo "Geselecteerd image: $IMAGE_URL" +echo "Op te slaan image naam: $IMAGE_NAME" +echo "template maken? $template_keuze" + +# Bevestigingsprompt +read -p "Klopt alles? (j/n): " bevestiging +if [[ ! "$bevestiging" =~ ^[jJ]$ ]]; then + echo "Afgebroken door de gebruiker." + exit 0 +fi + +echo "Voortzetten met de volgende instellingen..." + +# Vereiste packages installeren +sudo apt install libguestfs-tools -y + +# Download de Debian cloud image +wget -O /tmp/"$IMAGE_NAME" "$IMAGE_URL" + +# Haal de DISKTYPE op +DISKTYPE=$(pvesm status | awk -v storage="$STORAGE" 'NR>1 && $1 == storage {print $2}') + +# Pas de image aan met de vereiste tools en configuraties +case $OSKEUZE in + 1) # OS-LOOS + ;; + 2|3|4|5) # Debian en Ubuntu + virt-customize --install qemu-guest-agent,htop,curl,avahi-daemon,console-setup,cron,cifs-utils -a /tmp/"$IMAGE_NAME" + virt-customize --run-command "systemctl enable qemu-guest-agent" -a /tmp/"$IMAGE_NAME" + + case $SSH_KEYS_PATH in + '') # leeg + virt-customize -a /tmp/"$IMAGE_NAME" \ + --run-command 'sed -i "s/^#PasswordAuthentication yes/PasswordAuthentication yes/" /etc/ssh/sshd_config' \ + --run-command 'sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config' \ + --run-command 'systemctl restart sshd' + ;; + /tmp/temporary_ssh_key.pub) # iets + ;; + esac + + virt-customize -a /tmp/"$IMAGE_NAME" --truncate /etc/machine-id --truncate /var/lib/dbus/machine-id + ;; + 6) # RHEL + virt-customize --install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -a /tmp/"$IMAGE_NAME" + virt-customize --install qemu-guest-agent,htop,curl,cifs-utils,firewalld -a /tmp/"$IMAGE_NAME" + virt-customize --selinux-relabel -a /tmp/"$IMAGE_NAME" + virt-customize --run-command "systemctl enable firewalld" -a /tmp/"$IMAGE_NAME" + virt-customize --run-command "systemctl enable qemu-guest-agent" -a /tmp/"$IMAGE_NAME" + + case $SSH_KEYS_PATH in + '') # leeg + virt-customize -a /tmp/"$IMAGE_NAME" \ + --run-command 'sed -i "s/^#PasswordAuthentication yes/PasswordAuthentication yes/" /etc/ssh/sshd_config' \ + --run-command 'sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config' \ + --run-command 'systemctl restart sshd' + ;; + /tmp/temporary_ssh_key.pub) # iets + ;; + esac + + ;; + 7|8) # Windows + ;; +esac + +# Maak een nieuwe VM aan met de opgegeven parameters +qm create $VMID --name $VMNAME --memory 1024 --cores 1 --net0 virtio,bridge=vmbr0,firewall=1 --agent 1 + +# Importeer de aangepaste image op basis van storage type +case $DISKTYPE in + dir|btrfs) # OS-LOOS / Windows + qm importdisk $VMID /tmp/"$IMAGE_NAME" $STORAGE + qm set $VMID --scsihw virtio-scsi-single --scsi0 $STORAGE:$VMID/vm-$VMID-disk-0.raw,discard=on,iothread=1,ssd=1,format=raw + ;; + lvm|lvmthin|zfspool) # Debian en Ubuntu en RHEL + qm importdisk $VMID /tmp/"$IMAGE_NAME" $STORAGE + qm set $VMID --scsihw virtio-scsi-single --scsi0 $STORAGE:vm-$VMID-disk-0,discard=on,iothread=1,ssd=1,format=raw + ;; +esac + +# Stel de schijven en andere VM-instellingen in +qm set $VMID --ide0 $STORAGE:cloudinit,format=raw +qm set $VMID --ide2 none,media=cdrom +qm set $VMID --bios ovmf +qm set $VMID --machine q35 +qm set $VMID --tablet 0 +qm set $VMID --serial0 socket + +# Stel netwerkinstellingen en CPU-configuraties in +qm set $VMID --ipconfig0 ip=dhcp,ip6=auto +qm set $VMID --cpu cputype=host,flags="+md-clear;+spec-ctrl;+aes" + +# Stel Cloud-Init instellingen in +qm set $VMID --ciuser $VMUSER +qm set $VMID --cipassword $VMPASSWORD +qm set $VMID --ciupgrade 1 + +# Overige instellingen zoals automatische start en SSH-sleutels +qm set $VMID --onboot 1 + +case $SSH_KEYS_PATH in + '') # leeg + ;; + /tmp/temporary_ssh_key.pub) # iets + qm set $VMID --sshkeys /tmp/temporary_ssh_key.pub + ;; +esac + +qm set $VMID --efidisk0 $STORAGE:0,format=raw,pre-enrolled-keys=1 + +# Stel de bootvolgorde in +case $OSKEUZE in + 0|7|8) # OS-LOOS / WIndows + qm set $VMID --boot order="ide2;net0" + ;; + 1|2|3|4|5|6) # Debian en Ubuntu en RHEL + qm set $VMID --boot order="scsi0;ide2;net0" + ;; +esac + +# Pas de grootte van de schijf aan naar wat er opgegeven is +qm resize $VMID scsi0 "$DISK_SIZE"G + +# Zet de VM om in een template +case $template_keuze in + j) # ja + qm template $VMID + ;; + n) # nee + ;; +esac + +# Verwijder de files van dit script +sudo rm /tmp/"$IMAGE_NAME" \ No newline at end of file