v0.5.0 - Add proper Comments
This commit is contained in:
parent
67117a23b0
commit
d41475bb7e
@ -9,13 +9,14 @@
|
|||||||
# Date of Last Maintenance: 03.12.2021
|
# Date of Last Maintenance: 03.12.2021
|
||||||
#
|
#
|
||||||
# Current State: Development
|
# Current State: Development
|
||||||
# Version: 0.4.0
|
# Version: 0.5.0
|
||||||
# Version History:
|
# Version History:
|
||||||
# v0.0.1 - Basic Script Structure
|
# v0.0.1 - Basic Script Structure
|
||||||
# v0.1.0 - Get the User input
|
# v0.1.0 - Get the User input
|
||||||
# v0.2.0 - Gather Virtual Machine ID
|
# v0.2.0 - Gather Virtual Machine ID
|
||||||
# v0.3.0 - Get & Select the Image of the Virtualmachine
|
# v0.3.0 - Get & Select the Image of the Virtualmachine
|
||||||
# v0.4.0 - Create the VM & Gather additional Information
|
# v0.4.0 - Create the VM & Gather additional Information
|
||||||
|
# v0.5.0 - Add proper Comments
|
||||||
|
|
||||||
|
|
||||||
# Planned Features:
|
# Planned Features:
|
||||||
@ -28,11 +29,14 @@
|
|||||||
# - [X] Choose Network
|
# - [X] Choose Network
|
||||||
# - [X] IMG & ISO & qcow2 support
|
# - [X] IMG & ISO & qcow2 support
|
||||||
|
|
||||||
# Global Conigurable Variables
|
|
||||||
|
|
||||||
# Global Constants
|
# Global Constants
|
||||||
IMAGE_STORAGE_LOCATION="/var/lib/vz/template/iso/"
|
IMAGE_STORAGE_LOCATION="/var/lib/vz/template/iso/" # Enter here the location of your iso-Templates - This is not adjustable while running the script
|
||||||
DEFAULT_VM_STORAGE="tank-vms"
|
DEFAULT_VM_STORAGE="tank-vms" # Enter here the default Storage Location, so you can Skip it by pressing enter
|
||||||
|
DEFAULT_DOWNLOAD_IMG_yn="n" # Set the default value for the "Download new Image"-Questing
|
||||||
|
DEFAULT_VM_NAME="cloudinit-vm" # Set the default value for the Virtual Machine Name
|
||||||
|
DEFAULT_VM_RAM="2048" # Set the default value of Memory for the Virtual Machine
|
||||||
|
DEFAULT_VM_CORES="2" # Set the default amount of cpu-cores for the Virtual Machine
|
||||||
|
DEFAULT_VM_NET="vmbr0" # Set the default network interface for the Virtual Machine
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
## Gather the ID of the Virtual machine
|
## Gather the ID of the Virtual machine
|
||||||
@ -41,9 +45,8 @@ function gather_vmid {
|
|||||||
qm list | tr -s ' ' | cut -d ' ' -f 2,3 # Get the already used VMIDs & VM-Name
|
qm list | tr -s ' ' | cut -d ' ' -f 2,3 # Get the already used VMIDs & VM-Name
|
||||||
echo "Enter the new ID of your Virtual Machine (It must be unused)"
|
echo "Enter the new ID of your Virtual Machine (It must be unused)"
|
||||||
read VM_ID # Get the User Input(This VMID will be used for the new created VM)
|
read VM_ID # Get the User Input(This VMID will be used for the new created VM)
|
||||||
i=0
|
|
||||||
readarray -t VMID_ARRAY < <(qm list | tail -n +2 | tr -s ' ' | cut -d ' ' -f 2)
|
readarray -t VMID_ARRAY < <(qm list | tail -n +2 | tr -s ' ' | cut -d ' ' -f 2)
|
||||||
if [[ "${VMID_ARRAY[*]}" =~ "$VM_ID" ]]; then
|
if [[ "${VMID_ARRAY[*]}" =~ "$VM_ID" ]]; then # Check if Virtual Machine ID is alredy in use
|
||||||
echo "Your selected Virtual Machine ID is already in use, choose an other ID"
|
echo "Your selected Virtual Machine ID is already in use, choose an other ID"
|
||||||
gather_vmid
|
gather_vmid
|
||||||
fi
|
fi
|
||||||
@ -52,12 +55,12 @@ function gather_vmid {
|
|||||||
function get_img {
|
function get_img {
|
||||||
echo "Do you wish to download an Image? (yes/no)"
|
echo "Do you wish to download an Image? (yes/no)"
|
||||||
read DOWNLOAD_IMG_yn
|
read DOWNLOAD_IMG_yn
|
||||||
case "$DOWNLOAD_IMG_yn" in
|
case "${DOWNLOAD_IMG_yn:=DEFAULT_DOWNLOAD_IMG_yn}" in # Case Statement to switch based on the User Input
|
||||||
yes|YES|Yes|y|Y)
|
yes|YES|Yes|y|Y) # The Yes case enables the possibility to download an Image
|
||||||
echo "Please enter the URL of your Image"
|
echo "Please enter the URL of your Image"
|
||||||
read DOWNLOAD_IMG_URL
|
read DOWNLOAD_IMG_URL
|
||||||
wget "$DOWNLOAD_IMG_URL" --directory-prefix="$IMAGE_STORAGE_LOCATION"
|
wget "$DOWNLOAD_IMG_URL" --directory-prefix="$IMAGE_STORAGE_LOCATION" # Download the Image in to the default Image-Storage
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then # Check if last command (Download) was successful
|
||||||
echo "Download was Successful"
|
echo "Download was Successful"
|
||||||
else
|
else
|
||||||
echo "Download failed"
|
echo "Download failed"
|
||||||
@ -65,22 +68,23 @@ function get_img {
|
|||||||
get_img
|
get_img
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
no|NO|No|n|N)
|
no|NO|No|n|N) # The No Case skips the Image Download step
|
||||||
echo "Carrying on without a new Image"
|
echo "Carrying on without a new Image"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Invalid Argument: Please type \"yes\" or \"no\""
|
echo "Invalid Argument: Please type \"yes\" or \"no\""
|
||||||
|
get_img # Question again if the Answer was not an possible Option
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
## Select an Image
|
## Select an Image
|
||||||
function sel_img {
|
function sel_img {
|
||||||
echo "The following list represents all Images which exist on the Hoststorage"
|
echo "The following list represents all Images which exist on the Hoststorage"
|
||||||
ls $IMAGE_STORAGE_LOCATION -l | tr -s ' ' | cut -d' ' -f 6-9
|
ls $IMAGE_STORAGE_LOCATION -l | tr -s ' ' | cut -d' ' -f 6-9 # List all files in the Image Location and their Age of Creation
|
||||||
readarray -t OS_IMG_ARRAY < <(ls $IMAGE_STORAGE_LOCATION -l | tr -s ' ' | cut -d' ' -f 9)
|
readarray -t OS_IMG_ARRAY < <(ls $IMAGE_STORAGE_LOCATION -l | tr -s ' ' | cut -d' ' -f 9) # Create an Array of all Images
|
||||||
echo "Please enter the correct Image Name(shown above)"
|
echo "Please enter the correct Image Name(shown above)"
|
||||||
read OS_IMG_NAME
|
read OS_IMG_NAME
|
||||||
if ! [[ "${OS_IMG_ARRAY[*]}" =~ "$OS_IMG_NAME" ]]; then
|
if ! [[ "${OS_IMG_ARRAY[*]}" =~ "$OS_IMG_NAME" ]]; then # Check if Selected Image is in the Array, else go back to the selection
|
||||||
echo "Your selected Image does not exist"
|
echo "Your selected Image does not exist"
|
||||||
echo "Maybe it was a Typo, Please check:"
|
echo "Maybe it was a Typo, Please check:"
|
||||||
echo " - Upper/Lowercase writing"
|
echo " - Upper/Lowercase writing"
|
||||||
@ -97,11 +101,11 @@ function gather_img {
|
|||||||
}
|
}
|
||||||
## Gather Virtualmachine Network
|
## Gather Virtualmachine Network
|
||||||
function gather_vm_net {
|
function gather_vm_net {
|
||||||
ip -o link show | awk -F': ' '{print $2}' | grep vmbr
|
ip -o link show | awk -F': ' '{print $2}' | grep vmbr # Get all the Virtual Bridge Interfaces of the Hostsystem
|
||||||
echo "Enter one of the above shown Network-Interfaces to add to your VM"
|
echo "Enter one of the above shown Network-Interfaces to add to your VM"
|
||||||
read VM_NET
|
read VM_NET
|
||||||
readarray -t VM_NET_ARRAY < <(ip -o link show | awk -F': ' '{print $2}' | grep vmbr)
|
readarray -t VM_NET_ARRAY < <(ip -o link show | awk -F': ' '{print $2}' | grep vmbr) # Create an array of all Virtual Bridge Interfaces of the Hostsystem
|
||||||
if ! [[ "${VM_NET_ARRAY[*]}" =~ "$VM_NET" ]]; then
|
if ! [[ "${VM_NET_ARRAY[*]}" =~ "$VM_NET" ]]; then # Check if Selected Network is an existing network else go back to the Selection
|
||||||
echo "Your selected Network does not exist"
|
echo "Your selected Network does not exist"
|
||||||
echo "Maybe it was a Typo, Please check:"
|
echo "Maybe it was a Typo, Please check:"
|
||||||
echo " - Upper/Lowercase writing"
|
echo " - Upper/Lowercase writing"
|
||||||
@ -110,7 +114,6 @@ function gather_vm_net {
|
|||||||
gather_vm_net
|
gather_vm_net
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
## Gather hardware
|
## Gather hardware
|
||||||
function gather_hardware {
|
function gather_hardware {
|
||||||
echo "Enter the amount of memory in MegaBytes"
|
echo "Enter the amount of memory in MegaBytes"
|
||||||
@ -131,7 +134,7 @@ function gather_additional {
|
|||||||
function gather_vm_storage {
|
function gather_vm_storage {
|
||||||
echo "Please enter the Virtual Machine Storage Pool:[$DEFAULT_VM_STORAGE]"
|
echo "Please enter the Virtual Machine Storage Pool:[$DEFAULT_VM_STORAGE]"
|
||||||
read VM_STORAGE
|
read VM_STORAGE
|
||||||
VM_STORAGE=${VM_STORAGE:=$DEFAULT_VM_STORAGE}
|
VM_STORAGE=${VM_STORAGE:=$DEFAULT_VM_STORAGE} # Get the Storage of the VM, if nothing is set just use the Default
|
||||||
}
|
}
|
||||||
## Get all the Variables from the User
|
## Get all the Variables from the User
|
||||||
function get_user_input {
|
function get_user_input {
|
||||||
@ -140,18 +143,19 @@ function get_user_input {
|
|||||||
gather_vm_storage
|
gather_vm_storage
|
||||||
gather_additional
|
gather_additional
|
||||||
}
|
}
|
||||||
|
# Import the Cloudinit image and append it to the Virtual Machine
|
||||||
function vm_import_cloudinit_img {
|
function vm_import_cloudinit_img {
|
||||||
IMG_TYPE=$(echo "$OS_IMG_NAME" | rev | cut -d "." -f 1 | rev)
|
IMG_TYPE=$(echo "$OS_IMG_NAME" | rev | cut -d "." -f 1 | rev) # Get the Image Fileending for further operations
|
||||||
if [ $IMG_TYPE == "iso" ] || [ $IMG_TYPE == "img" ];then
|
if [ $IMG_TYPE == "iso" ] || [ $IMG_TYPE == "img" ];then # If the Image Fileending is "iso" or img" do the following
|
||||||
qm importdisk "$VM_ID" "$IMAGE_STORAGE_LOCATION$OS_IMG_NAME" "$VM_STORAGE" -format qcow2
|
qm importdisk "$VM_ID" "$IMAGE_STORAGE_LOCATION$OS_IMG_NAME" "$VM_STORAGE" -format qcow2 # Convert the Image to qcow2 format and write it to the VM-Storage
|
||||||
if ! [ $? -eq 0 ];then
|
if ! [ $? -eq 0 ];then
|
||||||
echo "It was not possible to convert a new Image with your values"
|
echo "It was not possible to convert a new Image with your values"
|
||||||
echo "Read the error message above"
|
echo "Read the error message above"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
elif [ $IMG_TYPE == "qcow2" ];then
|
elif [ $IMG_TYPE == "qcow2" ];then # If the Image Fileending is "qcow2" do the following
|
||||||
qm importdisk "$VM_ID" "$IMAGE_STORAGE_LOCATION$OS_IMG_NAME" "$VM_STORAGE"
|
qm importdisk "$VM_ID" "$IMAGE_STORAGE_LOCATION$OS_IMG_NAME" "$VM_STORAGE" #import a copy of the Image to the VM, safe the copy in the set Storagepath
|
||||||
if ! [ $? -eq 0 ];then
|
if ! [ $? -eq 0 ];then
|
||||||
echo "It was not possible to convert a new Image with your values"
|
echo "It was not possible to convert a new Image with your values"
|
||||||
echo "Read the error message above"
|
echo "Read the error message above"
|
||||||
exit
|
exit
|
||||||
@ -162,21 +166,22 @@ function vm_import_cloudinit_img {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
# Create the Virtual Machine with Set-Values
|
||||||
function create_qm_vm {
|
function create_qm_vm {
|
||||||
qm create "$VM_ID" --name "$VM_NAME" --memory "$VM_RAM" --cores "$VM_CORES" --net0 virtio,bridge="$VM_NET"
|
qm create "$VM_ID" --name "${VM_NAME:=$DEFAULT_VM_NAME}" --memory "${VM_RAM:=$DEFAULT_VM_RAM}" --cores "${VM_CORES:=$DEFAULT_VM_CORES}" --net0 virtio,bridge="${VM_NET:=$DEFAULT_VM_NET}" # Create the Virtualmachine with the set hardware specification
|
||||||
if ! [ $? -eq 0 ];then
|
if ! [ $? -eq 0 ];then
|
||||||
echo "It was not possible to create a Virtual machine with your values"
|
echo "It was not possible to create a Virtual machine with your values"
|
||||||
echo "Read the error message above"
|
echo "Read the error message above"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
vm_import_cloudinit_img
|
vm_import_cloudinit_img # Import the Image to the Virtual Machine
|
||||||
qm set $VM_ID --scsihw virtio-scsi-pci --scsi0 $VM_STORAGE:vm-$VM_ID-disk-0
|
qm set $VM_ID --scsihw virtio-scsi-pci --scsi0 $VM_STORAGE:vm-$VM_ID-disk-0 #Add the Image to the Virtual Machine
|
||||||
if ! [ $? -eq 0 ];then
|
if ! [ $? -eq 0 ];then
|
||||||
echo "It was not possible to add the custom Image to your Virtual machine"
|
echo "It was not possible to add the custom Image to your Virtual machine"
|
||||||
echo "Read the error message above"
|
echo "Read the error message above"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
qm set $VM_ID --ide2 $VM_STORAGE:cloudinit --boot c --bootdisk scsi0 --serial0 socket --vga serial0
|
qm set $VM_ID --ide2 $VM_STORAGE:cloudinit --boot c --bootdisk scsi0 --serial0 socket --vga serial0 #Add the Cloud-Initdrive & set the Bootdrive & Add a serial console(is needed for cloud-init)
|
||||||
if ! [ $? -eq 0 ];then
|
if ! [ $? -eq 0 ];then
|
||||||
echo "It was not possible to add an cloudinit drive to your Virtual machine"
|
echo "It was not possible to add an cloudinit drive to your Virtual machine"
|
||||||
echo "Read the error message above"
|
echo "Read the error message above"
|
||||||
|
Loading…
Reference in New Issue
Block a user