案例二十、自动化运维-代码上线
admin
2023-02-03 01:00:03
0

在案例十六中已经介绍过expect脚本的使用,可以远程登录机器并执行命令,其实expect脚本也可以传输文件。本案例的需求就是通过expect脚本来同步文件,从而实现代码上线。生产环境中一个业务通常跑在多台服务器上,也就是负载均衡,所以这些机器上运行的代码必须要保持一致。怎么实现一致?有两种方案。

1、通过共享的方式

如果机器量不多,可以使用NFS实现,如果要求稳定性最好是使用专业的存储设备(NAS、SAN等),这种方式架构如下:

案例二十、自动化运维-代码上线

这种架构的优点是方便维护,比如有代码更新时,只需要更新一台机器上的代码,则其他机器上都会跟着更新。缺点是,机器量大的话,共享存储会成为瓶颈,甚至由于对文件的争抢造成性能问题。还有一点,共享存储这里是一个很大的单点隐患,不出故障一切都OK,一旦出故障,则整个业务都挂掉,影响非常大。

2、分布式

既然通过共享的方式有不少缺点,那么就选择另外一种方式,即把代码存到每一台web服务器的本地磁盘上,如图所示:

案例二十、自动化运维-代码上线

这样做的好处是,没有存储性能问题,没有资源争抢冲突,也没有单点故障的隐患。缺点是,每次代码更新需要对所有web服务器就行更新,比较繁琐。虽然步骤繁琐,但大多数企业都会选择该方式。本案例的背景就是第二种方式,具体要求如下:

1)提供一个所有web服务器的IP列表ip.list。

2)假设所有web服务器上有一个普通用户user01,密码为SGs2ox6uj,该用户为同步代码的用户。

3)每次代码上线会提供一个文件列表file.list(即要更改的文件列表)。


知识点一:rsync同步文件通过文件列表

rsync这个同步文件的工具虽然在前面案例出现过,但通过一个文件列表来同步文件并不常见,先看示例:

# cat 1.txt 
/tmp/123/1.sh
/root/test/a.txt
/etc/passwd

# rsync -av --files-from=./1.txt  /  root@192.168.93.130:/

说明:1.txt为一个文件列表,即要同步的文件列表;rsync的--files-from选项指定要同步文件的列表文件(1.txt的路径,可以是绝对路径,也可以是相对路径),这个文件列表内容其实就是一堆文件路径,这个路径建议用绝对路径,不然会出错;如果文件列表中的文件路径为绝对路径,则rsync的源目录必须为/,目标目录也必须为/。


知识点二:expect脚本同步文件

跟远程执行命令类似,expect脚本要想同步文件,spawn后面的shell命令不再是ssh,而是rsync,示例:

#!/usr/bin/expect
set passwd "SGs2ox6uj"
set host "192.168.93.130"
spawn rsync -a  user01@$host:/tmp/test.txt /tmp/
expect {
    "yes/no" {send "yes\r"}
    "password:" {send "$passwd\r"}
}
expect eof

也可以传递参数给expect脚本,示例:
#!/usr/bin/expect
set passwd "SGs2ox6uj"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -a --files-from=$file  / user01@$host:/
expect {
    "yes/no" {send "yes\r"}
    "password:" {send "$passwd\r"}
}
expect eof


本案例参考脚本

#/bin/bash
##代码上线
##作者:
##日期:

#提醒用户,是否更新了要上线的代码列表文件
read -p "你是否已经更新了文件列表./file.list?确认请输入y或者Y,否则按其他任意键退出脚本。" c

#如果直接按回车,也会退出脚本
if [ -z "$c" ]
then
    exit 1
fi

if [ $c == "y" -o $c == "Y" ]
then
    echo "脚本将在2秒后,继续执行。"
    #每秒输出一个.共输出两个.
    for i in 1 2
    do
        echo -n "."
        sleep 1
    done
    echo
else
    exit 1
fi

#判断有无./rsync.exp文件
[ -f ./rsync.exp ] && rm -f ./rsync.exp

#定义rsync.exp
cat >./rsync.exp <

说明:要想在生产环境中使用该脚本,需要先提前创建一个user01用户,并且保证user01用户对web服务器上代码所在目录有写权限。


上一篇:Centos7下yum安装mongodb

下一篇:linux-5week

相关内容

热门资讯

阿联酋航空发文致歉 7月23日,阿联酋航空发布致歉信:原计划于7月22日从迪拜飞往上海的阿联酋航空EK302航班,因恶劣...
给“南海仲裁案”递刀子的美国人... 执笔/李小飞刀7月12日晚,菲律宾内格罗斯东方省锡布兰镇的一处公寓内,突然响起一阵枪声,美国海洋生物...
特朗普称沙特加入《亚伯拉罕协议... △美国总统特朗普(资料图)当地时间7月23日,美国总统特朗普在社交媒体“真实社交”上发文表示,美国能...
硬核首发+增购订单!成都企业上... 7月22日,2026国际低空经济博览会在上海开幕,来自成都的沃飞长空集中发布三大重磅成果:全新AE2...
国际观察:中拉人工智能合作持续... 张冰倩 为进一步支持全球人工智能发展、推进全球人工智能能力建设,未来5年,中国将面向发展中国家提供5...
共商汽车产业全球合作新路径 G... 当前,汽车产业正加速向绿色化、智能化、国际化、融合化发展,汽车供应链受到大国竞争与地缘政治冲突扰动。...
内蒙古耕种收综合机械化率达91... 7月22日,记者从2026年中国农机推广田间日活动上获悉,内蒙古农作物耕种收综合机械化率达到91%,...
华为黄健:在算力、存力和运力三... 7月17日至20日,以“智能伙伴,共创未来”为主题的2026世界人工智能大会(WAIC)暨人工智能全...
苹果、谷歌都没留住月之暗面创始... 英国《金融时报》7月23日刊发评论《为什么美国正在失去中国人工智能明星?》,文章谈到,月之暗面(Mo...
陪伴大家十几年的充电宝,大概要... 要说这两年最尴尬的数码配件,托尼觉得充电宝绝对算一个。 以前它的对手还都是同行 —— 大家一起卷容量...