#!/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 <> ~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") 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 master=1 if [ "$(CreoleGet activer_one_ha)" = "oui" ]; then if [ "$(CreoleGet one_ha_server_index)" != "0" ]; then exit 0 else master=0 fi 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} # wait_node_ok ${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 wait_node_ok ${HAPY_SLV[${i}]} if [[ ${?} -ne 0 ]] then EchoRouge "Erreur lors de l'enregistrement du noeud ${HAPY_SLV[${i}]} !" fi done if [ $master = 0 ]; then init_ha_leader fi echo -e "\n" EchoVert "Enregistrement des noeuds terminé"