Philippe Caseiro
78a27b4fdd
Ajouter la possibilité de créer une grappe haute disponibilité entre plusieurs Hâpy (https://docs.opennebula.org/5.6/advanced_components/ha/index.html) Pré-requis : Les datastores doivent être partagés entre tous les Hâpy via NFS ou tout autre système de fichiers accécibles de manière concurrente entre les serveurs (Glusterfs, Ceph, DRBD). Pour faire ce développement nous nous sommes basés sur eole-glusterfs qui permet de créer une grappe glusterfs (https://dev-eole.ac-dijon.fr/projects/eole-glusterfs)
229 lines
5.4 KiB
Bash
Executable File
229 lines
5.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
#
|
|
# Register all Hâpy Cluster Nodes
|
|
#
|
|
|
|
. /usr/lib/eole/ihm.sh
|
|
|
|
#
|
|
# NAME: copy_ssh_id
|
|
# AIM: Copy the ssh key on the host
|
|
# PARAM: the hostname of the node
|
|
#
|
|
function copy_ssh_id()
|
|
{
|
|
local host=${1}
|
|
|
|
CLEF=$(cat ~oneadmin/.ssh/id_rsa.pub)
|
|
ssh ${host} bash <<EOF
|
|
if ! grep -qs "$CLEF" ~oneadmin/.ssh/authorized_keys; then
|
|
echo "$CLEF" >> ~oneadmin/.ssh/authorized_keys
|
|
chown oneadmin:oneadmin ~oneadmin/.ssh/authorized_keys
|
|
su - oneadmin -c "ssh-keyscan $host"
|
|
cat ~oneadmin/.ssh/id_rsa.pub >> ~oneadmin/.ssh/authorized_keys
|
|
fi
|
|
EOF
|
|
[[ ${?} -ne 0 ]] && EchoRouge "Erreur lors de l'échange de clés SSH avec le noeud ${host}"
|
|
REMOTEKEY=$(su - oneadmin -c "ssh ${host} 'cat ~oneadmin/.ssh/id_rsa.pub'")
|
|
if ! grep -qs "$REMOTEKEY" ~oneadmin/.ssh/authorized_keys; then
|
|
su - oneadmin -c "echo ${REMOTEKEY} >> ~oneadmin/.ssh/authorized_keys"
|
|
su - oneadmin -c "ssh-keyscan $host"
|
|
fi
|
|
}
|
|
|
|
function copy_files()
|
|
{
|
|
local host=${1}
|
|
su - oneadmin -c "scp .one/* ${host}:.one/"
|
|
}
|
|
|
|
|
|
#
|
|
# NAME: sync_db
|
|
# AIM: Sync onedb in HA and sqlite mode
|
|
# PARAM: the hostname of the node
|
|
#
|
|
function sync_db()
|
|
{
|
|
local ip=${1}
|
|
local user="oneadmin"
|
|
local DBFILE="/var/lib/one/one.db"
|
|
local DBBCK="/tmp/one.db.bck"
|
|
local ret=0
|
|
|
|
if [[ ! -f ${DBBCK} ]]
|
|
then
|
|
cmd="onedb backup --sqlite ${DBFILE} ${DBBCK}"
|
|
ret=$(su - ${user} -c -- "${cmd}")
|
|
fi
|
|
|
|
cmd2="scp ${DBBCK} ${ip}:${DBFILE}.leader"
|
|
ret=$(su - ${user} -c -- "${cmd2}")
|
|
return ${?}
|
|
}
|
|
|
|
#
|
|
# NAME: sync_nodes
|
|
# AIM: force nodes sync with rsync (ONE 5.6.1 bug)
|
|
# PARAM: none
|
|
#
|
|
function sync_nodes()
|
|
{
|
|
# Need to sync hosts with rsync after creation, ONE 5.6.1 bug
|
|
cmd2="onehost sync -f --rsync"
|
|
ret2=$(su - ${ONEUSER} -c -- "${cmd2}")
|
|
return ${?}
|
|
}
|
|
|
|
#
|
|
# NAME: register_node
|
|
# AIM: register the node in OpenNebula master
|
|
# PARAM: the node hostname
|
|
#
|
|
function register_node()
|
|
{
|
|
cmd="onehost create -i kvm -v kvm -c 0 ${1}"
|
|
|
|
ret=$(su - ${ONEUSER} -c -- "${cmd}")
|
|
if [[ ${?} -ne 0 ]]
|
|
then
|
|
EchoRouge "Hosts register failed $res"
|
|
else
|
|
EchoVert "Hosts register OK"
|
|
fi
|
|
}
|
|
|
|
|
|
#
|
|
# NAME: wait_node_ok
|
|
# AIM: Wait until the node is OK or ERROR
|
|
# PARAM: The node name
|
|
#
|
|
function wait_node_ok()
|
|
{
|
|
local cmd="onehost show ${1} | awk '/^STATE/ {print \$3}'"
|
|
local spinstr='|/-\'
|
|
local delay=0.75
|
|
local cnt=0
|
|
|
|
while [ 1 ]
|
|
do
|
|
st=$(su - ${ONEUSER} -c "${cmd}")
|
|
[[ ${st} == "MONITORED" ]] && break
|
|
[[ ${st} == '' ]] && break
|
|
if [[ ${st} == "ERROR" ]]
|
|
then
|
|
if [ $cnt -gt 160 ]; then
|
|
EchoRouge "Erreur lors de l'enregistrement du noeud ${host} !"
|
|
break
|
|
fi
|
|
fi
|
|
|
|
local temp=${spinstr#?}
|
|
printf " [%c] " "$spinstr"
|
|
local spinstr=$temp${spinstr%"$temp"}
|
|
sleep $delay
|
|
printf "\b\b\b\b\b\b"
|
|
cnt=$((cnt+1))
|
|
done
|
|
printf " \b\b\b\b"
|
|
}
|
|
|
|
function init_ha_leader() {
|
|
# server with index 1 exists if already instanciate
|
|
onezone show 0 | grep -A 3 ^"HA & FEDERATION SYNC STATUS" | tail -n 1 | grep -q ^" 1 "
|
|
if [ ! $? = 0 ]; then
|
|
FOLLOWER=$(CreoleGet one_nodes)
|
|
for follower in $FOLLOWER; do
|
|
onezone server-add 0 --name $follower --rpc http://$follower:2633/RPC2
|
|
done
|
|
fi
|
|
}
|
|
|
|
#
|
|
# MAIN
|
|
#
|
|
HAPY_ACTIF=$(echo $(CreoleGet activer_onesinglenode))
|
|
if [[ $HAPY_ACTIF == "non" ]]
|
|
then
|
|
EchoRouge "Le serveur de virtualisation n'est pas activé dans l'interface de configuration du module"
|
|
exit 1
|
|
fi
|
|
|
|
HAPY_NODE_SUPPORT=$(echo $(CreoleGet activer_multinode))
|
|
if [[ $HAPY_NODE_SUPPORT == "non" ]]
|
|
then
|
|
EchoRouge "Le mode multi-noeuds n'est pas activé dans l'interface de configuration du module"
|
|
exit 1
|
|
fi
|
|
|
|
HAPY_HA=$(CreoleGet activer_one_ha "non")
|
|
|
|
master=1
|
|
if [[ ${HAPY_HA} == "oui" ]]; then
|
|
idx=$(CreoleGet one_ha_server_index)
|
|
if [[ ${idx} != "0" ]]; then
|
|
EchoBleu "Mode HA: (on) Index : [${idx}]"
|
|
echo -e "\t$(basename ${0}) doit être lancé uniquement sur le leader (index 0)"
|
|
exit 0
|
|
else
|
|
master=0
|
|
fi
|
|
fi
|
|
|
|
declare -a HAPY_SLV=('')
|
|
ONEUSER=$(CreoleGet virt_user)
|
|
HAPY_SLV=$(echo $(CreoleGet one_nodes) | sed -e "s/\n/ /g")
|
|
DBMODE=$(CreoleGet one_database_type "none")
|
|
|
|
echo -e "\n"
|
|
EchoBleu "Vous allez inscrire un noeud dans une grappe Hâpy"
|
|
EchoBleu "Pour ce faire vous devez vous munir du mot de passe de l'utilisateur 'oneadmin' de chacun des noeuds"
|
|
Question_ouinon "Voulez-vous commencer ?" 'True' "oui"
|
|
if [[ $? -ne 0 ]]
|
|
then
|
|
EchoOrange "Abandon de l'enregistrement"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
for host in ${HAPY_SLV}; do
|
|
echo -e "\n"
|
|
EchoOrange "Traitement du noeud ${host}"
|
|
echo
|
|
EchoVert " * Gestion des clés SSH"
|
|
echo
|
|
copy_ssh_id ${host}
|
|
if [ $master = 0 ]; then
|
|
copy_files ${host}
|
|
fi
|
|
|
|
EchoVert " * Enregistrement du noeud"
|
|
register_node ${host}
|
|
if [[ ${HAPY_HA} == "oui" ]]
|
|
then
|
|
if [[ $DBMODE == "sqlite" ]]
|
|
then
|
|
if [[ $(CreoleGet one_ha_server_index) == "0" ]]
|
|
then
|
|
sync_db ${host}
|
|
fi
|
|
fi
|
|
fi
|
|
sync_nodes
|
|
if [[ ${HAPY_HA} != "oui" ]]
|
|
wait_node_ok ${HAPY_SLV[${i}]}
|
|
if [[ ${?} -ne 0 ]]
|
|
then
|
|
EchoRouge "Erreur lors de l'enregistrement du noeud ${HAPY_SLV[${i}]} !"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if [ $master = 0 ]; then
|
|
init_ha_leader
|
|
fi
|
|
echo -e "\n"
|
|
EchoVert "Enregistrement des noeuds terminé"
|