在編寫流程部署文件時,大部分部署功能都應在腳本中實現,腳本先驗證部署通過后,再放到部署工具中使用。部署腳本在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. 問題與反饋