新增一主一备自动化安装脚本

This commit is contained in:
xue_weijing 2021-03-08 11:03:16 +08:00
parent 24869756b4
commit 9505f8d137
2 changed files with 433 additions and 0 deletions

View File

@ -0,0 +1,400 @@
#!/bin/bash
if [ `id -u` -ne 0 ];then
echo "only a user with the root permission can run this script."
exit 1
fi
declare -r SCRIPT_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
declare -r SCRIPT_NAME=$0
echo "SCRIPT_PATH : ${SCRIPT_PATH}"
declare PACKAGE_PATH=`dirname ${SCRIPT_PATH}`
declare USER_NAME=""
declare HOST_IPS=""
declare HOST_IPS_ARR=""
declare HOST_IPS_ARRAY=""
declare HOST_NAMES=""
declare HOST_NAMES_ARRAY=
declare USER_GROUP="dbgrp"
declare PORT="20050"
declare XML_DIR=${SCRIPT_PATH}/one_master_one_slave_template.xml
declare INSTALL_PATH=""
declare SYSTEM_ARCH=""
declare SYSTEM_NAME=""
declare PASSWORD=""
function print_help()
{
echo "Usage: $0 [OPTION]
-?|--help show help information
-U|--user_name cluster user
-h|--host_ip intranet ip address of the host in the backend storage network(host1,host2)
-G|--user_grp group of the cluster user(default value dbgrp)
-p|--port database server port(default value 20050)
-D|--install_location installation directory of the openGauss program(default value ~/cluser)
-X|--xml_location cluster xml configuration file path
"
}
function die()
{
echo -e "\033[31merror:\033[0m $1"
exit 1
}
function warn()
{
echo -e "\033[33mwarnning:\033[0m $1"
sleep 2s
}
function info()
{
echo -e "\033[32minfo:\033[0m $1"
}
function expect_ssh()
{
/usr/bin/expect <<-EOF
set timeout -1
spawn $1
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*assword:" { send "$2\r"; exp_continue }
"*$3*" { exit }
}
expect eof
EOF
if [ $? == 0 ]
then
return 0
else
return 1
fi
}
function expect_hostname()
{
expect <<EOF > expectFile
set timeout -1
spawn $1
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*assword:" {send "$2\r"; exp_continue}
}
EOF
if [ $? == 0 ]
then
return 0
else
return 1
fi
}
function main()
{
while [ $# -gt 0 ]
do
case "$1" in
-h|--help)
print_help
exit 1
;;
-U|--user_name)
if [ "$2"X = X ]
then
die "no cluster user values"
fi
USER_NAME=$2
shift 2
;;
-G|--user_grp)
if [ "$2"X = X ]
then
die "no group values"
fi
USER_GROUP=$2
shift 2
;;
-H|--host_ip)
if [ "$2"X = X ]
then
die "no intranet ip address of the host values"
fi
HOST_IPS=$2
shift 2
HOST_IPS_ARR=${HOST_IPS//,/ }
HOST_IPS_ARRAY=(${HOST_IPS_ARR})
if [ ${#HOST_IPS_ARRAY[*]} != 2 ]
then
die "the current script can be installed only on two nodes, one active node and one standby node"
fi
;;
-X|--xml_location)
if [ "$2"X = X ]
then
die "no cluster xml configuration file values"
fi
XML_DIR=$2
shift 2
;;
-D|--install_location)
if [ "$2"X = X ]
then
die "no installation directory of the openGauss program values"
fi
INSTALL_PATH=$2
shift 2
;;
-p|--port)
if [ "$2"X = X ]
then
die "the port number cannot be empty."
fi
PORT=$2
shift 2
;;
-P|--password)
if [ "$2"X = X ]
then
die "the password cannot be empty."
fi
PASSWORD=$2
shift 2
;;
*)
echo "Internal Error: option processing error" 1>&2
echo "please input right paramtenter, the following command may help you"
echo "sh active_standby_nodes_install.sh --help or sh active_standby_nodes_install.sh -h"
exit 1
esac
done
if [ "${USER_NAME}"X == X ]
then
die "no cluster user values"
fi
if [ -z ${INSTALL_PATH} ]
then
INSTALL_PATH="/home/${USER_NAME}"
fi
if [ "${PASSWORD}"X == X ]
then
echo "please enter the password of the root user&the password of a common user(the two passwords must be the same)"
echo -n "password:"
read PASSWORD
while [ -z ${PASSWORD} ]
do
echo "the value cannot be null, please enter the password again"
echo -n "password:"
read PASSWORD
done
fi
if [ "${HOST_IPS}"X == X ]
then
die "no intranet ip address values"
else
len=${#HOST_IPS_ARRAY[*]}
index=0
while [ ${index} -lt ${len} ]
do
expect_hostname "ssh ${HOST_IPS_ARRAY[${index}]} hostname" ${PASSWORD}
if [ $? == 0 ]
then
expectResult=`tail -1 expectFile|head -1| tr -d "\r"| tr -d "\n"`
if [ -z ${expectResult} ]
then
die "failed to obtain the hostname based on the ip address of ${HOST_IPS_ARRAY[${index}]}."
fi
HOST_NAMES_ARRAY[${index}]=${expectResult}
else
die "failed to obtain the hostname based on the ip address of ${HOST_IPS_ARRAY[${index}]}."
fi
index=$[ ${index} + 1 ]
done
fi
rm -rf expectFile
HOST_NAMES="${HOST_NAMES_ARRAY[0]},${HOST_NAMES_ARRAY[1]}"
SYSTEM_ARCH=`uname -p`
SYSTEM_NAME=`cat /etc/*-release | grep '^ID=".*'|awk -F "[=\"]" '{print $3}'`
if [ "${SYSTEM_NAME}" == "openEuler" ] && [ "${SYSTEM_ARCH}" == "aarch64" ]
then
info "the current system environment is openEuler + arm"
elif [ "${SYSTEM_NAME}" == "openEuler" ] && [ "${SYSTEM_ARCH}" == "x86_64" ]
then
info "the current system environment is openEuler + x86"
elif [ "${SYSTEM_NAME}" == "centos" ] && [ "${SYSTEM_ARCH}" == "x86_64" ]
then
info "the current system environment is CentOS + x86"
elif [ "${SYSTEM_NAME}" == "redhat" ] && [ "${SYSTEM_ARCH}" == "x86_64" ]
then
info "the current system environment is redhat + x86"
elif [ "${SYSTEM_NAME}" == "redhat" ] && [ "${SYSTEM_ARCH}" == "aarch64" ]
then
info "the current system environment is redhat + arm"
elif [ "${SYSTEM_NAME}" == "kylin" ] && [ "${SYSTEM_ARCH}" == "x86_64" ]
then
info "the current system environment is kylin + x86"
elif [ "${SYSTEM_NAME}" == "kylin" ] && [ "${SYSTEM_ARCH}" == "aarch64" ]
then
info "the current system environment is kylin + arm"
else
warn "the current system environment is ${SYSTEM_NAME} + ${SYSTEM_ARCH}, \
you are advised to use the centos, openEuler, redhat, or kylin system. because OpenGauss may not adapt to the current system."
fi
info "installation parameter verification completed."
}
function checks()
{
system_arch=`uname -p`
system_name=`cat /etc/*-release | grep '^ID=".*'|awk -F "[=\"]" '{print $3}'`
if [ ${system_arch} != "$8" -o ${system_name} != "$9" ]
then
warn "inconsistency between the system and the execution machine"
fi
egrep "^$3" /etc/group >& /dev/null
if [ $? != 0 ];then
groupadd $3
fi
egrep "^$4" /etc/passwd >& /dev/null
if [ $? != 0 ];then
useradd -g $3 -d /home/$4 -m -s /bin/bash $4 2>/dev/null
if [ $? != 0 ]
then
die "failed to create the user on the node $2."
fi
expect_ssh "passwd $4" "$5" "passwd:"
if [ $? != 0 ]
then
die "an error occurred when setting the user password on the node $2"
fi
fi
sed -i "s/SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config && firewall-cmd --permanent --add-port="$6/tcp" && firewall-cmd --reload
if [ $? != 0 ]
then
warn "some errors occur during system environment setting on host $2"
fi
INSTALL_PATH=$7
if [ ! -e ${INSTALL_PATH} ]
then
mkdir -p ${INSTALL_PATH}
else
rm -rf ${INSTALL_PATH}/*
fi
chmod -R 755 ${INSTALL_PATH}/
chown -R $4:$3 ${INSTALL_PATH}/
if [ -f /${10} ]
then
mv /${10} $(eval echo ~$4)/
fi
echo "check end"
}
function pre_checks()
{
if [ ${#HOST_IPS_ARRAY[*]} == 0 ]
then
die "the number of internal IP addresses of the host is incorrect."
fi
localips=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
for ip in ${HOST_IPS_ARRAY[@]}
do
info "start to check the installation environment of host ${ip}."
sleep 2s
# standby node
if [[ $localips != *${ip}* ]]
then
sshcmd="scp ${SCRIPT_PATH}/${SCRIPT_NAME} root@${ip}:/"
expect_ssh "${sshcmd}" "${PASSWORD}" "100%"
if [ $? != 0 ]
then
die "an error occurred when copying the script to the target host ${ip}."
fi
sshcmd="ssh ${ip} \"sh /${SCRIPT_NAME} inner ${ip} ${USER_GROUP} ${USER_NAME} ${PASSWORD} ${PORT} ${INSTALL_PATH} ${SYSTEM_ARCH} ${SYSTEM_NAME} ${SCRIPT_NAME}\""
expect_ssh "${sshcmd}" "${PASSWORD}" "check end"
if [ $? != 0 ]
then
die "an error occurred during the pre-installation check on the target host ${ip}."
fi
else
# local
checks "" ${ip} ${USER_GROUP} ${USER_NAME} ${PASSWORD} ${PORT} ${INSTALL_PATH} ${SYSTEM_ARCH} ${SYSTEM_NAME} ${SCRIPT_NAME}
if [ $? != 0 ]
then
die "an error occurred during the pre-installation check on the target host ${ip}."
fi
fi
info "succeeded in checking the installation environment of host ${ip}."
done
return 0
}
function xmlconfig()
{
info "start to automatically configure the installation file."
install_localtion=${INSTALL_PATH//\//\\\/}
if [ -e ${XML_DIR} ]
then
sed 's/@{nodeNames}/'${HOST_NAMES}'/g' ${XML_DIR} |
sed 's/@{backIpls}/'${HOST_IPS}'/g' |
sed 's/@{clusterName}/'${USER_NAME}'/g' |
sed 's/@{port}/'${PORT}'/g' |
sed 's/@{installPath}/'${install_localtion}'/g' |
sed 's/@{nodeName1}/'${HOST_NAMES_ARRAY[0]}'/g' |
sed 's/@{backIp1}/'${HOST_IPS_ARRAY[0]}'/g' |
sed 's/@{nodeName2}/'${HOST_NAMES_ARRAY[1]}'/g' |
sed 's/@{backIp2}/'${HOST_IPS_ARRAY[1]}'/g' > $(eval echo ~${USER_NAME})/one_master_one_slave.xml
else
die "cannot find one_master_one_slave_template.xml in ${XML_DIR}"
fi
cat $(eval echo ~${USER_NAME})/one_master_one_slave.xml
info "the installation file is automatically configured"
return 0
}
function install()
{
info "preparing for preinstallation"
home_path=$(eval echo ~${USER_NAME})
export LD_LIBRARY_PATH="${PACKAGE_PATH}/script/gspylib/clib:"$LD_LIBRARY_PATH
sshcmd="python3 "${PACKAGE_PATH}"/script/gs_preinstall -U "${USER_NAME}" \
-G "${USER_GROUP}" -X "${home_path}"/one_master_one_slave.xml --sep-env-file="${home_path}"/env_master_slave"
info "cmd \"${sshcmd}\""
expect_ssh "${sshcmd}" "${PASSWORD}" "Preinstallation succeeded"
if [ $? != 0 ]
then
die "preinstall failed."
fi
info "preinstallation succeeded."
chmod 755 ${home_path}'/one_master_one_slave.xml'
chown ${USER_NAME}:${USER_GROUP} ${home_path}'/one_master_one_slave.xml'
info "start the installation."
su - ${USER_NAME} -c"source ${home_path}/env_master_slave;gs_install -X ${home_path}/one_master_one_slave.xml;gs_om -t status --detail"
if [ $? -ne 0 ]
then
die "install failed."
else
info "install success."
fi
exit 0
}
if [ $1 == "inner" ]
then
checks $@
else
main $@
pre_checks
xmlconfig
install
fi
exit 0

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<CLUSTER>
<PARAM name="clusterName" value="@{clusterName}"/>
<PARAM name="nodeNames" value="@{nodeNames}"/>
<PARAM name="gaussdbAppPath" value="@{installPath}/app"/>
<PARAM name="gaussdbLogPath" value="@{installPath}/gaussdb_log" />
<PARAM name="tmpMppdbPath" value="@{installPath}/tmp"/>
<PARAM name="gaussdbToolPath" value="@{installPath}/tool"/>
<PARAM name="corePath" value="@{installPath}/core"/>
<PARAM name="backIp1s" value="@{backIpls}"/>
<PARAM name="clusterType" value="single-inst"/>
</CLUSTER>
<DEVICELIST>
<DEVICE sn="@{nodeName1}">
<PARAM name="name" value="@{nodeName1}"/>
<PARAM name="backIp1" value="@{backIp1}"/>
<PARAM name="sshIp1" value="@{backIp1}"/>
<PARAM name="azName" value="AZ1"/>
<PARAM name="azPriority" value="1"/>
<PARAM name="dataNum" value="1"/>
<PARAM name="dataPortBase" value="@{port}"/>
<PARAM name="dataNode1" value="@{installPath}data/dn1,@{nodeName2},@{installPath}/data/dn1"/>
</DEVICE>
<DEVICE sn="@{nodeName2}">
<PARAM name="name" value="@{nodeName2}"/>
<PARAM name="backIp1" value="@{backIp2}"/>
<PARAM name="sshIp1" value="@{backIp2}"/>
<PARAM name="azName" value="AZ1"/>
<PARAM name="azPriority" value="1"/>
</DEVICE>
</DEVICELIST>
</ROOT>