Create Vagrant environment with shared MUNGE key

This commit is contained in:
Kris Lamoureux 2024-08-09 23:03:55 -04:00
commit f5f601af13
Signed by: kris
GPG Key ID: 3EDA9C3441EDA925
3 changed files with 134 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
munge.key
nodes.rb
.settings.yml
.vagrant

58
Vagrantfile vendored Normal file
View File

@ -0,0 +1,58 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Load override settings
require 'yaml'
settings_path = '.settings.yml'
settings = {}
if File.exist?(settings_path)
settings = YAML.load_file(settings_path)
end
# Default Vagrant settings
VAGRANT_BOX = settings['VAGRANT_BOX'] || 'debian/bookworm64'
VAGRANT_CPU = settings['VAGRANT_CPU'] || 2
VAGRANT_MEM = settings['VAGRANT_MEM'] || 2048
SSH_FORWARD = settings['SSH_FORWARD'] || false
# Default Slurm settings
SLURM_NODES = settings['SLURM_NODES'] || 4
JOIN_TIMEOUT = settings['JOIN_TIMEOUT'] || 60
# Node settings overrides
if File.exist?('nodes.rb')
require_relative 'nodes.rb'
else
# Using all defaults
NODES = {}
end
HOSTS = Array(1..SLURM_NODES)
Vagrant.configure(2) do |vm_config|
HOSTS.each do |count|
vm_config.vm.define "node#{count}" do |config|
config.vm.hostname = "node#{count}"
config.vm.box = NODES.dig("node#{count}", 'BOX') || VAGRANT_BOX
config.ssh.forward_agent =
NODES.dig("node#{count}", 'SSH') || SSH_FORWARD
# Libvirt
config.vm.provider :libvirt do |virt|
virt.memory = NODES.dig("node#{count}", 'MEM') || VAGRANT_MEM
virt.cpus = NODES.dig("node#{count}", 'CPU') || VAGRANT_CPU
end
# VirtualBox
config.vm.provider :virtualbox do |vbox|
vbox.memory = NODES.dig("node#{count}", 'MEM') || VAGRANT_MEM
vbox.cpus = NODES.dig("node#{count}", 'CPU') || VAGRANT_CPU
end
# Install and Setup Slurm
config.vm.provision "shell", inline: <<-SHELL
/bin/bash /vagrant/provision.sh
SHELL
end
end
end

72
provision.sh Executable file
View File

@ -0,0 +1,72 @@
#!/bin/bash
#######################################
### Install and setup Slurm cluster ###
#######################################
# Print commands and exit on error
set -xe
# Prevents interactive prompts during package installation
export DEBIAN_FRONTEND=noninteractive
# Keep system clocks in sync
apt-get update
apt-get install -y chrony
systemctl start chrony
systemctl enable chrony
# Install MUNGE
apt-get update
apt-get install -y munge
# Create a dedicated non-privileged user account for MUNGE
getent group munge > /dev/null || groupadd -r -g 900 munge
id -u munge &>/dev/null || \
useradd -r -u 900 -g munge -d /var/lib/munge -s /usr/sbin/nologin munge
# node1 = manager
if [ "$(hostname)" == "node1" ]; then
# Create common MUNGE key on the manager node
if [ ! -f /etc/munge/munge.key ]; then
sudo -u munge /usr/sbin/mungekey --verbose
fi
# Set MUNGE key perms
chmod 600 /etc/munge/munge.key
# Copy to shared directory for other nodes
cp /etc/munge/munge.key /vagrant/munge.key
# Enable/start/test munge service
systemctl enable munge.service
systemctl start munge.service
munge -n | unmunge
else
# Initial delay
sleep 5
# Waits JOIN_TIMEOUT of seconds to find the munge.key file before giving up
START_TIME="$(date +%s)"
# Wait until the munge.key can be found via Vagrant provider file sharing /vagrant
while [ ! -f /vagrant/munge.key ]; do
CURRENT_TIME="$(date +%s)"
DIFF_TIME="$((CURRENT_TIME - START_TIME))"
# Timeout
if [ "$DIFF_TIME" -ge "$JOIN_TIMEOUT" ]; then
echo "[ERROR]: $(hostname) waited $DIFF_TIME/$JOIN_TIMEOUT seconds"
exit 1
fi
# Waiting
echo "Waiting ($DIFF_TIME/$JOIN_TIMEOUT seconds) for /vagrant/munge.key file"
sleep 10
done
# Enable/start/test munge service
cp /vagrant/munge.key /etc/munge/munge.key
systemctl enable munge.service
systemctl start munge.service
munge -n | unmunge
fi