From 252c5433044cfbf83e32f784f68a5f5c8afeb3cc Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Sat, 4 Dec 2021 02:20:43 -0500 Subject: [PATCH] Add buildpxe.sh framework Adds a script to set up a PXE image directory for the PVC installer. Provides an alternative to the ISO for automating deploys in a controlled, PXE-based environment. --- buildpxe.sh | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100755 buildpxe.sh diff --git a/buildpxe.sh b/buildpxe.sh new file mode 100755 index 0000000..0e4b166 --- /dev/null +++ b/buildpxe.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash + +# Generate a PVC autoinstaller PXE configuration + +fail() { + echo "$@" + exit 1 +} + +test -f /usr/lib/PXELINUX/pxelinux.0 &>/dev/null || fail "This script requires pxelinux and syslinux-common" +test -f /usr/lib/syslinux/modules/bios/ldlinux.c32 &>/dev/null || fail "This script requires pxelinux and syslinux-common" +sudo -n true &>/dev/null || fail "The user running this script must have sudo privileges." + +outputdir="pvc-installer-pxe_$(date +%Y-%m-%d)/" +deployusername="deploy" + +show_help() { + echo -e "PVC install PXE generator" + echo + echo -e " Generates a mostly-automated installer PXE image for a PVC node base system." + echo -e " This setup is designed to be used with the pvcbootstrapd system; for a normal" + echo -e " installation, use buildiso.sh instead." + echo + echo -e "Usage: $0 [-h] [-o ] [-u username]" + echo + echo -e " -h: Display this help message." + echo -e " -o: Create the PXE images under instead of the default." + echo -e " -u: Change 'deploy' user to a new username." + echo -e " -a: Preserve live-build artifacts (passed through to buildiso.sh)." + echo -e " -k: Preserve live-build config (passed through to buildiso.sh)." + echo -e " -i: Preserve live-build ISO image." +} + +while getopts "h?o:u:aki" opt; do + case "$opt" in + h|\?) + show_help + exit 0 + ;; + o) + outputdir="$OPTARG" + ;; + u) + deployusername=$OPTARG + ;; + a) + preserve_artifacts='-a' + ;; + k) + preserve_livebuild='-l' + ;; + i) + preserve_liveiso='y' + ;; + esac +done + +cleanup() { + echo -n "Cleaning up... " + echo "done." + echo +} + +fail() { + echo $@ + cleanup + exit 1 +} + +build_iso() { + if [[ ! -f pvc-installer_pxe-tmp.iso ]]; then + ./buildiso.sh \ + -o pvc-installer_pxe-tmp.iso \ + -u ${deployusername} \ + ${preserve_artifacts} \ + ${preserve_livebuild} + fi +} + +build_pxe() { + mkdir -p ${outputdir} ${outputdir}/boot + + echo -n "Mounting temporary ISO file... " + tmpdir=$( mktemp -d ) + sudo mount pvc-installer_pxe-tmp.iso ${tmpdir} &>/dev/null + echo "done." + + echo -n "Copying live boot files... " + cp ${tmpdir}/live/filesystem.squashfs ${outputdir}/ + cp ${tmpdir}/live/vmlinuz ${outputdir}/ + cp ${tmpdir}/live/initrd.img ${outputdir}/ + echo "done." + + echo -n "Unmounting and removing temporary ISO file... " + sudo umount ${tmpdir} + rmdir ${tmpdir} + echo "done." + + echo -n "Creating base iPXE configuration... " + cat < ${outputdir}/boot.pxe +#!ipxe + +# Set global variables +set root-url tftp://\${next-server} +set host-url tftp://\${next-server}/host + +# Load host/mac-*.ipxe if present (per-host host-args configuration) +chain --autofree \${host-url}/mac-\${mac:hexraw}.ipxe || + +set menu-default pvc-installer +set submenu-default pvc-installer + +:pvc-installer +kernel \${root-url}/vmlinuz +initrd \${root-url}/initrd.img +imgargs vmlinuz console=tty0 console=ttyS0,115200n8 boot=live components timezone=America/Toronto fetch=\${root-url}/filesystem.squashfs username=root \${host-args} +boot +EOF + echo "done." + + sudo chown -R $(whoami) ${outputdir} + sudo chmod -R u+w ${outputdir} + + if [[ -z ${preserve_liveiso} ]]; then + echo -n "Removing temporary ISO... " + rm pvc-installer_pxe-tmp.iso &>/dev/null + echo "done." + fi +} + +build_iso +build_pxe +cleanup + +echo "PVC Live Installer PXE generation complete."