分发系统介绍

大多数企业都会有这样的需求,业务稍微大一点,它都会去做一些负载均衡,也意味着你的机器有多台,至少得两台,两台的话,你的程序是分别放在了两台机器上或者是多台机器上;假如说要添加一个新的功能,或者说你的程序有一个小bug,那这个时候你如果想这个bug修复,或者说新增一个功能的话,你要去改程序,那很多企业有svn,它是一个代码管理仓库,那我们如果把程序修改了之后呢,先传一份到svn库里边去;如果再智能自动化一点,我可以从咱们服务器上或者测试机上把svn库里的代码直接拽过来,发布到咱们的测试机上,然后再从测试机上呢,测试完成之后没问题了,我再把这些代码呢再拉到咱们线上的服务器上。当然,有的公司没有那么复杂,它可能直接从svn库里面把代码直接拉到咱们线上的服务器上,但是,你拉的时候呢,实际上只拉了一台机器,假如说你负载均衡有三台,那你这三台其中一台更新了,另外两台还没有更新,那怎么办呢?那这个时候你得想办法把代码从这台更新的机器上分发到另外两台机器上去,那分发的话,可以手动去拷贝,用rsycn;当然,也可以从svn里边直接拉过去,这个操作的话可能会复杂一点,一两台机器无所谓,但你机器多了的话,你每台机器都得去操作一下,不好,效率比较低,所以我们想了一种办法:就是在你这一台测试机上或者是这一台生产机器上,你去搞一个脚本,那这个脚本的目的呢,就是把这些新的代码或者说所有的代码同时给它同步到另外的机器上去,一键同步,那咱们这个脚本的目的呢就是为了同步;另外可能还有一种,我同步完成之后呢,我还要去在那台机器上去执行一条命令,那比如我涉及到一个服务,我脚本或者说咱们这个apache、ngix配置文件我更新了,我更新了一台测试没问题了,那另外其他几台,我也要更新一下,那这个时候我更新的时候,我也是通过咱们这个脚本分发,直接分发给其他的机器,因为它们的脚本的配置都是一模一样的,那你分发完成之后呢,是不是就意味着你的服务要重启或者重新reload,怎么办?我就需要去在远程的机器上去执行一些命令,那这个时候,我也需要同时去执行,批量执行,一台一台的登录太麻烦了,很浪费时间,那我也可能通过这个脚本去实现,那今天要讲的就是怎样去实现程序或者配置文件的同步以及命令的远程执行,那么在这涉及到一个概念,叫做expect。

expect脚本远程登录

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第1张图片

安装expect

[root@100xuni1 ~]# yum install -y expect

安装完成后写expect的脚本,自动远程登录一台机器,并执行命令

[root@100xuni1 sbin]# vim 1.expect
写入一下内容:
#! /usr/bin/expect
set host "192.168.63.101"
set passwd "hanshuo"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}
interact

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第2张图片

加个执行权限

[root@100xuni1 sbin]# chmod a+x 1.expect

测试这个脚本

[root@100xuni1 sbin]# ./1.expect

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第3张图片

expect脚本远程执行命令

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第4张图片

不仅仅远程登录,我还要执行一条命令,最后在退出来

[root@100xuni1 sbin]# vim 2.expect           ##编辑脚本
写入下列内容:
#!/usr/bin/expect
set user "root"
set passwd "hanshuo"
spawn ssh [email protected]

expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*"
send "touch /tmp/12.txt\r"
expect "]*"
send "echo 1212 > /tmp/12.txt\r"
expect "]*"
send "exit\r"

加个执行权限

[root@100xuni1 sbin]# chmod a+x 2.expect

测试这个脚本

[root@100xuni1 sbin]# ./2.expect

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第5张图片

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第6张图片

expect脚本传递参数

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第7张图片

expect是可以传递参数的就像shell的$1$2一样

[root@100xuni1 sbin]# vim 3.expect    ##编辑expect
写入以下内容:
#!/usr/bin/expect

set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "hanshuo"
set cm [lindex $argv 2]
spawn ssh $user@$host

expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第8张图片

加个执行权限

[root@100xuni1 sbin]# chmod a+x 3.expect

测试这个脚本

[root@100xuni1 sbin]# ./3.expect root 192.168.63.101 ls

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第9张图片

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数

分发系统介绍、 expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数_第10张图片