Skip to content

Instantly share code, notes, and snippets.

@vimiix
Last active August 7, 2023 09:57
Show Gist options
  • Save vimiix/22916e89c644c31277dc5757fb911ced to your computer and use it in GitHub Desktop.
Save vimiix/22916e89c644c31277dc5757fb911ced to your computer and use it in GitHub Desktop.
Auto deploy a MogDB instance by PTK
#!/bin/bash
# Author: vimiix
# Email : i@vimiix.com
set -euo pipefail
# Parameters
CLUSTER_NAME="mogdb"
HOST_NAME="127.0.0.1" # ip of target host
USER_NAME="omm" # username for running db, default is 'omm'
USER_PASSWD="" # user password
PORT=26000 # db listen port
INSTALL_PATH="/home/omm/mogdb/app" # dir path used to install the db application
DN_PATH="/home/omm/mogdb/data" # dir path used to store db data
DB_USER="test" # test db user
DB_PASSWD="MogDB@enmo" # test db user's password
DB_NAME="testdb" # db name for testing
SSH_USERNAME="root" # ssh user name
SSH_PASSWORD="" # ssh user password
DB_VERSION="3.0.0" # MogDB version
DB_PACKAGE="" # MogDB package path
# global variables
IS_LOCALHOST=false
PTK="ptk"
CONFIG_YML=".ptk.config.yml"
function cleanup() {
if [ -f $CONFIG_YML ]; then
rm -f $CONFIG_YML
fi
}
trap cleanup SIGINT SIGTERM SIGQUIT SIGHUP
function help() {
cat << EOF
Auto deploy a MogDB instance by PTK
===========================================
[Arguments]
--hostname string [optional] IP of target host (default: $HOST_NAME)
--username string [optional] Username for running db (default: $USER_NAME)
--userpasswd string [optional] User password
--port int [optional] DB listen port (default: $PORT)
--install_path string [optional] Dir path used to install db app, auto create if not exist (default: $INSTALL_PATH)
--dn_path string [optional] Dir path used to store db data, auto create if not exist (default: $DN_PATH)
--dbuser string [optional] Test db user (default: $DB_USER)
--dbpasswd string [optional] Test db user's password (default: $DB_PASSWD)
--dbname string [optional] Database name for testing (default: $DB_NAME)
--cluster_name string [optional] Custom cluster name (default: $CLUSTER_NAME)
--ssh_user string [optional] SSH user name, REQUIRED if host is not local host (default: $SSH_USERNAME)
--ssh_pass string [optional] SSH user password, REQUIRED if host is not local host
--db_version string [optional] Target version of MogDB (default: $DB_VERSION)
--db_package string [optional] Package path of MogDB for installing offline
-h, --help [optional] Print help messages
EOF
}
function err() {
local err_msg=$1
echo -e "\033[31mERROR: $err_msg\033[0m"
echo
help
exit 1
}
function warn() {
local msg=$1
ts=`date +"%FT%T"`
echo -e "\033[33m$ts [WARN] $msg\033[0m"
}
function _log() {
local msg=$1
ts=`date +"%FT%T"`
echo -e "$ts [INFO] $msg"
}
function log() {
local msg=$1
_log " $msg"
}
function step() {
local msg=$1
_log "+ $msg"
}
function install_ptk() {
if ptk 1> /dev/null 2>&1; then
log "PTK already installed"
else
log "Not found ptk, try to install it"
curl --proto "=https" --tlsv1.2 -sSf https://cdn-mogdb.enmotech.com/ptk/install.sh | sh
PTK="$HOME/.ptk/bin/ptk"
fi
}
function precheck_user() {
local_ips=$(ip addr | grep 'inet' | grep -v 'inet6' | grep -v grep | awk -F '/' '{print $1}' | awk '{print $2}')
for ip in $local_ips; do
if [ "$ip" == "$HOST_NAME" ]; then
IS_LOCALHOST=true
if [ $(whoami) != "root" ]; then
err "You should run this script with root for installing db on localhost"
fi
fi
done
log "Install on localhost: $IS_LOCALHOST"
}
function prepare_config() {
local userpass=""
if [ "X$USER_PASSWD" != "X" ]; then
userpass=`$PTK encrypt "$USER_PASSWD" | awk '{print $NF}'`
fi
local dbpass=`$PTK encrypt "$DB_PASSWD" | awk '{print $NF}'`
local sshpass=""
if [ "X$SSH_PASSWORD" != "X" ]; then
sshpass=`$PTK encrypt "$SSH_PASSWORD" | awk '{print $NF}'`
fi
cat > $CONFIG_YML << EOF
global:
cluster_name: $CLUSTER_NAME
user: $USER_NAME
user_password: $userpass
base_dir: $INSTALL_PATH
data_dir: $DN_PATH
db_password: $dbpass
db_servers:
- host: $HOST_NAME
db_port: $PORT
ssh_option:
user: $SSH_USERNAME
password: $sshpass
EOF
log "Temporary file $CONFIG_YML generated"
}
function check_os() {
rm -f root_fix_os*
$PTK checkos -f $CONFIG_YML
if [ ! -f root_fix_os* ]; then
return
fi
fix_script=`ls -t root_fix_os* | head -1`
log "Try to fix os with $fix_script"
$PTK exec -f $CONFIG_YML -s $fix_script
rm -f $fix_script
log "Recheck OS again"
$PTK checkos -f $CONFIG_YML
if [ -f root_fix_os* ]; then
err "OS still have abnormal items after run fix sctipt, you should fix them manually first"
fi
}
function install_cluster() {
local opts="--skip-check-os -y"
if [ "$DB_PACKAGE" != "" ]; then
opts="$opts -p $DB_PACKAGE"
else
opts="$opts --db-version $DB_VERSION"
fi
log "PTK install options: $opts"
$PTK install $opts -f $CONFIG_YML
}
function create_db_and_user() {
local tmpsh=.tmp.create_db_and_user.sh
cat > $tmpsh << EOF
gsql << SQLEOF
CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWD';
ALTER USER $DB_USER SYSADMIN;
CREATE DATABASE $DB_NAME;
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
SQLEOF
EOF
$PTK cluster -n $CLUSTER_NAME shell -i 6001 -s $tmpsh
rm -f $tmpsh
}
function deploy() {
step "Precheck user"
precheck_user
step "Check PTK"
install_ptk
step "Prepare config file"
prepare_config
step "Check OS"
check_os
step "Install cluster"
install_cluster
step "Create test database ($DB_NAME) and user ($DB_USER)"
create_db_and_user
log "Clear temporary config file"
rm -f $CONFIG_YML
step "Deploy successfully"
}
function _require_value(){
if [ $# -le 1 ] || [ $2 == "--"* ]; then
err "--$1 require a value"
fi
}
function validate_ip()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
while [ $# -gt 0 ]; do
case $1 in
"-h" | "--help")
help
exit 0
;;
"--hostname")
shift
_require_value "hostname" $@
if validate_ip $1; then
HOST_NAME=$1
else
err "Invalid host ip: $1"
fi
;;
"--username")
shift
_require_value "username" $@
USER_NAME=$1
;;
"--userpasswd")
shift
_require_value "userpasswd" $@
USER_PASSWD=$1
;;
"--port")
shift
_require_value "port" $@
if [[ $1 -lt 65535 && $1 -gt 1024 ]] 2>/dev/null; then
PORT=$1
else
err "Invalid port value: $1"
fi
;;
"--install_path")
shift
_require_value "install_path" $@
INSTALL_PATH=$1
;;
"--dn_path")
shift
_require_value "dn_path" $@
DN_PATH=$1
;;
"--dbuser")
shift
_require_value "dbuser" $@
DB_USER=$1
;;
"--dbpasswd")
shift
_require_value "dbpasswd" $@
DB_PASSWD=$1
;;
"--dbname")
shift
_require_value "dbname" $@
DB_NAME=$1
;;
"--cluster_name")
shift
_require_value "cluster_name" $@
CLUSTER_NAME=$1
;;
"--ssh_user")
shift
_require_value "ssh_user" $@
SSH_USERNAME=$1
;;
"--ssh_pass")
shift
_require_value "ssh_pass" $@
SSH_PASSWORD=$1
;;
"--db_version")
shift
_require_value "db_version" $@
DB_VERSION=$1
;;
"--db_package")
shift
_require_value "db_package" $@
DB_PACKAGE=$1
;;
*)
err "Invalid option $1"
;;
esac
shift $(($#>0?1:0))
done
deploy
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment