From 35264d845d1c418f12c13fbef3b23c2b9ea13c66 Mon Sep 17 00:00:00 2001 From: braniz Date: Thu, 5 Oct 2023 22:32:46 +0200 Subject: [PATCH] vbox_create.sh ist ok --- vbox_create.sh | 212 ++++++++++++++++++++++++++++--------------------- 1 file changed, 123 insertions(+), 89 deletions(-) diff --git a/vbox_create.sh b/vbox_create.sh index df3d800..5daf748 100755 --- a/vbox_create.sh +++ b/vbox_create.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Autor: Branislav Zeljak v0.7 +# Autor: Branislav Zeljak v0.8 # Beschreibung: Dieses Skript erstellt VirtualBox-VMs und klonet Festplatten parallel. # Verwendung: Führen Sie das Skript aus und befolgen Sie die Eingabeaufforderungen. clear @@ -9,7 +9,7 @@ clear # Funktion zum Überprüfen der Benutzerexistenz check_user_existence() { - local VAR_GROUP_MEMBERS_IN_GROUP="$1" + local VAR_USER_IN_GROUP="$1" if ! grep -q "^$VAR_USER_IN_GROUP:" /etc/passwd; then echo "Der Benutzer $VAR_USER_IN_GROUP existiert nicht auf diesem System." exit 1 @@ -31,17 +31,34 @@ get_group_users() { # Funktion, um einen zufälligen Host-Namen aus der Liste auszuwählen get_random_name() { - # Liste der Namen - local names=("frodo" "samweis" "gandalf" "aragorn" "legolas" "gimli" "boromir" "meriadoc" "peregrin" "arwen" "galadriel" "celeborn" "elrond" "glorfindel" "faramir" "eowyn" "theoden" "treebeard" "gollum" "sauron" "saruman" "bilbo" "denethor" "radagast" "thranduil" "bard" "dori" "frodo") + # Liste der Namen + local names=("frodo" "samweis" "gandalf" "aragorn" "legolas" "gimli" "boromir" "meriadoc" "peregrin" "arwen" "galadriel" "celeborn" "elrond" "glorfindel" "faramir" "eowyn" "theoden" "treebeard" "gollum" "sauron" "saruman" "bilbo" "denethor" "radagast" "thranduil" "bard" "dori" "frodo") - # Zufälligen Index auswählen - local random_index=$((RANDOM % ${#names[@]})) - echo "${names[random_index]}" + # Zufälligen Index auswählen + local random_index=$((RANDOM % ${#names[@]})) + echo "${names[random_index]}" +} +# Funktion zur Generierung eines eindeutigen RDP-Ports +generate_rdp_port() { + local rdp_port + rdp_port=$(shuf -i 3390-49151 -n 1) + echo "$rdp_port" +} + +# Funktion zum Suchen einer ISO-Datei basierend auf einem Muster +find_iso_file() { + local iso_pattern="$1" + local iso_file + iso_file=$(find "$ISO_DIR" -type f -name "$iso_pattern") + echo "$iso_file" } # %--------------------end/Funktionen--------------------% +echo "User / Passwort: user00/Start1234" +echo "Welches VDI-OS soll installiert werden" +echo echo "Für wen soll es sein?" echo @@ -81,14 +98,13 @@ do break done -# Variable für den User +# Variable für das Verzeichnis VAR_VB="/srv/vbox/${VAR_GROUP_MEMBERS}" clear -echo "Welches Betriebssystem soll installiert werden?" -echo -COLUMNS=10 -PS3="Bitte Ihre Auswahl eingeben: " + +# Verzeichnis mit ISO-Dateien +ISO_DIR="/srv/data/ISO/" echo "Welches Betriebssystem soll installiert werden?" echo @@ -117,91 +133,109 @@ do ;; *) VAR_OS="${OS_MAP[$opt]%% *}" # Extrahiere den ersten Teil (Betriebssystem) - VAR_ISO="${OS_MAP[$opt]#* }" # Extrahiere den zweiten Teil (ISO-Muster) + VAR_ISO_PATTERN="${OS_MAP[$opt]#* }" # Extrahiere den zweiten Teil (ISO-Muster) + + # Finden Sie den tatsächlichen Dateinamen der ISO-Datei + VAR_ISO=$(find_iso_file "$VAR_ISO_PATTERN") + + # Überprüfen Sie, ob die Datei gefunden wurde + if [ -z "$VAR_ISO" ]; then + echo "Die ISO-Datei mit dem Muster '$VAR_ISO_PATTERN' wurde nicht gefunden." + exit 1 + fi ;; esac -default_name=$(get_random_name) + default_name=$(get_random_name) -# Benutzereingabe für VM-Konfiguration - read -p "Geben Sie die Anzahl der VMs an (Standard: 1): " VAR_QUAN - read -p "Praefix Host Name (Vorgabe: $default_name): " VAR_NAME - read -p "CPUs (Standard: 2 CPU): " VAR_CPU - read -p "Memory (Standard: 2048 MB-RAM) : " VAR_MEM - read -p "Bitte die Anzahl der HDD (Standard: 1-HDD) : " VAR_HDD + # Benutzereingabe für VM-Konfiguration + read -p "Wie viele VMs werden benötigt? [1]: " VAR_QUANTITY + VAR_QUANTITY=${VAR_QUANTITY:-1} + read -p "Präfix Host Name (Vorgabe: $default_name): " VAR_NAME_PREFIX + read -p "CPUs [2]: " VAR_CPU + VAR_CPU=${VAR_CPU:-2} + read -p "Memory [2048]: " VAR_MEM + VAR_MEM=${VAR_MEM:-2048} + read -p "Anzahl der zusätzlichen HDDs (Standard: 0): " VAR_ADDITIONAL_HDD + VAR_ADDITIONAL_HDD=${VAR_ADDITIONAL_HDD:-0} -# Variablen: -IFS=" -" + # Standardwerte festlegen, wenn keine Eingabe erfolgt + VAR_VIDEO_RAM=64 + VAR_NIC1="Nat" + VAR_NIC2="bridged" + VAR_NAME_PREFIX=${VAR_NAME_PREFIX:-$default_name} -# Standardwerte festlegen, wenn keine Eingabe erfolgt -VAR_CPU=${VAR_CPU:-2} -VAR_MEM=${VAR_MEM:-2048} -VAR_VID=64 -VAR_RDP=339 -VAR_NIC=bridged -#VAR_NET=enp4s0f1 -VAR_NET=$(ip addr show | grep "^2: " | awk '{print $2}' | sed 's/://') -VAR_NAME=${VAR_NAME:-$default_name} + # Schleife zur Erzeugung der VMs für jeden Benutzer in der Gruppe + for VAR_USER_IN_GROUP in "${VAR_GROUP_MEMBERS[@]}" + do + # Generiere einen eindeutigen RDP-Port + VAR_RDP_PORT=$(generate_rdp_port) -# Schliefe zur erzeugung der VMs -for N in $(seq 1 $VAR_QUAN) - -do - -ORDER_NUM=$(printf "%02d" $N) # Zweistellige Ordnungszahl generieren - sudo -u $VAR_GROUP_MEMBERS VBoxManage createvm \ - --name ${VAR_NAME}-${ORDER_NUM} \ - --ostype ${VAR_OS} \ - --register \ - - sudo -u $VAR_GROUP_MEMBERS VBoxManage modifyvm ${VAR_NAME}-${ORDER_NUM} \ - --ioapic on \ - --cpus ${VAR_CPU} \ - --memory ${VAR_MEM} \ - --vram ${VAR_VID} \ - --graphicscontroller vmsvga \ - --nic1 Nat \ - --nic2 ${VAR_NIC} \ - --bridgeadapter2 ${VAR_NET} \ - --vrde on \ - --vrdemulticon on \ - --vrdeport ${VAR_RDP}${ORDER_NUM} - - sudo -u $VAR_GROUP_MEMBERS VBoxManage storagectl ${VAR_NAME}-${ORDER_NUM} \ - --name "SATA Controller" \ - --add sata \ - --controller IntelAhci - - sudo -u $VAR_GROUP_MEMBERS VBoxManage storagectl ${VAR_NAME}-${ORDER_NUM} \ - --name "IDE Controller" \ - --add ide \ - --controller PIIX4 - - sudo -u $VAR_GROUP_MEMBERS VBoxManage storageattach ${VAR_NAME}-${ORDER_NUM} \ - --storagectl "IDE Controller" \ - --port 1 \ - --device 0 \ - --type dvddrive \ - --medium ${VAR_PATH}${VAR_ISO} - -# HDD erzeugen und zuweisen - for j in $(seq 1 ${VAR_HDD}) + # Schleife zur Erzeugung der angeforderten Anzahl von VMs + for ((i = 1; i <= VAR_QUANTITY; i++)) do - HDD_NUM=$(printf "%02d" $j) - sudo -u $VAR_GROUP_MEMBERS VBoxManage createhd \ - --filename ${VAR_VB}/${VAR_NAME}-${ORDER_NUM}/${VAR_NAME}-${ORDER_NUM}_DISK${HDD_NUM}.vdi \ - --size 102400 \ - --format VDI - sudo -u $VAR_GROUP_MEMBERS VBoxManage storageattach ${VAR_NAME}-${ORDER_NUM} \ - --storagectl "SATA Controller" \ - --port $j \ - --device 0 \ - --type hdd \ - --medium ${VAR_VB}/${VAR_NAME}-${ORDER_NUM}/${VAR_NAME}-${ORDER_NUM}_DISK${HDD_NUM}.vdi - done + # VM erstellen + VM_NAME="${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}--VM$(printf "%02d" $i)" + VM_DIR="/srv/vbox/$VAR_USER_IN_GROUP/$VM_NAME" + sudo -u "$VAR_USER_IN_GROUP" VBoxManage createvm \ + --name "$VM_NAME" \ + --ostype "$VAR_OS" \ + --register \ + --basefolder "$VM_DIR" + + # VM-Konfigurieren + sudo -u "$VAR_USER_IN_GROUP" VBoxManage modifyvm "$VM_NAME" \ + --ioapic on \ + --memory "$VAR_MEM" \ + --cpus "$VAR_CPU" \ + --vram "$VAR_VIDEO_RAM" \ + --nic1 "$VAR_NIC1" \ + --nic2 "$VAR_NIC2" \ + --graphicscontroller vmsvga \ + --vrde on \ + --vrdemulticon on \ + --vrdeport "$VAR_RDP_PORT" + + # Festplattencontroller hinzufügen + sudo -u "$VAR_USER_IN_GROUP" VBoxManage storagectl "$VM_NAME" \ + --name "SATA Controller" \ + --add sata \ + --controller IntelAhci + + sudo -u "$VAR_USER_IN_GROUP" VBoxManage storagectl "$VM_NAME" \ + --name "IDE Controller" \ + --add ide \ + --controller PIIX4 + + sudo -u "$VAR_USER_IN_GROUP" VBoxManage storageattach "$VM_NAME" \ + --storagectl "IDE Controller" \ + --port 1 \ + --device 0 \ + --type dvddrive \ + --medium "$VAR_ISO" + + # Schleife zur Erzeugung von zusätzlichen Festplatten + for ((j = 1; j <= VAR_ADDITIONAL_HDD; j++)) + do + HDD_NUM=$(printf "%02d" $j) + HDD_NAME="${VM_NAME}-disk${HDD_NUM}.vdi" + + sudo -u "$VAR_USER_IN_GROUP" VBoxManage createhd \ + --filename "$VM_DIR/$HDD_NAME" \ + --size 102400 \ + --format VDI + + sudo -u "$VAR_USER_IN_GROUP" VBoxManage storageattach "$VM_NAME" \ + --storagectl "SATA Controller" \ + --port "$HDD_NUM" \ + --device 0 \ + --type hdd \ + --medium "$VM_DIR/$HDD_NAME" + done + done done - break -done + echo "VMs wurden für alle wie angegeben erstellt." + break +done