#!/bin/bash
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
#
# Script for bringing up an N node consul cluster
# on the local machine on different ports.
#
# The first node is listening on the default ports
# so that the command line tool works.
#
# Examples:
#
# 3-node cluster:
#
# $ consul-cluster.bash
# $ consul-cluster.bash 3
#
# 5-node cluster with specific consul version:
#
# $ consul-cluster.bash 5 ~/consul-0.7.5/consul
config( ) {
local port = ${ 1 :- 0 }
local name = " consul ${ port } "
local nodeid = $( printf "00000000-0000-0000-0000-%012d" $port )
local path = " $DIR / ${ name } "
cat << EOF > " ${ path } /a.json "
{
"server" : true,
"node_id" : " ${ nodeid } " ,
"node_name" : " ${ name } " ,
"data_dir" : " ${ name } /data " ,
"pid_file" : " ${ name } /pid " ,
"bind_addr" : "127.0.0.1" ,
"retry_join" : [ "127.0.0.1:8301" ,"127.0.0.1:8304" ,"127.0.0.1:8307" ] ,
"bootstrap_expect" : ${ N } ,
"ports" : {
"http" : $(( 8500 + $port )) ,
"dns" : $(( 8600 + $port )) ,
"server" : $(( 8300 + 3 * $port )) ,
"serf_lan" : $(( 8301 + 3 * $port )) ,
"serf_wan" : $(( 8302 + 3 * $port )) ,
"rpc" : $(( 8400 + $port ))
}
}
EOF
}
trap cleanup EXIT TERM KILL
jobs =
cleanup( ) {
[ " $jobs " = = "" ] || kill $jobs
[ " $CLEANDIR " = = "y" -a " $DIR " != "" ] && rm -rf " $DIR "
}
run( ) {
local port = $1
local name = consul${ port }
local path = " $DIR / ${ name } "
rm -rf " ${ path } "
mkdir -p " ${ path } "
config $port
( $CONSUL agent -config-dir " ${ path } " 2>& 1 | tee " ${ path } /log " ; echo " Exit code: $? " >> " ${ path } /log " ) &
jobs = " $jobs $! "
}
N = 3
CONSUL = $( which consul)
CLEANDIR = y
SLEEP = y
while test $# -gt 0 ; do
case " $1 " in
-d| --dir)
shift
DIR = $1
CLEANDIR = n
shift
; ;
-n| --nodes)
shift
N = $1
shift
; ;
-q| --quick)
shift
SLEEP = n
; ;
-x| --consul)
shift
CONSUL = $1
shift
; ;
*)
echo " Usage: $( basename $0 ) [-n nodes] [-x consul] [-d dir] "
echo ""
echo " -h, --help brief help"
echo " -d, --dir temp dir path to the temp directory, default is $DIR "
echo " -n, --nodes nodes number of nodes to start, default is $N "
echo " -q, --quick do not wait during startup"
echo " -x, --consul consul consul binary, default is $CONSUL "
exit 0
; ;
esac
done
[ " $DIR " = = "" ] && DIR = $( mktemp -d /tmp/consul-cluster-XXXXXXX)
echo " Starting $N node cluster. exe= $CONSUL data= $DIR "
[ " $CLEANDIR " = = "y" ] && echo "Data files will be removed"
echo "Stop with CTRL-C"
echo ""
[ " $SLEEP " = = "y" ] && sleep 3
for ( ( i = 0 ; i < N ; i++) ) ; do run $i ; done
wait