Last active
August 7, 2023 09:57
-
-
Save vimiix/22916e89c644c31277dc5757fb911ced to your computer and use it in GitHub Desktop.
Auto deploy a MogDB instance by PTK
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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