Skip to content

Instantly share code, notes, and snippets.

@likema
Last active July 19, 2022 02:05
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save likema/69f6617c7567766302ec1ee4a53a0f6c to your computer and use it in GitHub Desktop.
Save likema/69f6617c7567766302ec1ee4a53a0f6c to your computer and use it in GitHub Desktop.
Create and configure GlusterFS in Docker.
#!/bin/sh
GLUSTER_IMAGE=gluster/gluster-centos
gluster_ip_addr() {
local name=$1
docker inspect $1 | sed -n 's/.*"IPAddress":[[:blank:]]\+"\([^"]\+\)".*/\1/p' | sort -u
}
gluster_status() {
local nodes=$1
for i in `seq 1 $nodes`; do
echo "== gluster$i (`gluster_ip_addr gluster$i`) status =="
docker exec -ti gluster$i gluster peer status
echo
done
}
gluster_probe() {
local nodes=$1
for i in `seq 2 $nodes`; do
docker exec -ti gluster1 gluster peer probe `gluster_ip_addr gluster$i`
done
}
gluster_vol_do() {
docker exec -ti gluster1 gluster volume $*
}
gluster_run() {
local nodes=$1
local etc=/etc/glusterfs
local var=/var/lib/glusterd
local log=/var/log/glusterfs
local cgroup=/sys/fs/cgroup
local srv=/srv/glusterfs
for i in `seq 1 $nodes`; do
docker run -d --privileged=true --name gluster$i --hostname=gluster$i \
-v $etc$i:$etc:z \
-v $var$i:$var:z \
-v $log$i:$log:z \
-v $srv$i:$srv:z \
-v $cgroup:$cgroup:ro \
-v /dev/:/dev \
$GLUSTER_IMAGE
done
}
gluster_do() {
local op=$1
local nodes=$2
local etc=/etc/glusterfs
local var=/var/lib/glusterd
local log=/var/log/glusterfs
local srv=/srv/glusterfs
for i in `seq 1 $nodes`; do
docker $op gluster$i
[ "$op" = "rm" ] && rm -rf $etc$i $var$i $log$i $srv$i
done
}
gluster_ssh_key() {
local nodes=$1
local pub_key=$2
for i in `seq 1 $nodes`; do
docker exec gluster$i mkdir -p /root/.ssh
docker cp $pub_key gluster$i:/root/.ssh/authorized_keys
docker exec gluster$i chmod -R og-rwx /root/.ssh
done
}
if [ $# -lt 1 ]; then
echo "gluster_docker run|start|stop|rm|probe|status|vol|pubkey [<options>]" >&2
exit 1
fi
op=$1
shift
if [ "$op" = "vol" ]; then
if [ $# -lt 2 ]; then
echo "gluster_docker vol create|start|stop|info|status|delete|heal <volume> [<options>]" >&2
exit 1
fi
vol_op=$1
vol=$2
shift 2
case "$vol_op" in
create|start|stop|info|status|delete|heal)
[ "$vol_op" = "delete" ] && gluster_vol_do stop $vol
if gluster_vol_do $vol_op $vol $* && [ "$vol_op" = "create" ]; then
gluster_vol_do start $vol
fi
;;
*)
echo "Unknown vol operation: $vol_op" >&2
exit 1
;;
esac
else
if [ $# -lt 1 ]; then
echo "gluster_docker $op <nodes>" >&2
exit 1
fi
nodes=$1
if [ $nodes -lt 2 ]; then
echo "The number of nodes must be at least 2." >&2
exit 1
fi
case "$op" in
run)
gluster_run $nodes
gluster_probe $nodes
;;
status)
gluster_status $nodes
;;
probe)
gluster_probe $nodes
;;
start|stop|rm)
[ "$op" = "rm" ] && gluster_do stop $nodes
gluster_do $op $nodes
;;
pubkey)
if [ $# -lt 2 ]; then
echo "gluster_docker pubkey <nodes> <public key file>" >&2
exit 1
fi
pub_key=$2
gluster_ssh_key $nodes $pub_key
;;
*)
echo "Unknown operation: $op" >&2
exit 1
;;
esac
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment