无论是应用运维,还是数据库运维,均可以分为“人肉”-“自动化”-“智能化”阶段,其中自动化阶段,主要是将一些人做的操作,尤其是一些重复性操作,封装为程序,一方面避免重复性操作,另一方面提高执行效率。自动化实现的过程中,经常使用的,可能就是shell脚本了,前段时间,从一个微信公众号,学习了赵班长写的一篇小文,循序渐进的方式,介绍了shell运维脚本的编写,小脚本有大智慧,几十行代码,夹杂着系统设计、代码规范等细节,值得学习。
脚本一:记录日志的shell脚本,shell_template_1.sh
#!/bin/bash
SHELL_NAME="shell_template_1.sh"
SHELL_DIR="/home/oracle/scripts/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
shell_log() {
LOG_INFO=$1
echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}
shell_log "shell beginning, write log test"
shell_log "sehll success, write log test"
负责打印日志的函数,shell_log(),接受第一个参数,作为需要打印的日志内容,shell_log()中定义了日志输出的格式(年-月-日 时-分-秒 : 脚本名称 : 日志内容),日志文件路径,则由$SHELL_LOG变量定义。
执行shell_template_1.sh,生成日志文件shell_template_1.sh.log,
vi shell_template_1.sh.log
2017-10-11 11-34-39 : shell_template_1.sh : shell beginning, write log test
2017-10-11 11-34-39 : shell_template_1.sh : sehll success, write log test
脚本二:直接执行的脚本很危险,要提示用户如何使用脚本,shell_template_2.sh
vi shell_template_2.sh.log
2017-10-11 11-35-37 : shell_template_2.sh : mysql backup start
2017-10-11 11-35-37 : shell_template_2.sh : mysql backup stop
脚本三:避免多人同时执行脚本,需要增加锁机制,shell_template_3.sh
vi shell_template_3.sh.log
2017-10-11 11-42-03 : shell_template_3.sh : mysql backup start --用户A记录
2017-10-11 11-42-08 : shell_template_3.sh : shell_template.sh is running --用户B记录
2017-10-11 11-42-13 : shell_template_3.sh : mysql backup stop --用户A记录
如果再做规范些,可以加上注释,
######################################################
# $Name: shell_template.sh
# $Version: v1.0
# $Function: Backup MySQL Databaes Template Script
# $Author: Bisal
# $Create Date: 2017-10-11
# $Description: shell
######################################################
总结:
通过以上三个脚本,经历了“日志记录输出” -> “增加脚本执行的方法说明,并通过传递参数,避免直接执行脚本的风险” -> “利用文件锁,增加了锁机制,避免多人同时执行脚本,带来的可能风险”,这三个阶段,再加上注释,逐步完善,我们可以从中,汲取一些经验,
1. 编写shell经常是面向过程的,但用函数封装,可以让脚本清晰可读。
2. 通过文件锁机制,可以控制并发,其实这还有优化空间,有些场景应该允许用户并发,例如可以通过临时文件写入、合并操作的方法,实现用户并发。
3. 标准常量定义、清晰的注释、函数和变量大小写用法,细节中可以看出严谨,即使只有几行,也能体现出,一名优秀工程师的素质。
虽然离这些目标还有距离,但通过这些优秀的脚本,吸取经验,增长见识,我们会朝着目标前进,兄弟们加油!