Created
November 24, 2017 20:09
-
-
Save dragolabs/48463242a03f4b8b1d068bf1d7f1cacc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Taken from http://rustyautopsy.github.io/rabbitholes/2014/10/21/vmcreate/ | |
# Original author: Travis Dolan | |
DEFAULT_DISK_SIZE=32 | |
DEFAULT_MEMORY=2048 | |
DEFAULT_SOCKETS=1 | |
DEFAULT_CORES=2 | |
DEFAULT_ISO='ubuntu-14.04-server-amd64.iso' | |
DEFAULT_VMBR='vmbr0' | |
# download jq parser | |
if [[ ! -f /usr/bin/jq ]]; then | |
/usr/bin/wget http://stedolan.github.io/jq/download/linux64/jq -P /usr/bin | |
/bin/chmod u+x /usr/bin/jq | |
fi | |
usage() { | |
echo -e "Pass required options to vm_create \n-n {nodename}\n-d {disk size - in GBs, ONLY numeric value}\n-h {hostname}\n-b {vmbr[0-9]}\n-m {memory - in MBs, ONLY numeric value)\n-s {sockets}\n-c {cores}" | |
exit 1 | |
} | |
if (($# == 0)); then | |
usage | |
fi | |
while getopts ":n:d:b:h:m:s:c:" opt; do | |
case $opt in | |
n) | |
NODE=$OPTARG | |
#echo "-n was triggered, Parameter: $OPTARG" >&2 | |
;; | |
d) | |
SIZE=$OPTARG | |
#echo "-s was triggered, Parameter: $OPTARG" >&2 | |
;; | |
b) | |
VMBR=$OPTARG | |
#echo "-b was triggered, Parameter: $OPTARG" >&2 | |
;; | |
h) | |
HOSTNAME=$OPTARG | |
#echo "-s was triggered, Parameter: $OPTARG" >&2 | |
;; | |
m) | |
MEMORY=$OPTARG | |
#echo "-s was triggered, Parameter: $OPTARG" >&2 | |
;; | |
s) | |
SOCKETS=$OPTARG | |
#echo "-s was triggered, Parameter: $OPTARG" >&2 | |
;; | |
c) | |
CORES=$OPTARG | |
#echo "-s was triggered, Parameter: $OPTARG" >&2 | |
;; | |
\?) | |
echo "Invalid option: -$OPTARG" >&2 | |
usage | |
exit 1 | |
;; | |
:) | |
echo "Option -$OPTARG requires an argument." >&2 | |
exit 1 | |
;; | |
esac | |
done | |
create_base_vm(){ | |
# get next available vmid | |
echo "Getting next available vm id..." | |
VMID=`/usr/bin/pvesh get /cluster/nextid | tr -d '"'` | |
# create storage | |
echo "Creating vm storage object..." | |
/usr/bin/pvesh create /nodes/$NODE/storage/local/content \ | |
-filename vm-$VMID-disk-0.qcow2 \ | |
-format qcow2 \ | |
-size $DEFAULT_DISK_SIZE"G" \ | |
-vmid $VMID | |
# create vm | |
echo "Creating VM..." | |
pvesh create /nodes/$NODE/qemu \ | |
-name 'base.example.com' \ | |
-vmid $VMID \ | |
-memory $DEFAULT_MEMORY \ | |
-sockets $DEFAULT_SOCKETS \ | |
-cores $DEFAULT_CORES \ | |
-net0 virtio,bridge=$DEFAULT_VMBR \ | |
-virtio0 local:$VMID/vm-$VMID-disk-0.qcow2 \ | |
-ide1 isostore:iso/$DEFAULT_ISO,media=cdrom | |
} | |
check_for_base_vm(){ | |
/usr/bin/pvesh get /nodes/$NODE/qemu | jq '.[] | {name: .name, vmid: .vmid} | tostring' | grep 'base.example.com' | |
} | |
clone_base_vm(){ | |
# get base vmid | |
VMID=`/usr/bin/pvesh get /nodes/$NODE/qemu | /usr/bin/jq '.[] | {name: .name, vmid: .vmid} | tostring' | grep 'base.example.com' | grep -o '[0-9]*'` | |
# get next vmid | |
NEXTID=`/usr/bin/pvesh get /cluster/nextid | grep -o '[0-9]*'` | |
# clone base vm | |
/usr/bin/pvesh create /nodes/$NODE/qemu/$VMID/clone -newid $NEXTID -name $HOSTNAME | |
} | |
configure_cloned_vm(){ | |
# tweak needed settings | |
if [[ $SIZE -gt $DEFAULT_DISK_SIZE ]]; then | |
echo -e "\nUpdating disk size..." | |
/usr/bin/pvesh set /nodes/$NODE/qemu/$NEXTID/resize -disk virtio0 -size $SIZE"G" | |
fi | |
if [[ $MEMORY -gt $DEFAULT_MEMORY ]]; then | |
echo -e "\nUpdating memory..." | |
/usr/bin/pvesh create /nodes/$NODE/qemu/$NEXTID/config -memory $MEMORY | |
fi | |
if [[ $VMBR != $DEFAULT_VMBR ]]; then | |
echo -e "\nUpdating network bridge..." | |
/usr/bin/pvesh create /nodes/$NODE/qemu/$NEXTID/config -net0 $VMBR | |
fi | |
if [[ $SOCKETS -gt $DEFAULT_SOCKETS ]]; then | |
echo -e "\nUpdating socket count..." | |
/usr/bin/pvesh create /nodes/$NODE/qemu/$NEXTID/config -sockets $SOCKETS | |
fi | |
if [[ $CORES -gt $DEFAULT_CORES ]]; then | |
echo -e "\nUpdating core count..." | |
/usr/bin/pvesh create /nodes/$NODE/qemu/$NEXTID/config -cores $CORES | |
fi | |
} | |
if check_for_base_vm; then | |
clone_base_vm | |
configure_cloned_vm | |
exit 0 | |
else | |
create_base_vm | |
echo -e "\n***Now connect to base.example.com and configure as needed. Then run this script again.***" | |
exit 1 | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment