From 0e6a6e540c8248e22dd7461ba7c74b8b3f6d2b8e Mon Sep 17 00:00:00 2001 From: Brielle Bruns Date: Wed, 11 Apr 2018 16:55:21 -0600 Subject: [PATCH] Update to include getopts use, add distros config --- distros | 64 +++++++++++++++ virt-install-cloud.sh | 186 +++++++++++++++++++----------------------- 2 files changed, 146 insertions(+), 104 deletions(-) create mode 100644 distros diff --git a/distros b/distros new file mode 100644 index 0000000..163d461 --- /dev/null +++ b/distros @@ -0,0 +1,64 @@ +case $distro in + trusty) IMG_USER="ubuntu" + IMG_URL="http://cloud-images.ubuntu.com/releases/14.04/release" + IMG_NAME="ubuntu-14.04-server-cloudimg-${ARCH}-disk1.img" + ;; + xenial) IMG_USER="ubuntu" + IMG_URL="http://cloud-images.ubuntu.com/releases/16.04/release" + IMG_NAME="ubuntu-16.04-server-cloudimg-${ARCH}-disk1.img" + ;; + artful) IMG_USER="ubuntu" + IMG_URL="http://cloud-images.ubuntu.com/releases/17.10/release" + IMG_NAME="ubuntu-17.10-server-cloudimg-${ARCH}-disk1.img" + ;; + bionic) IMG_USER="ubuntu" + IMG_URL="http://cloud-images.ubuntu.com/releases/18.04/release" + IMG_NAME="ubuntu-18.04-server-cloudimg-${ARCH}.img" + ;; + centos6) IMG_USER="centos" + IMG_URL="https://cloud.centos.org/centos/6/images" + if [[ $arch = "amd64" ]]; then + IMG_NAME="CentOS-6-x86_64-GenericCloud.qcow2" + else + echo "Cloud image not available!"; exit 1 + fi + ;; + centos7) IMG_USER="centos" + IMG_URL="https://cloud.centos.org/centos/7/images" + if [[ $arch = "amd64" ]]; then + IMG_NAME="CentOS-7-x86_64-GenericCloud.qcow2" + else + echo "Cloud image not available!"; exit 1 + fi + ;; + fedora27) IMG_USER="fedora" + if [[ $arch = "amd64" ]]; then + IMG_URL="https://download.fedoraproject.org/pub/fedora/linux/releases/27/CloudImages/x86_64/images/" + IMG_NAME="Fedora-Cloud-Base-27-1.6.x86_64.qcow2" + else + echo "Cloud image not available!"; exit 1 + fi + ;; + jessie) IMG_USER="debian" + if [[ $arch = "amd64" ]]; then + IMG_URL="https://cdimage.debian.org/cdimage/openstack/current-8" + IMG_NAME="debian-8-openstack-amd64.qcow2" + virt_ostype="debian" + virt_osvariant="debian8" + else + echo "Cloud image not available!"; exit 1 + fi + ;; + stretch) IMG_USER="debian" + if [[ $arch = "amd64" ]]; then + IMG_URL="https://cdimage.debian.org/cdimage/openstack/current-9" + IMG_NAME="debian-9-openstack-amd64.qcow2" + virt_ostype="debian" + virt_osvariant="debian9" + else + echo "Cloud image not available!"; exit 1 + fi + ;; + *) echo "Cloud image not available!"; exit 1 + ;; +esac \ No newline at end of file diff --git a/virt-install-cloud.sh b/virt-install-cloud.sh index bbd3f7d..5026b4c 100755 --- a/virt-install-cloud.sh +++ b/virt-install-cloud.sh @@ -1,16 +1,16 @@ #!/bin/bash +# Heavily Modified Script By: Brielle Bruns +# Date: 04/11/2018 +# URL: https://git.sosdg.org/brielle/virt-install-cloud +# Version: 1.0 # +# Originally based on: # virt-install-cloud.sh : script to start an OpenStack cloud image on kvm # version : 1.1 # # Author : Claude Durocher # License : GPLv3 # -# -# Heavily Modified By: Brielle Bruns -# Date: 04/10/2018 -# URL: https://git.sosdg.org/brielle/virt-install-cloud -# # ref. http://mojodna.net/2014/05/14/kvm-libvirt-and-ubuntu-14-04.html # # requires the following packages on Ubuntu host: @@ -19,33 +19,76 @@ # wget qemu-kvm libvirt virt-install bridge-utils genisoimage|xorriso # -# Example CLI -# virt-install-cloud.sh hostname domain disk-size ramsize - # check if the script is run as root user if [[ $USER != "root" ]]; then echo "This script must be run as root!" && exit 1 fi -# image selection : trusty, precise, centos7, fedora26, ... -IMG="stretch" -# architecture : amd64 or i386 -ARCH="amd64" +while getopts "cr:s:n:d:iob" opt; do + case $opt in + c) cpucount=("$OPTARG");; + r) ram=("$OPTARG");; + s) storage=("$OPTARG");; + n) hostname=("$OPTARG");; + d) domain=("$OPTARG");; + i) distro=("$OPTARG");; + o) ostype=("$OPTARG");; + b) bridge=("$OPTARG");; + h) usage;; + esac +done + +usage() { + echo "${0} Help" + echo "-h show this help" + echo "-n hostname *" + echo "-d domainame *" + echo "-s disk size (num + count size - M=Megabytes G=Gigabytes) *" + echo "-r ram size (in kilobytes) *" + echo "-c number of vcpus" + echo "-b bridge to attach to *" + echo "-i distribution to use (see script for supported options) - default is stretch" + echo "-o OS type and variant (default: generic:generic - also set by distro option when available)" +} + +if [[ -z $ram || -z $storage || -z $hostname || -z $domain || -z $bridge ]]; then + echo "Error: Incorrect command usage, must provide all * flags." + usage + exit 1 +fi + +if [[ -z $distro ]]; then + distro="stretch" +fi + +if [[ -z $cpucount ]]; then + cpucount="2" +fi + +if [[ ! -z $ostype ]]; then + OIFS=${IFS} + IFS=: + read -ra virt_os <<< "$ostype" + virt_ostype=${virt_os[0]} + virt_osvariant=${virt_os[1]} + IFS=${OIFS} +else + virt_ostype="generic" + virt_osvariant="generic" +fi + +arch="amd64" + +source distros -OS_TYPE="debian" -OS_VARIANT="debian9" # kvm defaults pool paths DEF_POOL=images DEF_POOL_PATH=/data/images # vm prefs : specify vm preferences for your guest BACKUP_ISO_FILES=no # yes or no -GUEST_NAME=${1} -DOMAIN=${2} -VROOTDISKSIZE=${3} -VCPUS=2 -VMEM=${4} -NETWORK="bridge=vlan2-bridge,model=virtio" + +net_interface="bridge=${bridge},model=virtio" # guest image format: qcow2 or raw FORMAT=raw # convert image format : yes or no @@ -54,69 +97,9 @@ CONVERT=yes POOL=images POOL_PATH=/data/images -sed -e "s/%GUEST_NAME%/${GUEST_NAME}/" meta-data > output/meta-data -sed -e "s/%FQDN%/${GUEST_NAME}.${DOMAIN}/" user-data > output/user-data +sed -e "s/%GUEST_NAME%/${hostname}/" meta-data > output/meta-data +sed -e "s/%FQDN%/${hostname}.${domain}/" user-data > output/user-data -case $IMG in - trusty) IMG_USER="ubuntu" - IMG_URL="http://cloud-images.ubuntu.com/releases/14.04/release" - IMG_NAME="ubuntu-14.04-server-cloudimg-${ARCH}-disk1.img" - ;; - xenial) IMG_USER="ubuntu" - IMG_URL="http://cloud-images.ubuntu.com/releases/16.04/release" - IMG_NAME="ubuntu-16.04-server-cloudimg-${ARCH}-disk1.img" - ;; - artful) IMG_USER="ubuntu" - IMG_URL="http://cloud-images.ubuntu.com/releases/17.10/release" - IMG_NAME="ubuntu-17.10-server-cloudimg-${ARCH}-disk1.img" - ;; - bionic) IMG_USER="ubuntu" - IMG_URL="http://cloud-images.ubuntu.com/releases/18.04/release" - IMG_NAME="ubuntu-18.04-server-cloudimg-${ARCH}.img" - ;; - centos6) IMG_USER="centos" - IMG_URL="https://cloud.centos.org/centos/6/images" - if [[ $ARCH = "amd64" ]]; then - IMG_NAME="CentOS-6-x86_64-GenericCloud.qcow2" - else - echo "Cloud image not available!"; exit 1 - fi - ;; - centos7) IMG_USER="centos" - IMG_URL="https://cloud.centos.org/centos/7/images" - if [[ $ARCH = "amd64" ]]; then - IMG_NAME="CentOS-7-x86_64-GenericCloud.qcow2" - else - echo "Cloud image not available!"; exit 1 - fi - ;; - fedora27) IMG_USER="fedora" - if [[ $ARCH = "amd64" ]]; then - IMG_URL="https://download.fedoraproject.org/pub/fedora/linux/releases/27/CloudImages/x86_64/images/" - IMG_NAME="Fedora-Cloud-Base-27-1.6.x86_64.qcow2" - else - echo "Cloud image not available!"; exit 1 - fi - ;; - jessie) IMG_USER="debian" - if [[ $ARCH = "amd64" ]]; then - IMG_URL="https://cdimage.debian.org/cdimage/openstack/current-8" - IMG_NAME="debian-8-openstack-amd64.qcow2" - else - echo "Cloud image not available!"; exit 1 - fi - ;; - stretch) IMG_USER="debian" - if [[ $ARCH = "amd64" ]]; then - IMG_URL="https://cdimage.debian.org/cdimage/openstack/current-9" - IMG_NAME="debian-9-openstack-amd64.qcow2" - else - echo "Cloud image not available!"; exit 1 - fi - ;; - *) echo "Cloud image not available!"; exit 1 - ;; -esac if [[ ! -f images/${IMG_NAME} ]]; then echo "Downloading image ${IMG_NAME}..." @@ -142,12 +125,12 @@ xorriso -in_charset utf8 -outdev configuration.iso -volid cidata -joliet on -roc # keep a backup of the files for future reference if [[ "${BACKUP_ISO_FILE}" == "yes" ]]; then - cp user-data ${GUEST_NAME}.user-data - cp meta-data ${GUEST_NAME}.meta-data - chmod 640 ${GUEST_NAME}.user-data ${GUEST_NAME}.meta-data + cp user-data ${hostname}.user-data + cp meta-data ${hostname}.meta-data + chmod 640 ${hostname}.user-data ${hostname}.meta-data fi # copy ISO into libvirt's directory -cp configuration.iso ${POOL_PATH}/${GUEST_NAME}.configuration.iso +cp configuration.iso ${POOL_PATH}/${hostname}.${domain}.configuration.iso virsh pool-refresh ${POOL} # copy image to libvirt's pool @@ -157,38 +140,33 @@ if [[ ! -f ${POOL_PATH}/${IMG_NAME} ]]; then fi # clone cloud image -virsh vol-clone --pool ${POOL} ${IMG_NAME} ${GUEST_NAME}.root.img -virsh vol-resize --pool ${POOL} ${GUEST_NAME}.root.img ${VROOTDISKSIZE} +virsh vol-clone --pool ${POOL} ${IMG_NAME} ${hostname}.${domain}.root.img +virsh vol-resize --pool ${POOL} ${hostname}.${domain}.root.img ${storage} # convert image format if [[ "${CONVERT}" == "yes" ]]; then echo "Converting image to format ${FORMAT}..." - qemu-img convert -O ${FORMAT} ${POOL_PATH}/${GUEST_NAME}.root.img ${POOL_PATH}/${GUEST_NAME}.root.img.${FORMAT} - rm ${POOL_PATH}/${GUEST_NAME}.root.img - mv ${POOL_PATH}/${GUEST_NAME}.root.img.${FORMAT} ${POOL_PATH}/${GUEST_NAME}.root.img + qemu-img convert -O ${FORMAT} ${POOL_PATH}/${hostname}.${domain}.root.img ${POOL_PATH}/${hostname}.${domain}.root.img.${FORMAT} + rm ${POOL_PATH}/${hostname}.${domain}.root.img + mv ${POOL_PATH}/${hostname}.${domain}.root.img.${FORMAT} ${POOL_PATH}/${hostname}.${domain}.root.img virsh pool-refresh ${POOL} fi -echo "Creating guest ${GUEST_NAME}..." +echo "Creating guest ${hostname}.${domain}..." virt-install \ - --name ${GUEST_NAME} \ + --name ${hostname}.${domain} \ --cpu host \ - --ram ${VMEM} \ - --vcpus=${VCPUS} \ + --ram ${ram} \ + --vcpus=${cpucount} \ --noautoconsole \ --memballoon virtio \ - --network ${NETWORK} \ + --network ${net_interface} \ --boot hd \ - --disk vol=${POOL}/${GUEST_NAME}.root.img,format=${FORMAT},bus=virtio,cache=none \ - --disk vol=${POOL}/${GUEST_NAME}.configuration.iso,bus=virtio \ + --disk vol=${POOL}/${hostname}.${domain}.root.img,format=${FORMAT},bus=virtio,cache=none \ + --disk vol=${POOL}/${hostname}.${domain}.configuration.iso,bus=virtio \ --console pty,target_type=serial \ - --os-type=${OS_TYPE} --os-variant=${OS_VARIANT} + --os-type=${virt_ostype} --os-variant=${virt_osvariant} -# display result -echo -echo "List of running VMs :" -echo -virsh list # cleanup rm configuration.iso output/meta-data output/user-data