diff --git a/roles/lmn_vm/files/create-clone.sh b/roles/lmn_vm/files/create-clone.sh index 73ecfd2..d0629d0 100755 --- a/roles/lmn_vm/files/create-clone.sh +++ b/roles/lmn_vm/files/create-clone.sh @@ -3,9 +3,8 @@ set -eu -# if less than one arguments supplied, display usage -if [ "$#" -ne 1 ] -then +# if less or more than one arguments supplied, display usage +if [[ $# -ne 1 ]]; then echo "This script takes as input the name of the VM to clone" echo "Usage: $0 vm_name" exit 1 @@ -16,7 +15,7 @@ cd /var/lib/libvirt/images VM_NAME=$1 -if [ ! -f "xml/${VM_NAME}.xml" -a -f "${VM_NAME}.gcow2" ]; then +if [[ ! -f "xml/${VM_NAME}.xml" ]] || [[ ! -f "${VM_NAME}.gcow2" ]]; then echo "xml or qcow2 File does not exists." exit 1 fi diff --git a/roles/lmn_vm/files/create-vm.sh b/roles/lmn_vm/files/create-vm.sh index be187e2..55cd835 100755 --- a/roles/lmn_vm/files/create-vm.sh +++ b/roles/lmn_vm/files/create-vm.sh @@ -2,10 +2,8 @@ # create 1st level-Clones set -eu - # if less than two arguments supplied, display usage -if [ $# -ne 2 ] -then +if [[ $# -ne 2 ]]; then echo "This script takes as input the name of the VM to clone" echo "Usage: $0 vm_name_orig vm_name_clone" exit 1 @@ -14,21 +12,24 @@ fi VM_NAME=$1 VM_CLONE=$2 -if [ ! -f "xml/$VM_NAME.xml" -a -f "$VM_NAME.gcow2" ]; then +# change to image-directory +cd /var/lib/libvirt/images + +if [[ ! -f "xml/${VM_NAME}.xml" ]] || [[ ! -f "${VM_NAME}.gcow2" ]]; then echo "xml or qcow2 File does not exists." exit 1 fi -qemu-img create -f qcow2 -F qcow2 -b $VM_NAME.qcow2 $VM_NAME-$VM_CLONE.qcow2 -chmod a-w $VM_NAME-$VM_CLONE.qcow2 +qemu-img create -f qcow2 -F qcow2 -b "${VM_NAME}.qcow2" "${VM_NAME}-${VM_CLONE}.qcow2" +chmod a-w "${VM_NAME}-${VM_CLONE}.qcow2" -# virsh --connect=qemu:///system dumpxml $VM_NAME > xml/$VM_NAME_$VM_CLONE.xml -cp xml/$VM_NAME.xml xml/$VM_NAME-$VM_CLONE.xml +# virsh --connect=qemu:///system dumpxml "${VM_NAME}" > "xml/${VM_NAME}-${VM_CLONE}.xml" +cp "xml/${VM_NAME}.xml" "xml/${VM_NAME}-${VM_CLONE}.xml" # hardware addresses need to be removed, libvirt will assign # new addresses automatically -sed -i /uuid/d xml/$VM_NAME-$VM_CLONE.xml -sed -i '/mac address/d' xml/$VM_NAME-$VM_CLONE.xml +sed -i /uuid/d "xml/${VM_NAME}-${VM_CLONE}.xml" +sed -i '/mac address/d' "xml/${VM_NAME}-${VM_CLONE}.xml" # and actually rename the vm: (this also updates the storage path) -sed -i s/$VM_NAME/$VM_NAME-$VM_CLONE/ xml/$VM_NAME-$VM_CLONE.xml +sed -i "s/${VM_NAME}/${VM_NAME}-${VM_CLONE}/" "xml/${VM_NAME}-${VM_CLONE}.xml" diff --git a/roles/lmn_vm/files/lmn-create-vm-sudo b/roles/lmn_vm/files/lmn-create-vm-sudo new file mode 100644 index 0000000..b823c6f --- /dev/null +++ b/roles/lmn_vm/files/lmn-create-vm-sudo @@ -0,0 +1 @@ +%role-teacher ALL=(root) NOPASSWD: /usr/local/bin/create-vm.sh diff --git a/roles/lmn_vm/files/lmn-rebase-vm-sudo b/roles/lmn_vm/files/lmn-rebase-vm-sudo new file mode 100644 index 0000000..28c1c43 --- /dev/null +++ b/roles/lmn_vm/files/lmn-rebase-vm-sudo @@ -0,0 +1 @@ +%role-teacher ALL=(root) NOPASSWD: /usr/local/bin/rebase-vm.sh diff --git a/roles/lmn_vm/files/rebase-vm.sh b/roles/lmn_vm/files/rebase-vm.sh index 184f615..5accc16 100755 --- a/roles/lmn_vm/files/rebase-vm.sh +++ b/roles/lmn_vm/files/rebase-vm.sh @@ -1,44 +1,79 @@ #!/usr/bin/bash - # Rebase one level down - set -eu -# if less than one arguments supplied, display usage -if [ $# -ne 1 ] -then - echo "This script takes as input the name of the VM to rebase one level down" - echo "Usage: $0 vm_name" +show_help() { + cat << EOF +Usage: $(basename "$0") [-n newname] vmname" +This script takes as input the name of the VM to rebase one level down + -n new name of the rebased image +EOF +} + +while getopts ':n:' OPTION; do + case "$OPTION" in + n) + NEWNAME=$OPTARG + ;; + ?) + show_help + exit 1 + ;; + esac +done + +shift "$((OPTIND -1))" + +# if less or more than one arguments supplied, display usage +if [[ $# -ne 1 ]]; then + show_help exit 1 fi -VM_NAME=$1 +# change to Images directory +cd /var/lib/libvirt/images -if [ ! -f $VM_NAME.qcow2 ] -then - echo "File not found $VM_NAME.qcow2" +VM_NAME="$1" + +# check if VM-Diskimage exists +if [[ ! -f "${VM_NAME}.qcow2" ]]; then + echo "File not found ${VM_NAME}.qcow2" exit 1 fi -shopt -s lastpipe -qemu-img info --backing-chain $VM_NAME.qcow2 | grep image | wc -l | read NUMBASES -qemu-img info --backing-chain $VM_NAME.qcow2 | grep image | head -n 3 | tail -n 1 | cut -d' ' -f2 | read NEWBASE -qemu-img info --backing-chain $VM_NAME.qcow2 | grep image | head -n 2 | tail -n 1 | cut -d' ' -f2 | read CURRENTBASE +# check if new VM-Diskimage exists +if [[ -v NEWNAME ]] && [[ -f "${NEWNAME}.qcow2" ]]; then + echo "New Base already exists: ${NEWNAME}.qcow2" + exit 1 +fi -if [ ! $NUMBASES -ge 3 ] -then +NUMBASES=$(qemu-img info --backing-chain "${VM_NAME}.qcow2" | grep -c image) +NEWBASE=$(qemu-img info --backing-chain "${VM_NAME}.qcow2" | grep image | head -n 3 | tail -n 1 | cut -d' ' -f2) +CURRENTBASE=$(qemu-img info --backing-chain "${VM_NAME}.qcow2" | grep image | head -n 2 | tail -n 1 | cut -d' ' -f2) + +if [[ ! "${NUMBASES}" -ge 3 ]]; then echo "Image must have at least 2 backing-files" exit 1 fi -if [ ! -f $NEWBASE -a -f $CURRENTBASE ] -then - echo "Backingfiles not found $CURRENTBASE, $NEWBASE" +# check if base Diskimage exists +if [[ ! -f "${NEWBASE}" ]] || [[ ! -f "${CURRENTBASE}" ]]; then + echo "Backingfiles not found ${CURRENTBASE}, ${NEWBASE}" exit 1 fi -qemu-img rebase -f qcow2 -b $NEWBASE -F qcow2 $VM_NAME.qcow2 -rm $CURRENTBASE -mv $VM_NAME.qcow2 $CURRENTBASE -chmod a-w $CURRENTBASE -qemu-img create -f qcow2 -F qcow2 -b $CURRENTBASE $VM_NAME.qcow2 +# rebasing disk image +qemu-img rebase -f qcow2 -b "${NEWBASE}" -F qcow2 "${VM_NAME}.qcow2" +if [[ -v NEWNAME ]]; then + # copy and adapt machine definition file + CURRENTNAME="${CURRENTBASE/.qcow2/}" + cp "xml/${CURRENTNAME}.xml" "xml/${NEWNAME}.xml" + sed -i "s/${CURRENTNAME}/${NEWNAME}/" "xml/${NEWNAME}.xml" + NEWNAME="${NEWNAME}.qcow2" +else + rm "${CURRENTBASE}" + NEWNAME="${CURRENTBASE}" +fi + +mv "${VM_NAME}.qcow2" "${NEWNAME}" +chmod a-w "${NEWNAME}" diff --git a/roles/lmn_vm/files/sync-vm.sh b/roles/lmn_vm/files/sync-vm.sh old mode 100644 new mode 100755 diff --git a/roles/lmn_vm/tasks/main.yml b/roles/lmn_vm/tasks/main.yml index cdce481..dc659eb 100644 --- a/roles/lmn_vm/tasks/main.yml +++ b/roles/lmn_vm/tasks/main.yml @@ -61,6 +61,8 @@ - lmn-mounthome-sudo - lmn-create-clone-sudo - lmn-sync-vm-sudo + - lmn-create-vm-sudo + - lmn-rebase-vm-sudo - name: deploy mount home script copy: