Last active
July 19, 2022 02:05
-
-
Save likema/69f6617c7567766302ec1ee4a53a0f6c to your computer and use it in GitHub Desktop.
Create and configure GlusterFS in Docker.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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