• 高级构架之自动化部署代码


      本脚本实现自动从git下载代码然后自动部署

      用户所有的web服务,都应该使用普通用户。所有web服务都不应该监听80端口,除了负载均衡

      新建www用户 

    useradd -u 1000 www
    

      切换至www用户

      部署机生成秘钥

     ssh-keygen -t rsa
    

      复制秘钥

     cat /home/www/.ssh/id_rsa.pub

      把内容复制到客户端的 ~.ssh/authorized_keys   (权限必须设置为600)

    chmod 600 .ssh/authorized_keys

      可以通过ssh ip 直接免密码登录

      自动部署脚本(本次试验部署机与客户端为同一台)

      deploy.sh

    #!/bin/bash
    #Node List
    NODE_LIST="10.13.74.222"
    GROUP_LIST="10.13.74.222"
    ROLLBACK_LIST="10.13.74.222"
    #Date/Time Veriables
    LOG_DATE='date "+%Y-%m-%d"'
    LOG_TIME='date "+%H-%M-%S"'
    
    CDATE=$(date "+%Y-%m-%d")
    CTIME=$(date "+%H-%M-%S")
    
    #Shell Env
    SHELL_NAME="deploy.sh"
    SHELL_DIR="/home/www"
    SHELL_LOG="${SHELL_DIR}/{SHELL_NAME}.log"
    
    #Code Env
    PRO_NAME="web-demo"
    CODE_DIR="/deploy/code/web-demo"
    CONFIG_DIR="/deploy/config/web-demo"
    TMP_DIR="/deploy/tmp"
    TAR_DIR="/deploy/tar"
    LOCK_FILE="/tmp/deploy.lock"
    
    usage() {
        echo $"Usage:$0 [deploy|rollback]"
    }
    
    writelog(){
        LOGINFO=$1
        echo "${CDATE} ${CTIME}: ${SHELL_NAME}: ${LOGINFO}" >> ${SHELL_LOG}
    }
    
    shell_lock(){
        touch ${LOCK_FILE}	
    }
    
    shell_unlock(){
        rm -f ${LOCK_FILE}
    }
    
    #切换至获取代码的目录通过git pull命令获取代码
    #git设置好,设置步骤不详述
    #获取代码以后拷贝至TMP目录
    code_get(){
        writelog "code_get";
        cd $CODE_DIR && git pull 
        cp -r ${CODE_DIR} ${TMP_DIR}  
        API_VER="123"
    }
    
    code_build(){
        echo code_build
    }
    
    #拷贝配置文件
    code_config () {
        writelog "code_config"
        /bin/cp -r ${CONFIG_DIR}/base/* ${TMP_DIR}/"${PRO_NAME}"
        PKG_NAME="${PRO_NAME}"_"${API_VER}"_"${CDATE}-${CTIME}"
        cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
    }
    
    #压缩
    code_tar(){
        writelog "code_tar"
        cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
        writelog "${PKG_NAME}.tar.gz"
    }
    
    #scp至目标机
    code_scp(){
        writelog "code_scp"
        for node in ${NODE_LIST};do
    	scp ${TMP_DIR}/${PKG_NAME}.tar.gz  $node:/opt/webroot
    	done
    }
    
    cluster_node_remove(){
        echo cluster_node_remove
        writelog "cluster_node_remove"
    }
    
    code_deploy() {
        for node in $NODE_LIST;do
        	ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
        done
        rm -rf /var/www/html && ln -s /opt/webroot/${PKG_NAME} /var/www/html
    }
    
    config_diff() {
        echo config_diff
    }
    
    code_test() {
        echo code_test
    }
    
    cluster_node_in(){
        echo cluster_node_in
    }
    
    rollback_fun() {
        for node in $ROLLBACK_LIST;do
          if [ -d /opt/webroot/$1 ];then
          ssh $node "rm -f /var/www/html && ln -s /opt/webroot/$1 /var/www/html"
          fi
        done
    }
    
    rollback() {
        case $1 in
    	list)
    	for node in $ROLLBACK_LIST;do
    	ssh $node 	"ls -l /opt/webroot/*.tar.gz"
    	done
    	;;
    	*)
    	rollback_fun $1
        esac
    }
    
    main() {
        if [ -f $LOCK_FILE ];then
        echo "Deploy is running" && exit;
        fi
        DEPLOY_METHOD=$1
        case $DEPLOY_METHOD in
        deploy)
    	shell_lock;
       	code_get;
    	code_build;
    	code_config;
    	code_tar;
    	code_scp;
    	cluster_node_remove;
    	code_deploy;
    	code_test;
    	cluster_node_in;
    	shell_unlock;
    	;;
        rollback)
    	shell_lock;
    	rollback;
    	shell_unlock;
    	;;
        *)
    	usage;
        esac
    }
    
    main $1
    [www@3181bf ~]$ cat deploy.sh 
    #!/bin/bash
    #Node List
    NODE_LIST="10.13.74.222"
    GROUP_LIST="10.13.74.222"
    ROLLBACK_LIST="10.13.74.222"
    #Date/Time Veriables
    LOG_DATE='date "+%Y-%m-%d"'
    LOG_TIME='date "+%H-%M-%S"'
    
    CDATE=$(date "+%Y-%m-%d")
    CTIME=$(date "+%H-%M-%S")
    
    #Shell Env
    SHELL_NAME="deploy.sh"
    SHELL_DIR="/home/www"
    SHELL_LOG="${SHELL_DIR}/{SHELL_NAME}.log"
    
    #Code Env
    PRO_NAME="web-demo"
    CODE_DIR="/deploy/code/web-demo"
    CONFIG_DIR="/deploy/config/web-demo"
    TMP_DIR="/deploy/tmp"
    TAR_DIR="/deploy/tar"
    LOCK_FILE="/tmp/deploy.lock"
    
    usage() {
        echo $"Usage:$0 [deploy|rollback]"
    }
    
    writelog(){
        LOGINFO=$1
        echo "${CDATE} ${CTIME}: ${SHELL_NAME}: ${LOGINFO}" >> ${SHELL_LOG}
    }
    
    shell_lock(){
        touch ${LOCK_FILE}	
    }
    
    shell_unlock(){
        rm -f ${LOCK_FILE}
    }
    
    #切换至获取代码的目录通过git pull命令获取代码
    #git设置好,设置步骤不详述
    #获取代码以后拷贝至TMP目录
    code_get(){
        writelog "code_get";
        cd $CODE_DIR && git pull 
        cp -r ${CODE_DIR} ${TMP_DIR}  
        API_VER="123"
    }
    
    code_build(){
        echo code_build
    }
    
    #拷贝配置文件
    code_config () {
        writelog "code_config"
        /bin/cp -r ${CONFIG_DIR}/base/* ${TMP_DIR}/"${PRO_NAME}"
        PKG_NAME="${PRO_NAME}"_"${API_VER}"_"${CDATE}-${CTIME}"
        cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
    }
    
    #压缩
    code_tar(){
        writelog "code_tar"
        cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
        writelog "${PKG_NAME}.tar.gz"
    }
    
    #scp至目标机
    code_scp(){
        writelog "code_scp"
        for node in ${NODE_LIST};do
    	scp ${TMP_DIR}/${PKG_NAME}.tar.gz  $node:/opt/webroot
    	done
    }
    
    cluster_node_remove(){
        echo cluster_node_remove
        writelog "cluster_node_remove"
    }
    
    code_deploy() {
        for node in $NODE_LIST;do
        	ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
        done
        rm -rf /var/www/html && ln -s /opt/webroot/${PKG_NAME} /var/www/html
    }
    
    config_diff() {
        echo config_diff
    }
    
    code_test() {
        echo code_test
    }
    
    cluster_node_in(){
        echo cluster_node_in
    }
    
    rollback_fun() {
        for node in $ROLLBACK_LIST;do
          if [ -d /opt/webroot/$1 ];then
          ssh $node "rm -f /var/www/html && ln -s /opt/webroot/$1 /var/www/html"
          fi
        done
    }
    
    rollback() {
        case $1 in
    	list)
    	for node in $ROLLBACK_LIST;do
    	ssh $node 	"ls -l /opt/webroot/*.tar.gz"
    	done
    	;;
    	*)
    	rollback_fun $1
        esac
    }
    
    main() {
        if [ -f $LOCK_FILE ];then
        echo "Deploy is running" && exit;
        fi
        DEPLOY_METHOD=$1
        case $DEPLOY_METHOD in
        deploy)
    	shell_lock;
       	code_get;
    	code_build;
    	code_config;
    	code_tar;
    	code_scp;
    	cluster_node_remove;
    	code_deploy;
    	code_test;
    	cluster_node_in;
    	shell_unlock;
    	;;
        rollback)
    	shell_lock;
    	rollback;
    	shell_unlock;
    	;;
        *)
    	usage;
        esac
    }
    
    main $1
    

      实现了自动化部署,未实现回滚,待完善

      

  • 相关阅读:
    假期第六周总结
    假期第五周周总结
    navicat 链接oracle时出现的各种问题
    oracle 12如何解锁账户锁定状态及修改忘记的密码
    假期第四周周总结
    假期第三周周总结
    idea中使用git【推送,拉取,分支合并,解决冲突】
    Git分支,合并,切换分支的使用
    Git使用
    SpringCloud服务降级案列
  • 原文地址:https://www.cnblogs.com/minseo/p/6938680.html
Copyright © 2020-2023  润新知