shell的参数和脚本流程改进

今天痛下决心,把事务的工作一定要使用平台来做,时间短,任务紧,之前的运维开发是铺了一个面,每个面都做一些相关的事情,所以工作整体看都有进展,但是最后没有一个专注的功能。

所以我就在想到底是怎么回事,我能不能专注一些,哪怕就实现一个简单的功能,把它做好做透,其他的功能是不是能够同样复制很多的思想。于是乎,上班后我开始整理自己的思路,一边问自己,一边回答,每个回答都对应两列,一个是需要做的改进(action),还有一个是这个action的预估时间。结果几分钟下来,我发现如果理想的情况下,我只需要2个小时就能搞定,这么一想,还是能接受的,于是对需要做的事情排了一个顺序,立马开干。

我的设计是使用运维平台连接中控服务器来级联触发远程操作,这样运维平台对所有环境的耦合性是最低的。

哪怕是最简陋的操作,也要咬着牙完成,于是大体是这样的流程,上午的时候有两个部署需求,下午有两个,第一个是在半调试状态下完成的,第二个开始做脚本的模块化整理,是一个半自动的过程,然后发现了一些问题,非常纠结的去修复历史部署问题,等到第三个需求的时候,明显好了许多,到了第四个,就可以一口气完成了,流程打通了,细节就可以打磨了。

于是我对有的脚本的逻辑进行改造,有一个很通用的需求,假设脚本是initdb.sh要调用这个脚本需要输入一系列的参数,比如有5个参数。

这个脚本里面有10个步骤,每个步骤都是使用function来实现的。如果要处理这5个参数,同时能够控制10个步骤的执行,比如第2步不执行,第3步执行。脚本中其实还是比较难以管理和实现的。

我设想了几种实现思路:

1)把10个步骤拆分成10个脚本,然后每个脚本都有自己的调用方式,独立控制

2)写一个配置脚本,比如main.sh然后在这个脚本里控制initdb.sh的执行情况

第二种看起来好一些,但是问题还是没有解决,因为参数怎么管理,10个步骤怎么处理还是得细化。

我的初步设想是5个参数,外带一个参数即可,前面五个参数和一个步骤的参数。

预期执行情况大体如下:

# sh a.sh x x x x x 'init1 init3 init2'

init1

init3

init2

即执行的时候是按照init1 init3 init2的方式执行的。

关键代码如下:

function init1(){

echo 'init1'

}

function init2(){

echo 'init2'

}

function init3(){

echo 'init3'

}

function initdb(){

arr=$1

for fun in ${arr[*]}; do

echo $i

case $fun in

init1)

echo "test init1"

init1

;;

init2)

echo "test init2"

init2

;;

init3)

echo "test init3"

init3

;;

*)

echo "out of scope"

esac

done

}

init_par=$1

actions=($init_par)

initdb "${actions[*]}"

执行结果如下:

[root@dev01 test]# sh a.sh 'init1 init3 init2'

test init1

init1

test init3

init3

test init2

init2

这里有个问题,那就是我们输入的操作步骤可能是无序的,但是执行的时候是希望按照顺序,比如步骤2是依赖于步骤1的,这个我们是明确的。如果要实现这样一个需求,就需要额外的一些补充,那就是排序功能,或者是前端传入的时候来控制更好。

没事,能者多劳,我们就先实现了。保证能正确的运行起来,于是代码又开始一通改动。

function init1(){

echo 'init1'

}

function init2(){

echo 'init2'

}

function init3(){

echo 'init3'

}

function initdb(){

arr=$1

complete_arr=(init3 init1 init2)

order_arr=()

for act_tmp in ${complete_arr[*]}; do

if [[ " ${arr[@]} " =~ " $act_tmp " ]];then

echo $act_tmp

order_arr[${#order_arr[@]}]=$act_tmp

echo order_arr[${#order_arr[@]}]

fi

done

for fun in ${order_arr[*]}; do

echo $i

case $fun in

init1)

echo "test init1"

init1

;;

init2)

echo "test init2"

init2

;;

init3)

echo "test init3"

init3

;;

*)

echo "out of scope"

esac

done

}

init_par=$1

actions=($init_par)

initdb "${actions[*]}"

假设正确的步骤我们改为了init3 init1 init2,传入参数为init1 init3 init2,如果能够转换,幸福感就大大提高了。

脚本的执行结果如下:

[root@dev01 test]# sh aa.sh 'init1 init3 init2'

init3

order_arr[1]

init1

order_arr[2]

init2

order_arr[3]

test init3

init3

test init1

init1

test init2

init2

可见是达到了预期的目标了,所以这个思路可以借鉴,在其他的地方也可以参考使用。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2018-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏搜云库

分布式和集群区别?什么是云计算平台?分布式的应用场景?

分布式是指将一个业务拆分不同的子业务,分布在不同的机器上执行,集群是指多台服务器集中在一起,实现同一业务,可以视为一台计算机,一个云计算平台,就是通过一套软件系...

2555
来自专栏IT技术精选文摘

如何实现系统的可扩展性和高可用性

概述 可扩展性,高可用性和性能 可扩展性,高可用性,性能和关键任务这些术语对不同组织或组织内的不同部门来说意味着不同的事情。它们经常被互换,造成混乱,导致管理...

77310
来自专栏EAWorld

DevOps平台中的自动化部署框架设计

本文目录: 一、背景 二、我们的需求是什么? 三、概念澄清 四、概念模型 五、总体设计 六、关键点设计 七、总结 一、背景 说到自动化部署,大家肯定都会想到一些...

5064
来自专栏Java职业技术分享

不懂高性能的负载均衡设计?没关系,架构师带你飞

在软件系统的架构设计中,对集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案。负载均衡本质上是用于将用户流量进行均衡减压的,因此在互联网的大流量项目中,...

912
来自专栏JAVA技术zhai

大话微服务架构的故障隔离及容错处理机制

8、限流器和负载开关(Rate Limiters and Load Shedders)

2132
来自专栏即时通讯技术

腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ、微信、淘宝。那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会...

1782
来自专栏沃趣科技

ASM 翻译系列第九弹:高级知识ASM Toolbox

原作者:Bane Radulovic 译者: 庄培培 审核: 魏兴华 DBGeeK社群联合出品 本篇文章主要介绍几个大家应该熟练掌握的ASM工具。 ...

3043

比较服务网格体系结构

如果你正在围绕微服务构建您的软件和团队,那么你应该正在寻找更快迭代和灵活扩展的方法。服务网格可以帮助你在保持(或增强)可见性和控制的同时实现这一点。在这篇博客中...

3526
来自专栏EAWorld

企业级API网关的设计

本文目录: 一、网关简介 二、网关的作用和价值 三、企业级API网关需要具备的条件 四、业界常用的API网关方案 五、如何设计一个好的企业级API网关产品 六、...

1K9
来自专栏wblearn

Web网站通知系统设计

写在前面: 通知系统是网站信息传播机制的重要的一部分,足够写一大章来说明。本文只梳理设计原则,后续相关内容会持续更新。 这里的通知包括但不限于公告、提醒或消息(...

8102

扫码关注云+社区