在编写流程部署文件时,大部分部署功能都应在脚本中实现,脚本先验证部署通过后,再放到部署工具中使用。部署脚本在linux中使用shell编写,windows中使用bat脚本编写。具体shell及bat的语法不在这里介绍(读者请自己学习)。下面是linux下安装mysql的脚本示例:
```shell
#!/bin/bash
#安装mysql
BASE_DIR=$(dirname $(pwd))
MYSQL_HOME=${BASE_DIR}/software/mariadb
COMMON_HOME=${BASE_DIR}/install/scripts/linux/common
db_password=$1
AUTO_RUN_FILE=${MYSQL_HOME}/support-files/mysql.server
AUTO_RUN_FILE_NAME=mysqld
#安装mysql的依赖包
if [[ $MYSQLDB_HAS_INSTALL != "y" ]];then
#1.安装依赖
yum install -y cmake gcc gcc-c++ ncurses ncurses-devel openssl openssl-devel perl
#2.创建mysql用户,查看是否有mysql用户,没有则创建
grep mysql /etc/passwd &>/dev/null
if [ "$?" -ne 0 ];then
useradd mysql
fi
#授权mysql用户的mysql目录权限
chown -R mysql:mysql ${MYSQL_HOME}
#3.创建数据库文件
echo -n "正在安装mysql数据库....."
cd ${MYSQL_HOME} && ./scripts/mysql_install_db --defaults-file=${MYSQL_HOME}/my.cnf &>/dev/null &
while true
do
ps -ef | grep -w mysql_install_db | grep -v "grep" &>/dev/null
if [ "$?" -ne 0 ];then
echo "[ok]"
break
else
echo -n "....."
sleep "0.5"
fi
done
#启动mysql
cd ${MYSQL_HOME} && ./bin/mysqld_safe --defaults-file=${MYSQL_HOME}/my.cnf &>/dev/null &
echo -n "正在启动mysql"
while true
do
if [ ! -e ${MYSQL_HOME}/var/mysqld.pid ];then
echo -n "........"
sleep "0.5"
else
break
fi
done
echo "[ok]"
#开机自启动
\cp -f ${MYSQL_HOME}/my.cnf /etc/my.cnf
bash ${COMMON_HOME}/set_auto_start.sh ${AUTO_RUN_FILE} ${AUTO_RUN_FILE_NAME}
# Update root passwd
CMD_MYSQL="${MYSQL_HOME}/bin/mysql -uroot -S ${MYSQL_HOME}/var/mysql.sock"
$CMD_MYSQL -e "use mysql; delete from mysql.user where user='';"
$CMD_MYSQL -e "use mysql; update user set password=password('${db_password}') where user='root'"
$CMD_MYSQL -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '${db_password}'";
$CMD_MYSQL -e "flush privileges;";
echo "安装mysql数据库完成"
#标记mysql数据库为已安装
export MYSQLDB_HAS_INSTALL=y
fi
```
由示例可见,一般执行脚本,都建议先定位到部署目录,然后基于部署目录设置相应的操作目录,额外的参数可通过xml流程配置中输入。其它的就是普通脚本编写了。脚本编写完成后,可统一放到scripts目录下,并按模块分目录,便于查找即可。
注意:
> * windows下bat脚本,使用`%~dp0`定位当前bat的目录。
> * linux下shell脚本,使用` $(pwd)`定位运行部署工具(deploy-tool.jar)的sh文件所在位置(即install目录)。因此获取部署目录,使用`$(dirname $(pwd))`即可。
> * linux下若使用sh文件A调用另外一个sh文件B,而sh文件B是使用`ps|grep|awk`获取进程号(以便进行kill操作),会有子Shell的(临时)进程的问题,导致获取的进程号不正确。需要对文件A与文件B进行子进程过滤。如可使用``PID=`ps aux|grep -v grep|grep -v A|grep -v B|awk '{print $2}'` ``。其中A及B是文件名。
- 关于部署工具
- 1. 使用场景
- 1.1 传统部署方式痛点
- 1.2 自动部署方式
- 2. 功能概览
- 2.1 部署工具面向的人员
- 2.2 部署工具功能
- 3. 部署工具运行流程
- 3.1 部署工具从制作到使用
- 3.2 部署工具目录结构
- 3.3 运行流程
- 3.4 配置文件概述
- 3.4.1 全局属性配置文件global_config
- 3.4.2 用户属性配置文件custom_config
- 3.4.3 其它属性配置文件
- 3.4.4 流程配置文件
- 3.4.5 占位符
- 4. 部署工具使用详解
- 4.1 流程配置文件简单示例
- 4.2 流程配置文件结构
- 4.2.1 首行及根元素
- 4.2.2 xml文件结构
- 4.2.3 properties/property元素
- 4.2.4 executions/group元素
- 4.2.5 execution元素
- 4.2.6 configuration元素
- 4.2.7 dependencies元素
- 4.2.8 sub-execution元素
- 4.2.9 commands元素
- 4.2.10 replace-files元素
- 4.2.11 datasourse/statements元素
- 4.2.12 args元素
- 4.3 流程配置文件功能示例
- 4.3.1 分析安装及卸载mariadb需要的模块
- 4.3.2 确定用户统一配置
- 4.3.3 编写流程配置文件
- 4.4 部署脚本编写
- 5. 完整db(mariadb及redis)部署示例
- 5.1 mariadb及redis部署结构分析
- 5.1.1 模块划分
- 5.1.2 部署环境包制作
- 5.1.3 项目实施人员使用流程
- 5.2 db部署包示例及脚本
- 5.3 部署环境升级
- 6. 问题与反馈