Reputation: 63
I was setting up VMWare ESXi on my laptop for learning purposes. I wanted to automate things and got this very nice shell script. It asks for parameters such as the cpu cores, iso path, ram and disk space. I am a beginner in the shell. I understand that it's a very basic question but couldn't find an answer on the internet. Here's the code.
I don't understand how to enter the values of <|c|i|r|s>
— the syntax required is not clear, to be precise.
#paratmers: machine name (required), CPU (number of cores), RAM (memory size in MB), HDD Disk size (in GB), ISO (Location of ISO image, optional)
#default params: CPU: 2, RAM: 4096, DISKSIZE: 20GB, ISO: 'blank'
-
phelp() {
echo "Script for automatic Virtual Machine creation for ESX"
echo "Usage: ./create.sh options: n <|c|i|r|s>"
echo "Where n: Name of VM (required), c: Number of virtual CPUs, i: location of an ISO image, r: RAM size in MB, s: Disk size in GB"
echo "Default values are: CPU: 2, RAM: 4096MB, HDD-SIZE: 20GB"
}
CPU=2
RAM=4096
SIZE=20
ISO="ISO'S"
FLAG=true
ERR=false
n=vmoo
while getopts n:c:i:r:s: option
do
case $option in
n)
NAME=${OPTARG};
FLAG=false;
if [ -z $NAME ]; then
ERR=true
MSG="$MSG | Please make sure to enter a VM name."
fi
;;
c)
CPU=${OPTARG}
if [ `echo "$CPU" | egrep "^-?[0-9]+$"` ]; then
if [ "$CPU" -le "0" ] || [ "$CPU" -ge "32" ]; then
ERR=true
MSG="$MSG | The number of cores has to be between 1 and 32."
fi
else
ERR=true
MSG="$MSG | The CPU core number has to be an integer."
fi
;;
i)
ISO=${OPTARG}
if [ ! `echo "$ISO" | egrep "^.*\.(iso)$"` ]; then
ERR=true
MSG="$MSG | The extension should be .iso"
fi
;;
r)
RAM=${OPTARG}
if [ `echo "$RAM" | egrep "^-?[0-9]+$"` ]; then
if [ "$RAM" -le "0" ]; then
ERR=true
MSG="$MSG | Please assign more than 1MB memory to the VM."
fi
else
ERR=true
MSG="$MSG | The RAM size has to be an integer."
fi
;;
s)
SIZE=${OPTARG}
if [ `echo "$SIZE" | egrep "^-?[0-9]+$"` ]; then
if [ "$SIZE" -le "0" ]; then
ERR=true
MSG="$MSG | Please assign more than 1GB for the HDD size."
fi
else
ERR=true
MSG="$MSG | The HDD size has to be an integer."
fi
;;
\?) echo "Unknown option: -$OPTARG" >&2; phelp; exit 1;;
:) echo "Missing option argument for -$OPTARG" >&2; phelp; exit 1;;
*) echo "Unimplimented option: -$OPTARG" >&2; phelp; exit 1;;
esac
done
if $FLAG; then
echo "You need to at least specify the name of the machine with the -n parameter."
exit 1
fi
if $ERR; then
echo $MSG
exit 1
fi
if [ -d "$NAME" ]; then
echo "Directory - ${NAME} already exists, can't recreate it."
exit
fi
mkdir ${NAME}
vmkfstools -c "${SIZE}"G -a lsilogic $NAME/$NAME.vmdk
touch $NAME/$NAME.vmx
cat << EOF > $NAME/$NAME.vmx
config.version = "8"
virtualHW.version = "7"
vmci0.present = "TRUE"
displayName = "${NAME}"
floppy0.present = "FALSE"
numvcpus = "${CPU}"
scsi0.present = "TRUE"
scsi0.sharedBus = "none"
scsi0.virtualDev = "lsilogic"
memsize = "${RAM}"
scsi0:0.present = "TRUE"
scsi0:0.fileName = "${NAME}.vmdk"
scsi0:0.deviceType = "scsi-hardDisk"
ide1:0.present = "TRUE"
ide1:0.fileName = "${ISO}"
ide1:0.deviceType = "cdrom-image"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"
pciBridge5.functions = "8"
pciBridge6.present = "TRUE"
pciBridge6.virtualDev = "pcieRootPort"
pciBridge6.functions = "8"
pciBridge7.present = "TRUE"
pciBridge7.virtualDev = "pcieRootPort"
pciBridge7.functions = "8"
ethernet0.pciSlotNumber = "32"
ethernet0.present = "TRUE"
ethernet0.virtualDev = "e1000"
ethernet0.networkName = "Inside"
ethernet0.generatedAddressOffset = "0"
guestOS = "other26xlinux-64"
EOF
MYVM=`vim-cmd solo/registervm /vmfs/volumes/datastore1/${NAME}/${NAME}.vmx`
vim-cmd vmsvc/power.on $MYVM
echo "The Virtual Machine is now setup & the VM has been started up. Your have the following configuration:"
echo "Name: ${NAME}"
echo "CPU: ${CPU}"
echo "RAM: ${RAM}"
echo "HDD-size: ${SIZE}"
if [ -n "$ISO" ]; then
echo "ISO: ${ISO}"
else
echo "No ISO added."
fi
echo "Thank you."
exit
Upvotes: 1
Views: 349
Reputation: 753455
The usage message is about as unhelpful as you can get and still make an attempt at conveying information. Without the code, I would not have known what to do. Fortunately, with shell scripts, you can see the code, though. The usage message should read something more like:
{
echo "Usage: $0 -n 'vm name' [-c cpus][-i iso-image][-r ram][-s disk]"
echo " -n 'vm name' Name of VM (required)"
echo " -c cpus Number of virtual CPUs"
echo " -i iso-image Location of an ISO image"
echo " -r ram RAM size in MB"
echo " -s disk Disk size in GB"
echo "Default values are: CPU: 2, RAM: 4096MB, HDD-SIZE: 20GB"
} >&2
Take heed: when you write a shell script, ensure that the usage information is clearly documented, either in the usage message or perhaps in comments within the script. The shell script you show is an example of how not to do it.
Upvotes: 1
Reputation: 295272
Enter them as -k value
pairs, where k
is the letter used to identify the parameter.
For instance:
./create.sh -n vmname -c 2 -i /path/to/file.iso -s 512
This sets the name to vmname
, the number of CPUs to 2, the ISO filename to /path/to/file.iso
, etc.
Upvotes: 1