kvm-host: Add support for kvm solo
All checks were successful
Ansible Lint |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |2625|4|2621|5|:+1: Reference build: <a href="https://jenkins.evolix.org/job/gitea/job/ansible-roles/job/unstable/324//ansiblelint">Evolix » ansible-roles » unstable #324</a>
gitea/ansible-roles/pipeline/head This commit looks good

This commit is contained in:
Brice Waegeneire 2023-08-18 15:08:48 +02:00
parent feba74c469
commit a56682a7ca

View file

@ -26,6 +26,10 @@ dryRun() {
fi fi
} }
isSolo() {
test -z "$slaveKVMIP"
}
critical() { critical() {
echo -ne "\e[31m${1}\e[39m\n" && exit 1 echo -ne "\e[31m${1}\e[39m\n" && exit 1
} }
@ -50,6 +54,7 @@ defaultVCPU="${defaultVCPU:-"2"}"
defaultRAM="${defaultRAM:-"4G"}" defaultRAM="${defaultRAM:-"4G"}"
defaultRootSize="${defaultRootSize:-"20G"}" defaultRootSize="${defaultRootSize:-"20G"}"
defaultHomeSize="${defaultHomeSize:-"40G"}" defaultHomeSize="${defaultHomeSize:-"40G"}"
defaultVmName="${defaultVmName:-}"
DIALOGOUT=$(mktemp --tmpdir=/tmp addvm.XXX) DIALOGOUT=$(mktemp --tmpdir=/tmp addvm.XXX)
export DIALOGOUT export DIALOGOUT
@ -62,7 +67,9 @@ HELPFILE=$(mktemp --tmpdir=/tmp addvm.XXX)
export HELPFILE export HELPFILE
tmpResFile=$(mktemp --tmpdir=/tmp addvm.XXX) tmpResFile=$(mktemp --tmpdir=/tmp addvm.XXX)
masterKVM="$(hostname -s)" masterKVM="$(hostname -s)"
slaveKVM="$(ssh "${slaveKVMIP}" hostname -s)" if ! isSolo; then
slaveKVM="$(ssh "${slaveKVMIP}" hostname -s)"
fi
# Exit & Cleanup function. # Exit & Cleanup function.
clean() { clean() {
@ -81,7 +88,7 @@ ${DIALOG} \
"memory" 2 1 "${defaultRAM}" 2 10 20 0 \ "memory" 2 1 "${defaultRAM}" 2 10 20 0 \
"volRoot" 3 1 "${disks[0]}-${defaultRootSize}" 3 10 20 0 \ "volRoot" 3 1 "${disks[0]}-${defaultRootSize}" 3 10 20 0 \
"volHome" 4 1 "${disks[1]}-${defaultHomeSize}" 4 10 20 0 \ "volHome" 4 1 "${disks[1]}-${defaultHomeSize}" 4 10 20 0 \
"vmName" 5 1 "" 5 10 20 0 \ "vmName" 5 1 "${defaultVmName}" 5 10 20 0 \
2> "${DIALOGOUT}" 2> "${DIALOGOUT}"
vCPU=$(sed 1'q;d' "${DIALOGOUT}") vCPU=$(sed 1'q;d' "${DIALOGOUT}")
@ -114,7 +121,9 @@ else
critical "Unknow disk ${volRootDisk} !" critical "Unknow disk ${volRootDisk} !"
fi fi
dryRun lvcreate -L"${volRootSize}" -n"${vmName}_root" "${volRootDisk}" dryRun lvcreate -L"${volRootSize}" -n"${vmName}_root" "${volRootDisk}"
dryRun ssh "${slaveKVMIP}" "lvcreate -L$volRootSize -n${vmName}_root ${volRootDisk}" if ! isSolo; then
dryRun ssh "${slaveKVMIP}" "lvcreate -L$volRootSize -n${vmName}_root ${volRootDisk}"
fi
fi fi
if ! [[ "${volHome}" =~ ([^-]+)-([0-9]+G) ]]; then if ! [[ "${volHome}" =~ ([^-]+)-([0-9]+G) ]]; then
@ -127,10 +136,12 @@ else
critical "Unknow disk ${volHomeDisk} !" critical "Unknow disk ${volHomeDisk} !"
fi fi
dryRun lvcreate -L"${volHomeSize}" -n"${vmName}_home" "${volHomeDisk}" dryRun lvcreate -L"${volHomeSize}" -n"${vmName}_home" "${volHomeDisk}"
dryRun ssh "${slaveKVMIP}" "lvcreate -L$volHomeSize -n${vmName}_home ${volHomeDisk}" if ! isSolo; then
dryRun ssh "${slaveKVMIP}" "lvcreate -L$volHomeSize -n${vmName}_home ${volHomeDisk}"
fi
fi fi
if [ -f "/etc/drbd.d/${vmName}.res" ]; then if ! isSolo && [ -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 -r read -r
if ! [[ "${REPLY}" =~ (Y|y) ]]; then if ! [[ "${REPLY}" =~ (Y|y) ]]; then
@ -138,22 +149,23 @@ if [ -f "/etc/drbd.d/${vmName}.res" ]; then
fi fi
fi fi
# Generates drbd resource file. if ! isSolo; then
# Generates drbd resource file.
# shellcheck disable=SC2012 # shellcheck disable=SC2012
if [ "$(ls /etc/drbd.d/ | wc -l)" -gt 1 ]; then 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)
minorvol0=$((lastMinor+1)) minorvol0=$((lastMinor+1))
minorvol1=$((lastMinor+2)) minorvol1=$((lastMinor+2))
else else
drbdPort=7900 drbdPort=7900
minorvol0=0 minorvol0=0
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";
@ -178,16 +190,16 @@ resource "${vmName}" {
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};
} }
@ -197,45 +209,52 @@ cat << EOT >> "${tmpResFile}"
} }
EOT EOT
# Create/Activate the new drbd resources. # Create/Activate the new drbd resources.
drbdadm="$(command -v drbdadm)" drbdadm="$(command -v drbdadm)"
if isDryRun; then if isDryRun; then
drbdadm="${drbdadm} --dry-run" drbdadm="${drbdadm} --dry-run"
fi fi
if isDryRun; then if isDryRun; then
# shellcheck disable=SC2064 # shellcheck disable=SC2064
trap "rm /etc/drbd.d/${vmName}.res && ssh ${slaveKVMIP} rm /etc/drbd.d/${vmName}.res" 0 trap "rm /etc/drbd.d/${vmName}.res && ssh ${slaveKVMIP} rm /etc/drbd.d/${vmName}.res" 0
fi fi
install -m 600 "${tmpResFile}" "/etc/drbd.d/${vmName}.res" install -m 600 "${tmpResFile}" "/etc/drbd.d/${vmName}.res"
scp "/etc/drbd.d/${vmName}.res" "${slaveKVMIP}:/etc/drbd.d/" scp "/etc/drbd.d/${vmName}.res" "${slaveKVMIP}:/etc/drbd.d/"
${drbdadm} create-md "${vmName}" ${drbdadm} create-md "${vmName}"
# shellcheck disable=SC2029 # shellcheck disable=SC2029
ssh "${slaveKVMIP}" "${drbdadm} create-md ${vmName}" ssh "${slaveKVMIP}" "${drbdadm} create-md ${vmName}"
${drbdadm} adjust "${vmName}" ${drbdadm} adjust "${vmName}"
# shellcheck disable=SC2029 # shellcheck disable=SC2029
ssh "${slaveKVMIP}" "${drbdadm} adjust ${vmName}" ssh "${slaveKVMIP}" "${drbdadm} adjust ${vmName}"
${drbdadm} -- --overwrite-data-of-peer primary "${vmName}" ${drbdadm} -- --overwrite-data-of-peer primary "${vmName}"
if ! isDryRun; then if ! isDryRun; then
sleep 5 sleep 5
drbdadm status | tail -4 drbdadm status | 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 -r read -r
if ! [[ "${REPLY}" =~ (Y|y) ]]; then if ! [[ "${REPLY}" =~ (Y|y) ]]; then
exit 1 exit 1
fi
fi fi
fi fi
fi fi
virtRootDisk="--disk path=/dev/drbd/by-disk/${volRootDisk}/${vmName}_root,bus=virtio,io=threads,cache=none,format=raw" if isSolo; then
virtHomeDisk="" virtRootDisk="--disk path=/dev/${volRootDisk}/${vmName}_root,bus=virtio,io=threads,cache=none,format=raw"
if [ "${volHomeDisk}" != "none" ]; then virtHomeDisk="--disk path=/dev/${volHomeDisk}/${vmName}_home,bus=virtio,io=threads,cache=none,format=raw"
virtHomeDisk="--disk path=/dev/drbd/by-disk/${volHomeDisk}/${vmName}_home,bus=virtio,io=threads,cache=none,format=raw" else
virtRootDisk="--disk path=/dev/drbd/by-disk/${volRootDisk}/${vmName}_root,bus=virtio,io=threads,cache=none,format=raw"
virtHomeDisk=""
if [ "${volHomeDisk}" != "none" ]; then
virtHomeDisk="--disk path=/dev/drbd/by-disk/${volHomeDisk}/${vmName}_home,bus=virtio,io=threads,cache=none,format=raw"
fi
fi fi
if [ -n "${preseedURL}" ]; then 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}" bootMode="--location https://deb.debian.org/debian/dists/${debianVersion}/main/installer-amd64/ --extra-args auto=true priority=critical url=${preseedURL} hostname=${vmName}"
fi fi
@ -269,5 +288,3 @@ fi
if ! isDryRun && [ -x /usr/share/scripts/evomaintenance.sh ]; then if ! isDryRun && [ -x /usr/share/scripts/evomaintenance.sh ]; then
echo "Install VM ${vmName} (add-vm.sh)" | /usr/share/scripts/evomaintenance.sh echo "Install VM ${vmName} (add-vm.sh)" | /usr/share/scripts/evomaintenance.sh
fi fi