Raspberry Pi Zero Cluster with Ansible

Cluster Hat

Out of habit I add a Pi Zero to every Adafruit order I make (or anywhere else that sells the Pi Zero for $5) and have built up quite a collection, I had been looking at some Pi cluster projects but the wiring for network and power always seemed anoying and fragile.

You may wonder why someone would want a slow pi cluster, I have been looking at using Ansible as a way to manage software for all my pi based projects and for some cloud automation and thought a cluster might be a fun way to build an Ansible test bed and learn how to manage multiple Pi’s. Then I discovered the ClusterHAT which attachs to a Raspberry Pi 2/3 “Controller” and uses USB Gadget mode to connect and power 4 Pi Zero “Nodes” into a small cluster with a hat that connects via USB and the GPIO with no other networking or wiring required.

Since putting together a hub and all the cabling to make my own cluster still seemed anoying and was also more expensive I immediately ordered a ClusterHAT and another Pi Zero from Pimoroni. Using the pre-built images provided in the simple section of the ClusterHAT software setup page I prepared SD cards for each Pi before the hat arrived, I used a 10X 32GB card for the controller and 4 10X 16GB cards for each of the nodes. Using my trusty label printer I labeled each Pi Zero and SD Card. After about a week they arrived from the UK and I installed the SD cards I had prepared for each Pi and set about attaching the hat to a Pi 2 and an acrylic plate I had laying around.

Cluster Hat

I connected the Pi 2 to ethernet and powered it up, using Angry IP Scanner I angrily scanned my network and found the IP address for my new cluster controller and used SSH to connect to it:

After logging in I just typed clusterhat to see what would happen:

Cluster Hat Terminal

Seems legit, let’s turn them all on and then back off again:

Cluster Hat Terminal

A nice indicator light on the ClusterHAT lights up when each Pi Zero is turned on. After turning them back on again I angrily scanned my network again and saw 4 new IP addresses for P1, P2, P3 and P4. It really was that easy to get the ClusterHAT up and running I used SSH to connect to each pi and expand the file system, I didn’t make any other raspi-config changes as I want to try and use Ansible for that later.

Ansible Time

First I set up a public/private keypair on the controller so I don’t have to do any login stuff:

// Generate the key
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
// Spit it Out
cat ~/.ssh/id_rsa.pub

I copied the key output and used SSH to connect to each Pi Zero from the controller:

sudo ssh [email protected], P2, P2, P4
sudo mkdir ~/.ssh
sudo nano ~/.ssh/authorized_keys

Paste the key value into nano and use CTRL X to save and exit nano and then SSH on each Pi Zero. From the controller SSH to each Pi Zero and accept the certificate and verify you don’t have to enter a password to connect.

Then on the controller install ansible:

sudo apt-get install python-pip git python-dev sshpass
sudo pip install markupsafe
sudo pip install ansible

Next I created an ansible directory and setup a hosts file:

sudo mkdir ~/ansible
sudo nano ~/ansible/hosts

And pasted the following text into nano and used CTRL X to save the hosts file and and exit:

[clusternodes]
p[1:4]
[clusternodes:vars]
ansible_ssh_user=pi

If everything has gone perfectly you should be able to issue some ansible commands, first lets check that our ansible hosts file is set up correctly:

ansible -i ~/ansible/hosts clusternodes --list-hosts

Ansible Hosts Terminal

That worked, now lets see if we can ping all the nodes:

ansible -i ~/ansible/hosts clusternodes -m ping

Cluster Hat Terminal

That’s it, ansible on a pi zero Clustercluster using SSH keys for login, now I have to dig into making playbooks and additional ansible configuration options. The The ClusterHAT really is a nice way to build a little cluster without fighting with a ton of wiring and USB and ethernet hubs.