脚本健壮性是脚本设计考虑的重要因素。很多脚本编写时只考虑到一些正常执行路径,里面各种条件都满足的情况下,脚本能正常执行。条件不满足时,容易出错,导致故障
脚本设计应该是一个闭环,从开始执行到最终执行完成是可预期的。脚本依赖的条件,执行时会进行检测,不满足则抛异常,脚本执行的结果应该返回正确的状态,执行出错时有通知机制
Probius任务系统依靠命令或脚本来实现不同的操作,脚本是任务系统的核心之一,理论上任务系统不限制脚本的类型,可以是shell、python或者go等等,前提是脚本所要运行的主机上要有脚本的运行环境
脚本编写需要遵循以下基本的规范
脚本风格:在编写脚本时,应有良好的系统化和结构化的风格,增加脚本的美观以及可读性。可参考Google脚本风格指南
USAGE函数:脚本需要包含USAGE函数,告知脚本使用方法,应包含输入、输出、功能、外部依赖、环境变量等,便于用户使用
用户检查:当脚本只能在特定用户下执行时务必加上用户检查
绝对路径:脚本中推荐使用绝对路径,如必须在特定目录下执行,则脚本中应先切换到该目录下
重复执行:脚本设计时,尽量设计成可重复执行,并确保重复执行的结果是幂等
单例执行:如果脚本同时只能执行一次,应通过文件锁或进程检查等方式进行校验
异常处理:脚本执行出错,应抛出错误,同时设置正确退出值,0为正常,非0为异常,任务系统会根据退出值来判断脚本执行结果,Ansible、Jenkins、Rundeck等也是同样的设计
日志记录:编写脚本的过程中应添加日志,例如执行步骤、错误信息等,方便追踪执行过程及排错
根据对之前脚本执行失败问题的汇总分析,以下问题需要特别注意
脚本开头需要添加脚本的使用方法,使用方法需明确脚本是否接收参数,对于一些有参数的脚本,需在使用方法中描述参数的含义,同时需要判断传入的参数数量是否一致,一个好的使用方法编写如下
if [ $# != 3 ];then
echo "USAGE: $0 PROJ ENVT TAG"
exit 1
fi
使用方法应位于脚本开头位置
当需要在特定文件夹下进行操作时,需要先检查文件夹是否存在,若不存在请提前创建,例如
if [ ! -d /tmp/ops-coffee/ ];then
mkdir /tmp/ops-coffee/
fi
cd /tmp/ops-coffee/ &&\
echo "tmp file." > dena.txt
脚本是由若干命令组成的,脚本编写时应确保每一条命令都符合预期,在脚本中推荐使用&&
和||
运算符
ps -ef | grep java | grep -v grep | wc -l &&\
echo 0 ||\
echo 1
在命令执行完成后,会根据命令的返回状态也就是$?
的值来判断命令是否执行成功,当$?
为0
时表示执行成功,否则表示执行失败,如果是执行的脚本时,需要在脚本最后明确脚本返回状态,shell脚本可以在脚本执行成功时通过exit指定退出状态,例如
ls /ops-coffee.cn &&\
exit 0 ||\
exit 1
而对于python脚本则可以借助sys.exit
这样写
import sys
if 'www' in 'ops-coffee.cn':
sys.exit(0)
else:
sys.exit(1)
其他语言类似