I spent the last couple of weeks trying to figure out the best way to deploy an OS to the nodes over USB. I spent a few late nights trying to roll my own minimal Raspbian with debootstrap, and a few more scratching my head over how to use the USB boot and an initramfs to write the SD card on first boot or when directed to reformat and reinstall. And I was hesitant to write anything to automate any of this, since I have my heart set on using Ansible for deployment and I'm still an Ansible noob. I was busy yak shaving and yet I still didn't have a working way to copy an OS out to all the nodes over USB.
And then I remembered what I named this project.
So I went for the easy way out. Stick with the stock Raspbian Lite image. Modify the image so that it doesn't boot over SD and falls back on USB. Use the mass storage mode in rpiboot to write the Raspbian SD image to each node. Use rpiboot to serve different cmdline.txt bootfiles based on the USB hub port so that they each get their own unique USB networking MAC address. And use shell scripts for image generation and SD writing instead of making this another Ansible lesson. None of this is how I'd imagined it working, but at least it's working now. Later I can move the process to Ansible and different OS images and deployment schemes.
Three evenings later and the cluster can now write a Raspbian .img to all four nodes very slowly (30 minutes or so for all 4), boot them very slowly with a unique MAC and IP (about 5 minutes for all to come up), and take remote SSH logins from the host Pi.
It's hard (and boring) to show any of this in action, so here's a session showing a network between the head node and all compute nodes at once:
See? The Terrible Cluster lives up to its name.