forked from evolix/ansible-roles
kvm-host: add-vm: shellcheck (quotes, braces…)
This commit is contained in:
parent
edfcbbad0a
commit
9d0bfec87e
|
@ -10,9 +10,13 @@
|
||||||
# Bash strict mode
|
# Bash strict mode
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
isDryRun() {
|
||||||
|
test "${doDryRun}" = "true"
|
||||||
|
}
|
||||||
|
|
||||||
dryRun() {
|
dryRun() {
|
||||||
|
|
||||||
if ($doDryRun); then
|
if isDryRun; then
|
||||||
echo -e "\e[34mDoing:" "$*" "\e[39m"
|
echo -e "\e[34mDoing:" "$*" "\e[39m"
|
||||||
else
|
else
|
||||||
echo -e "\e[34mDoing:" "$*" "\e[39m"
|
echo -e "\e[34mDoing:" "$*" "\e[39m"
|
||||||
|
@ -29,6 +33,7 @@ warn() {
|
||||||
echo -ne "\e[33m${1}\e[39m\n"
|
echo -ne "\e[33m${1}\e[39m\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# shellcheck disable=SC1091
|
||||||
[ -f "/etc/evolinux/add-vm.cnf" ] && . /etc/evolinux/add-vm.cnf
|
[ -f "/etc/evolinux/add-vm.cnf" ] && . /etc/evolinux/add-vm.cnf
|
||||||
masterKVMIP="${masterKVMIP:-127.0.0.1}"
|
masterKVMIP="${masterKVMIP:-127.0.0.1}"
|
||||||
slaveKVMIP="${slaveKVMIP:-}"
|
slaveKVMIP="${slaveKVMIP:-}"
|
||||||
|
@ -39,89 +44,102 @@ doDryRun=${doDryRun:-false}
|
||||||
isoImagePath="${isoImagePath:-}"
|
isoImagePath="${isoImagePath:-}"
|
||||||
debianVersion="${debianAuto:-stable}"
|
debianVersion="${debianAuto:-stable}"
|
||||||
preseedURL="${preseedURL:-}"
|
preseedURL="${preseedURL:-}"
|
||||||
|
defaultVCPU="${defaultVCPU:-"2"}"
|
||||||
|
defaultRAM="${defaultRAM:-"4G"}"
|
||||||
|
defaultRootSize="${defaultRootSize:-"20G"}"
|
||||||
|
defaultHomeSize="${defaultHomeSize:-"40G"}"
|
||||||
|
|
||||||
DIALOGOUT=$(mktemp --tmpdir=/tmp addvm.XXX)
|
DIALOGOUT=$(mktemp --tmpdir=/tmp addvm.XXX)
|
||||||
export DIALOGOUT
|
export DIALOGOUT
|
||||||
# TODO: How to replace _ with a space??
|
# TODO: How to replace _ with a space??
|
||||||
DIALOG="$(which dialog) --backtitle Add-VM_Press_F1_for_help"
|
DIALOG="$(command -v dialog) --backtitle Add-VM_Press_F1_for_help"
|
||||||
export DIALOG
|
export DIALOG
|
||||||
DIALOGRC=.dialogrc
|
DIALOGRC=.dialogrc
|
||||||
export DIALOGRC
|
export DIALOGRC
|
||||||
HELPFILE=$(mktemp --tmpdir=/tmp addvm.XXX)
|
HELPFILE=$(mktemp --tmpdir=/tmp addvm.XXX)
|
||||||
export HELPFILE
|
export HELPFILE
|
||||||
tmpResFile=$(mktemp --tmpdir=/tmp addvm.XXX)
|
tmpResFile=$(mktemp --tmpdir=/tmp addvm.XXX)
|
||||||
xmlVM=$(mktemp --tmpdir=/tmp addvm.XXX)
|
|
||||||
masterKVM="$(hostname -s)"
|
masterKVM="$(hostname -s)"
|
||||||
slaveKVM="$(ssh $slaveKVMIP hostname -s)"
|
slaveKVM="$(ssh "${slaveKVMIP}" hostname -s)"
|
||||||
|
|
||||||
# Exit & Cleanup function.
|
# Exit & Cleanup function.
|
||||||
clean() {
|
clean() {
|
||||||
|
|
||||||
echo -e "\nBye! Cleaning..."
|
echo -e "\nBye! Cleaning..."
|
||||||
[ -f $DIALOGOUT ] && rm $DIALOGOUT
|
rm -f "${DIALOGOUT}"
|
||||||
[ -f $HELPFILE ] && rm $HELPFILE
|
rm -f "${HELPFILE}"
|
||||||
# [ -f $tmpResFile ] && rm $tmpResFile
|
|
||||||
# [ -f $xmlVM ] && rm $xmlVM
|
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
trap clean EXIT SIGINT
|
trap clean EXIT SIGINT
|
||||||
|
|
||||||
$DIALOG --hfile $HELPFILE --title "KVM Config" --form "Set the right config. "\
|
${DIALOG} \
|
||||||
"If you do not want a type of disk, type none." 0 0 0 \
|
--hfile "${HELPFILE}" \
|
||||||
"vCPU" 1 1 "2" 1 10 20 0 \
|
--title "KVM Config" \
|
||||||
"memory" 2 1 "4G" 2 10 20 0 \
|
--form "Set the right config. If you do not want a type of disk, type none." 0 0 0 \
|
||||||
"volroot" 3 1 "${disks[0]}-20G" 3 10 20 0 \
|
"vCPU" 1 1 "${defaultVCPU}" 1 10 20 0 \
|
||||||
"volhome" 4 1 "${disks[1]}-40G" 4 10 20 0 \
|
"memory" 2 1 "${defaultRAM}" 2 10 20 0 \
|
||||||
|
"volRoot" 3 1 "${disks[0]}-${defaultRootSize}" 3 10 20 0 \
|
||||||
|
"volHome" 4 1 "${disks[1]}-${defaultHomeSize}" 4 10 20 0 \
|
||||||
"vmName" 5 1 "" 5 10 20 0 \
|
"vmName" 5 1 "" 5 10 20 0 \
|
||||||
2>$DIALOGOUT
|
2> "${DIALOGOUT}"
|
||||||
vCPU=$(sed 1'q;d' $DIALOGOUT)
|
|
||||||
memory=$(sed 2'q;d' $DIALOGOUT|tr -d 'G')
|
|
||||||
memory=$(($memory * 1024))
|
|
||||||
volroot=$(sed 3'q;d' $DIALOGOUT)
|
|
||||||
volhome=$(sed 4'q;d' $DIALOGOUT)
|
|
||||||
vmName=$(sed 5'q;d' $DIALOGOUT)
|
|
||||||
|
|
||||||
[ -z "$vmName" ] && critical "You need a VM Name!!"
|
vCPU=$(sed 1'q;d' "${DIALOGOUT}")
|
||||||
|
memory=$(sed 2'q;d' "${DIALOGOUT}" | tr -d 'G')
|
||||||
|
memory=$((memory * 1024 ))
|
||||||
|
volRoot=$(sed 3'q;d' "${DIALOGOUT}")
|
||||||
|
volHome=$(sed 4'q;d' "${DIALOGOUT}")
|
||||||
|
vmName=$(sed 5'q;d' "${DIALOGOUT}")
|
||||||
|
|
||||||
$DIALOG --title "Continue?" --clear "$@" \
|
if [ -z "${vmName}" ]; then
|
||||||
--yesno "Will create a VM named $vmName on $masterKVM with $vCPU vCPU, "\
|
critical "You need a VM Name!!"
|
||||||
"$memory memory, $volroot for / (and /usr, ...) and $volhome for /home." 10 80
|
fi
|
||||||
if [[ $? -ne 0 ]]; then
|
|
||||||
|
${DIALOG} \
|
||||||
|
--title "Continue?" \
|
||||||
|
--clear "$@" \
|
||||||
|
--yesno "Will create a VM named ${vmName} on ${masterKVM} with ${vCPU} vCPU, ${memory} memory, ${volRoot} for / (and /usr, ...) and ${volHome} for /home." 10 80
|
||||||
|
dialog_rc=$?
|
||||||
|
|
||||||
|
if [[ ${dialog_rc} -ne 0 ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [[ "$volroot" =~ ([^-]+)-([0-9]+G) ]]; then
|
if ! [[ "${volRoot}" =~ ([^-]+)-([0-9]+G) ]]; then
|
||||||
critical "No volume for root device (/dev/vda)?!!"
|
critical "No volume for root device (/dev/vda)?!!"
|
||||||
else
|
else
|
||||||
volrootDisk="${BASH_REMATCH[1]}"
|
volRootDisk="${BASH_REMATCH[1]}"
|
||||||
volrootSize="${BASH_REMATCH[2]}"
|
volRootSize="${BASH_REMATCH[2]}"
|
||||||
[[ " ${disks[*]} " == *"$volrootDisk"* ]] || critical "Unknow disk $volrootDisk !"
|
if [[ " ${disks[*]} " != *"${volRootDisk}"* ]]; then
|
||||||
dryRun lvcreate -L$volrootSize -n${vmName}_root $volrootDisk
|
critical "Unknow disk ${volRootDisk} !"
|
||||||
dryRun ssh $slaveKVMIP lvcreate -L$volrootSize -n${vmName}_root $volrootDisk
|
fi
|
||||||
|
dryRun lvcreate -L"${volRootSize}" -n"${vmName}_root" "${volRootDisk}"
|
||||||
|
dryRun ssh "${slaveKVMIP}" "lvcreate -L$volRootSize -n${vmName}_root ${volRootDisk}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [[ "$volhome" =~ ([^-]+)-([0-9]+G) ]]; then
|
if ! [[ "${volHome}" =~ ([^-]+)-([0-9]+G) ]]; then
|
||||||
warn "No volume for home device (/dev/vdb)... Okay, not doing it!"
|
warn "No volume for home device (/dev/vdb)... Okay, not doing it!"
|
||||||
volhomeDisk="none"
|
volHomeDisk="none"
|
||||||
else
|
else
|
||||||
volhomeDisk="${BASH_REMATCH[1]}"
|
volHomeDisk="${BASH_REMATCH[1]}"
|
||||||
volhomeSize="${BASH_REMATCH[2]}"
|
volHomeSize="${BASH_REMATCH[2]}"
|
||||||
[[ " ${disks[*]} " == *"$volhomeDisk"* ]] || critical "Unknow disk $volhomeDisk !"
|
if [[ " ${disks[*]} " != *"${volHomeDisk}"* ]]; then
|
||||||
dryRun lvcreate -L$volhomeSize -n${vmName}_home $volhomeDisk
|
critical "Unknow disk ${volHomeDisk} !"
|
||||||
dryRun ssh $slaveKVMIP lvcreate -L$volhomeSize -n${vmName}_home $volhomeDisk
|
fi
|
||||||
|
dryRun lvcreate -L"${volHomeSize}" -n"${vmName}_home" "${volHomeDisk}"
|
||||||
|
dryRun ssh "${slaveKVMIP}" "lvcreate -L$volHomeSize -n${vmName}_home ${volHomeDisk}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -f "/etc/drbd.d/${vmName}.res" ]]; then
|
if [ -f "/etc/drbd.d/${vmName}.res" ]; then
|
||||||
warn "The DRBD resource file ${vmName}.res is already present! Continue? [y/N]"
|
warn "The DRBD resource file ${vmName}.res is already present! Continue? [y/N]"
|
||||||
read
|
read -r
|
||||||
if ! [[ "$REPLY" =~ (Y|y) ]]; then
|
if ! [[ "${REPLY}" =~ (Y|y) ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Generates drbd resource file.
|
# Generates drbd resource file.
|
||||||
|
|
||||||
if [ $(ls /etc/drbd.d/|wc -l) -gt 1 ]; then
|
# shellcheck disable=SC2012
|
||||||
|
if [ "$(ls /etc/drbd.d/ | wc -l)" -gt 1 ]; then
|
||||||
lastdrbdPort=$(grep -hEo ':[0-9]{4}' /etc/drbd.d/*.res | sort | uniq | tail -1 | sed 's/://')
|
lastdrbdPort=$(grep -hEo ':[0-9]{4}' /etc/drbd.d/*.res | sort | uniq | tail -1 | sed 's/://')
|
||||||
drbdPort=$((lastdrbdPort+1))
|
drbdPort=$((lastdrbdPort+1))
|
||||||
lastMinor=$(grep -hEo 'minor [0-9]{1,}' /etc/drbd.d/*.res | sed 's/minor //' | sort -n | tail -1)
|
lastMinor=$(grep -hEo 'minor [0-9]{1,}' /etc/drbd.d/*.res | sed 's/minor //' | sort -n | tail -1)
|
||||||
|
@ -133,7 +151,7 @@ else
|
||||||
minorvol1=1
|
minorvol1=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat << EOT > $tmpResFile
|
cat << EOT > "${tmpResFile}"
|
||||||
resource "${vmName}" {
|
resource "${vmName}" {
|
||||||
net {
|
net {
|
||||||
cram-hmac-alg "sha1";
|
cram-hmac-alg "sha1";
|
||||||
|
@ -154,24 +172,24 @@ resource "${vmName}" {
|
||||||
}
|
}
|
||||||
volume 0 {
|
volume 0 {
|
||||||
device minor ${minorvol0};
|
device minor ${minorvol0};
|
||||||
disk /dev/${volrootDisk}/${vmName}_root;
|
disk /dev/${volRootDisk}/${vmName}_root;
|
||||||
meta-disk internal;
|
meta-disk internal;
|
||||||
}
|
}
|
||||||
EOT
|
EOT
|
||||||
if [[ "$volhomeDisk" != "none" ]]; then
|
if [[ "${volHomeDisk}" != "none" ]]; then
|
||||||
cat << EOT >> $tmpResFile
|
cat << EOT >> "${tmpResFile}"
|
||||||
volume 1 {
|
volume 1 {
|
||||||
device minor ${minorvol1};
|
device minor ${minorvol1};
|
||||||
disk /dev/${volhomeDisk}/${vmName}_home;
|
disk /dev/${volHomeDisk}/${vmName}_home;
|
||||||
meta-disk internal;
|
meta-disk internal;
|
||||||
}
|
}
|
||||||
EOT
|
EOT
|
||||||
fi
|
fi
|
||||||
cat << EOT >> $tmpResFile
|
cat << EOT >> "${tmpResFile}"
|
||||||
on $masterKVM {
|
on ${masterKVM} {
|
||||||
address ${masterKVMIP}:${drbdPort};
|
address ${masterKVMIP}:${drbdPort};
|
||||||
}
|
}
|
||||||
on $slaveKVM {
|
on ${slaveKVM} {
|
||||||
address ${slaveKVMIP}:${drbdPort};
|
address ${slaveKVMIP}:${drbdPort};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,50 +197,75 @@ EOT
|
||||||
|
|
||||||
# Create/Activate the new drbd resources.
|
# Create/Activate the new drbd resources.
|
||||||
drbdadm="$(command -v drbdadm)"
|
drbdadm="$(command -v drbdadm)"
|
||||||
($doDryRun) && drbdadm="${drbdadm} --dry-run"
|
if isDryRun; then
|
||||||
|
drbdadm="${drbdadm} --dry-run"
|
||||||
|
fi
|
||||||
|
|
||||||
($doDryRun) && trap "rm /etc/drbd.d/${vmName}.res && ssh ${slaveKVMIP} rm /etc/drbd.d/${vmName}.res" 0
|
if isDryRun; then
|
||||||
install -m 600 $tmpResFile /etc/drbd.d/${vmName}.res
|
# shellcheck disable=SC2064
|
||||||
scp /etc/drbd.d/${vmName}.res ${slaveKVMIP}:/etc/drbd.d/
|
trap "rm /etc/drbd.d/${vmName}.res && ssh ${slaveKVMIP} rm /etc/drbd.d/${vmName}.res" 0
|
||||||
${drbdadm} create-md "$vmName"
|
fi
|
||||||
ssh $slaveKVMIP ${drbdadm} create-md "$vmName"
|
install -m 600 "${tmpResFile}" "/etc/drbd.d/${vmName}.res"
|
||||||
${drbdadm} adjust "$vmName"
|
scp "/etc/drbd.d/${vmName}.res" "${slaveKVMIP}:/etc/drbd.d/"
|
||||||
ssh $slaveKVMIP ${drbdadm} adjust "$vmName"
|
${drbdadm} create-md "${vmName}"
|
||||||
${drbdadm} -- --overwrite-data-of-peer primary "$vmName"
|
# shellcheck disable=SC2029
|
||||||
|
ssh "${slaveKVMIP}" "${drbdadm} create-md ${vmName}"
|
||||||
|
${drbdadm} adjust "${vmName}"
|
||||||
|
# shellcheck disable=SC2029
|
||||||
|
ssh "${slaveKVMIP}" "${drbdadm} adjust ${vmName}"
|
||||||
|
${drbdadm} -- --overwrite-data-of-peer primary "${vmName}"
|
||||||
|
|
||||||
if ! ($doDryRun); then
|
if ! isDryRun; then
|
||||||
sleep 5 && drbd-overview | tail -4
|
sleep 5
|
||||||
|
drbd-overview | tail -4
|
||||||
|
|
||||||
drbdDiskPath="/dev/drbd/by-res/${vmName}/0"
|
drbdDiskPath="/dev/drbd/by-res/${vmName}/0"
|
||||||
if ! [[ -b "$drbdDiskPath" ]]; then
|
if ! [ -b "${drbdDiskPath}" ]; then
|
||||||
warn "$drbdDiskPath not found! Continue? [y/N]"
|
warn "${drbdDiskPath} not found! Continue? [y/N]"
|
||||||
read
|
read -r
|
||||||
if ! [[ "$REPLY" =~ (Y|y) ]]; then
|
if ! [[ "${REPLY}" =~ (Y|y) ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
virtHome=""
|
virtRootDisk="--disk path=/dev/drbd/by-disk/${volRootDisk}/${vmName}_root,bus=virtio,io=threads,cache=none,format=raw"
|
||||||
[ "$volhomeDisk" != "none" ] && virtHome="--disk path=/dev/drbd/by-disk/${volhomeDisk}/${vmName}_home,bus=virtio,io=threads,cache=none,format=raw"
|
virtHomeDisk=""
|
||||||
bootMode="--pxe"
|
if [ "${volHomeDisk}" != "none" ]; then
|
||||||
[ -n "${preseedURL}" ] && bootMode="--location https://deb.debian.org/debian/dists/${debianVersion}/main/installer-amd64/ --extra-args \"auto=true priority=critical url=${preseedURL} hostname=${vmName}\""
|
virtHomeDisk="--disk path=/dev/drbd/by-disk/${volHomeDisk}/${vmName}_home,bus=virtio,io=threads,cache=none,format=raw"
|
||||||
[ -f "$isoImagePath" ] && bootMode="--cdrom=$isoImagePath"
|
fi
|
||||||
|
if [ -n "${preseedURL}" ]; then
|
||||||
|
bootMode="--location https://deb.debian.org/debian/dists/${debianVersion}/main/installer-amd64/ --extra-args auto=true priority=critical url=${preseedURL} hostname=${vmName}"
|
||||||
|
fi
|
||||||
|
if [ -f "${isoImagePath}" ]; then
|
||||||
|
bootMode="--cdrom=${isoImagePath}"
|
||||||
|
fi
|
||||||
|
bootMode=${bootMode:-"--pxe"}
|
||||||
|
|
||||||
dryRun virt-install --connect=qemu:///system \
|
dryRun virt-install \
|
||||||
--name=${vmName} \
|
--connect=qemu:///system \
|
||||||
--cpu mode=host-passthrough --vcpus=${vCPU} \
|
--name="${vmName}" \
|
||||||
--memory=${memory} \
|
--cpu "mode=host-passthrough" \
|
||||||
--disk path=/dev/drbd/by-disk/${volrootDisk}/${vmName}_root,bus=virtio,io=threads,cache=none,format=raw \
|
--vcpus="${vCPU}" \
|
||||||
$virtHome \
|
--memory="${memory}" \
|
||||||
$bootMode \
|
"${virtRootDisk}" \
|
||||||
--network=bridge:${bridgeName},model=virtio \
|
"${virtHomeDisk}" \
|
||||||
--noautoconsole --graphics vnc,listen=127.0.0.1,keymap=fr \
|
"${bootMode}" \
|
||||||
|
--network="bridge:${bridgeName},model=virtio" \
|
||||||
|
--noautoconsole \
|
||||||
|
--graphics "vnc,listen=127.0.0.1,keymap=fr" \
|
||||||
--rng /dev/random \
|
--rng /dev/random \
|
||||||
--os-variant=none
|
--os-variant=none
|
||||||
|
virst_install_rc=$?
|
||||||
|
|
||||||
if [ -x /usr/share/scripts/evomaintenance.sh ]; then
|
if [ "${virt_install_rc}" = "0" ]; then
|
||||||
($doDryRun) || echo "Install VM ${vmName} (add-vm.sh)" | /usr/share/scripts/evomaintenance.sh
|
echo -e "\e[32mDone! Now you can install your VM with virt-manager.\e[39m"
|
||||||
|
else
|
||||||
|
echo -e "\e[31mError! VM couldn't be created.\e[39m"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "\e[32mDone! Now you can install your VM with virt-manager.\e[39m"
|
if ! isDryRun && [ -x /usr/share/scripts/evomaintenance.sh ]; then
|
||||||
|
echo "Install VM ${vmName} (add-vm.sh)" | /usr/share/scripts/evomaintenance.sh
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue