shell自动化脚本发布

脚本发布代码

关于脚本发布代码部分,将这个代码流程拆分为两个部分: 简单脚本(远程主机上执行)和大型脚本(线上机器执行)

简单脚本编写

简单脚本从四个方面来学习:
1 命令罗列实现功能
2 固定内容变量实现
3 功能函数实现
4 远程执行命令

命令罗列

简单的命令罗列:
实例:
cd /data/codes
[ -f django.tar.gz ] && rm -f django.tar.gz
tar zcf django.tar.gz django
脚本编写完成后,进行测试: sed -i “s#1.1#1.2#” /data/codes/djangp/views.py
bash /data/scripts/tar_code.sh
查看压缩内容 : zcat django.tar.gz

固定内容变量化

脚本里面的书写的固定内容太多了,更改时候费劲,所以需要固定内容变量化
FILE=“django.tar.gz”
CODE_DIR=’/data/codes’
CODE_PRO=‘django’
cd ' ( C O D E D I R ) ′ [ − f " (CODE_DIR)' [ -f " (CODEDIR)[f"{FILE}" ] && rm -f “ F I L E " t a r z c f " {FILE}" tar zcf " FILE"tarzcf"{FILE}” “${CODE_PRO}”
脚本编写完成以后,进行测试
sed -i ‘s#1.2#1.3#’ /data/codes/django/views.py
bash /data/scripts/tar_codes.sh

脚本优化之功能函数化

FIKE=‘django.tar.gz’
CODE-DIR=’/data/codes’
CODE_PRO=‘django’
code_tar(){
cd ' C O D E D I R ′ [ − f " {CODE_DIR}' [ -f " CODEDIR[f"{FILE}" ] && rm -f “ F I L E " t a r z c f " {FILE}" tar zcf " FILE"tarzcf"{FILE}” “${CODE_PRO}”
}
code_tar
脚本编写完成后,进行测试: sed -i “s#1.2#1.3#” /data/codes/django/views.py
bash /data/scripts/tar_code.sh

远程执行

远程命令执行

格式 ssh 远程主机登录用户名@远程主机ip地址 “执行命令”
示例:
ssh [email protected] “ifconfig eth0”

远程执行脚本测试

远程更新内容: ssh [email protected] "sed -i /‘s#1.4#1.5#’ /data/codes/django/views.py "
远程查看脚本: ssh [email protected] “ls /data/scripts”
远程执行脚本 ssh [email protected] “/bin/bash /data/scripts/tar_code.sh”
远程检查更新效果: ssh [email protected] “zcat /data/codes/django.tar.gz”

大型脚本编写

编写大型脚本有一个流程:
一 脚本框架
二 命令填充
三 完善功能 : 完善功能有: 增加日志功能 增加锁文件功能 增加主函数逻辑 增加参数安全措施
为什么要使用脚本框架: 1 命令多 2 功能多 3 不好组合
方案是: 使用函数来体现

大型脚本之日志功能

增加日志功能 :
1 日志文件 /data/logs/deploy.log
2 日志格式 日期 时间 脚本名称 步骤
示例:
LOG_FILE=’/data/logs/deplpy.log’

增加日志功能

write_log(){
DATE= ( d a t e + T I M E = (date+%F) TIME= (date+TIME=(dare+%T)
buzhou=’ 1 ′ e c h o " 1' echo " 1echo"{DATE} ${TIME} 0 : 0: 0:{buzhou} " >> “${LOG_FILE}”
}

大型脚本之增加锁文件功能

需求: 同一时间段内,只允许有一个用户来执行这个脚本 如果脚本执行的时候,有人在执行,那么输出报错: 脚本 deploy.sh 正在运行,请稍后""""""""""""
设计:
1 锁文件 /tmp/deploy.pid
2 存在锁文件的时候, 需要创建锁文件
3 脚本执行的时候,需要创建锁文件
4 脚本执行结束的时候, 需要删除锁文件
知识点: 条件和结果:双分支if语句
文件表达式: -f file_name
验证表达式: {表达式}
创建和删除命令: touch rm -f
示例:
PID_FILE=’/tmp/deploy.pid
add_lock(){
echo “增加锁文件”
touch “KaTeX parse error: Expected 'EOF', got '}' at position 32: …te_log "增加锁文件" }̲ #删除锁文件功能 del_l…{PID_FILE}”
write_log “删除锁文件”
}
部署函数
deploy_pro(){
add_lock

del_lock
}

脚本流程知识点填充

需求: 如果我给脚本输入的参数是deploy,那么脚本才执行,否则的话,提示该脚本的使用帮助信息 然后退出

分析:
1 脚本传参,就需要在脚本内部进行调用参数
2 脚本的帮助信息
3 脚本内容就需要对传参的内容进行判断
知识点:
1 shell内置变量
2 帮助信息 : 简单函数定义和调用
3 内容判断: 多if语句或者case语句
方案:
1 脚本的传参
脚本执行: bash deploy.sh deploy
位置参数的调用: $1
2 脚本的帮助信息: 定义一个usage函数,然后调用
3 内容判断:
main函数体调用函数传参 :$1
在main函数中,结合case语句,对传入的参数进行匹配
如果传入参数内容是"deploy" 那么久执行代码部署流程
如果传入的参数内容不是"deploy",那么输出脚本帮助信息
if语句和case语句的结合 : if语句在外,case语句在内 case语句在外,if语句在内

输入参数安全优化

需求:对脚本传入的参数的数量进行判断,如果参数数量不对,提示脚本的使用方式,然后退出
分析:
1 脚本参数数量判断
2 条件判断: 数量对 ,那么执行主函数 数量不对,那么调用脚本帮助信息
知识点: 1 脚本参数数量判断 : shell 内置变量: $# 条件表达式: [ $# -eq 1]
2 条件判断: 双分支if语句
示例:
if [ $# -eq 1]
then
main $1
else
usage
fi

脚本调试功能

脚本调试分三种方式来介绍;
-n 检查脚本中的语法错误
-v 先显示脚本所有内容,然后执行脚本,结果输出,如果执行遇到错误,将错误输出

  • x 将执行的每一条命令和执行结果都打印出来
    示范: bash -n xxx.sh

脚本总结

简单脚本编写总结

1 手工执行的命令一定要可执行
2 命令简单罗列
3 固定的内容变量化
3 功能函数化

复杂脚本编写总结

1 手工执行的命令一定要可执行
2 根据发布流程编写脚本的框架
3 将手工执行的命令填充到对应的框架函数内部
4 增加日志功能,方便跟踪脚本历史执行记录
5 主函数中逻辑流程控制好
6 设计安全的方面: 增加锁文件,保证代码发布的过程中不受干扰,输入参数数量, 输入参数匹配 脚本帮助信息

7 调试脚本

注意事项

1 命令一定要保证能正常执行
2 成对的符号, 要成对写,避免丢失
3 函数调用: 写好函数后,一定要在主函数中调用
4 避免符号出现中文
5 命令变量的写法一定要规范
6 固定的内容一定要变量实现, 方便以后更改
7 日志的输出
8 脚本的传参和函数的传参要区别对待

你可能感兴趣的:(shell自动化脚本发布)