#!/bin/bash ## author : Dryusdan ## date : 30/09/2019 ## description : A vm deployment ## usage : ./deployvm VMName resize ## Import require config ############################## source utils/config source utils/color source utils/logger ####################################################### if [ $# -eq 0 ] then fatal "No arguments supplied. Usage : ./${SCRIPTNAME} VMName resize " fi if [ -z "${1}" ]; then fatal "VMNAME is not defined. Usage : ./${SCRIPTNAME} VMName resize" else VMNAME="${1}" fi if [ -z "${2}" ]; then fatal "Resize not defined. Usage : ./${SCRITNAME} VMName resize" else RESIZE="${2}" fi info "Get token for Proxmox" PROXMOX_CREDENTIAL=$(curl -s --insecure -d "username=${PROXMOX_USER}@pam&password=${PROXMOX_PASSWORD}" "${PROXMOX_HOST}/api2/json/access/ticket") PROXMOX_TOKEN=$(echo ${PROXMOX_CREDENTIAL} | jq --raw-output '.data.ticket') PROXMOX_CSRF=$(echo ${PROXMOX_CREDENTIAL} | jq --raw-output '.data.CSRFPreventionToken') info "Search vm with name ${VMNAME}" for node in $(curl -s --insecure -b "PVEAuthCookie=${PROXMOX_TOKEN}" "${PROXMOX_HOST}/api2/json/nodes" | jq --raw-output ".data[] | @base64") do nodename=$(echo ${node} | base64 --decode | jq --raw-output ".node") VMID=$(curl -s --insecure -b "PVEAuthCookie=${PROXMOX_TOKEN}" "${PROXMOX_HOST}/api2/json/nodes/${nodename}/qemu" | jq --raw-output '.data[] | select(.name=="'${VMNAME}'") | .vmid') if [ "${VMID}" != "" ] then info "Found vm ${VMNAME} with ID ${VMID} on ${nodename}" break fi done info "Get actual disk size" ACTUALDISKSIZE=$(curl -s --insecure -b "PVEAuthCookie=${PROXMOX_TOKEN}" "${PROXMOX_HOST}/api2/json/nodes/${nodename}/qemu" | jq --raw-output '.data[] | select(.name=="'${VMNAME}'") | .maxdisk') NEWDISKSIZE=$(echo "${ACTUALDISKSIZE} + ${RESIZE}*1024*1024*1024" | bc ) info "Resizing ${VMNAME} with ${RESIZE}GB" curl -s --insecure -H "Content-Type: application/x-www-form-urlencoded" -H "CSRFPreventionToken: ${PROXMOX_CSRF}" -b "PVEAuthCookie=${PROXMOX_TOKEN}" -X PUT --data "size=${NEWDISKSIZE}&disk=scsi0" "${PROXMOX_HOST}/api2/json/nodes/${nodename}/qemu/${VMID}/resize" &> /dev/null info "Wait 30 seconds for hypervisor synchro" sleep 30 info "Resize /dev/sda2" ssh root@${VMNAME} parted /dev/sda resizepart 2 100% &> /dev/null info "Resize /dev/sda5" ssh root@${VMNAME} parted /dev/sda resizepart 5 100% &> /dev/null info "Resize LVM partition" ssh root@${VMNAME} pvresize /dev/sda5 &> /dev/null info "Get partition" VGNAME=$(ssh root@${VMNAME} ls /dev/mapper | grep vg) &> /dev/null info "Extend partition" ssh root@${VMNAME} lvresize --extents +100%FREE /dev/mapper/${VGNAME} &> /dev/null info "Resize FS" ssh root@${VMNAME} resize2fs /dev/mapper/${VGNAME} &> /dev/null info "Update Netbox" clusterid=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/dcim/devices/?name=${nodename}" | jq --raw-output '.results[0].cluster.id') deviceid=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/?name=${VMNAME}" | jq --raw-output ".results[0].id") GBSIZE=$(echo ${ACTUALDISKSIZE}/1024/1024/1024 + ${RESIZE} | bc) curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${VMNAME}'", "cluster": '${clusterid}', "disk": '${GBSIZE}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${deviceid}/" &> /dev/null info "Update finish" info "End" info "Ending"