eole-one-master/scripts/onehost_create_all
Philippe Caseiro 78a27b4fdd Ajout du support OpenNebula HA dans Hâpy
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)
2019-03-01 16:42:14 +01:00

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é"