20.27 分发系统介绍
公司的网站本来已经建好了,当公司的业务越来l越大时候就会需要实时更新代码,由于后端服务器有很多台来跑web服务。此时为了快速更新代码就可以使用分发系统。其中开源的上线代码的软件有很多,git等等。这里我们使用shell来编写一个分发系统来上线代码。核心使用expect脚本语言,它可以实现远程执行命令,远程传输数据等操作
20.28 expect脚本远程登录
[root@localhost ~]# yum install -y expect[root@localhost ~]# cd /usr/local/sbin/[root@localhost sbin]# vim expect1.exp#!/usr/bin/expect#定义变量set host "192.168.32.102"set passwd "123456789"#执行命令spawn ssh root@$host#与远程机器交互,截取特定信息,发送变量,\r表示回车,interact表示继续交互不退出远程机器,expect eof表示停留远程机器上一会儿再退出expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "$passwd\r" }}interact
为了让远程登录时候出现提示,可以清空/root/.ssh/known_hosts
文件
20.29 expect脚本远程执行命令
[root@localhost sbin]# vim expect2.exp#!/usr/bin/expectset user "root"set host "192.168.32.102"set passwd "123456789"spawn ssh $user@$hostexpect {"yes/no" {send "yes\r";exp_continue}"password:" {send "$passwd\r"}}expect "]*"send "touch /tmp/test.aa\r"expect "]*"send "echo 111 >/tmp/test.aa\r"expect "]*"send "exit\r"
20.30 expect脚本传递参数
[root@localhost sbin]# vim expect3.exp#!/usr/bin/expect#[lindex $argv 0]表示要输入的第一个参数 如此类推set user [lindex $argv 0]set host [lindex $argv 1]set passwd "123456789"set cmd [lindex $argv 2]spawn ssh $user@$hostexpect {"yes/no" {send "yes\r"}"password:" {send "$passwd\r"}}expect "]*"send "$cmd\r"#set timeout -1#指定命令的超时时间 -1为永远expect "]*"send "exit\r"[root@localhost sbin]# ./expect3.exp root 192.168.32.102 "ls;w"
20.31 expect脚本同步文件
[root@localhost sbin]# vim expect4.exp#!/usr/bin/expectset passwd "123456789"spawn rsync -av root@192.168.32.102:/tmp/test.aa /tmp/expect {"yes/no" {send "yes\r"}"password:" {send "$passwd\r"}}expect eof
20.32 expect脚本指定host和要同步的文件
[root@localhost sbin]# vim expect5.exp#!/usr/bin/expectset passwd "123456789"set host [lindex $argv 0]set file [lindex $argv 1]spawn rsync -av $file root@$host:$fileexpect {"yes/no" {send "yes\r"}"password:" {send "$passwd\r"}}expect eof[root@localhost sbin]# ./expect5.exp 192.168.32.102 /tmp/test
20.33 构建文件分发系统
[root@localhost sbin]# vim rsync.exp#!/usr/bin/expectset passwd "123456789"set host [lindex $argv 0]set file [lindex $argv 1]#--file-from指定文件列表路径 -R表示同步时目标会级联创建目录spawn rsync -avR --files-from=$file / root@$host:/expect {"yes/no" {send "yes\r"}"password:" {send $passwd\r}}expect eof[root@localhost sbin]# vim /tmp/ip.list192.168.32.102192.168.32.103[root@localhost sbin]# vim /tmp/file.list/tmp/test/tmp/test.aa[root@localhost sbin]# vim rsync.sh#!/bin/bashfor i in `cat /tmp/ip.list`do ./rsync.exp $i /tmp/file.listdone[root@localhost sbin]# sh rsync.sh
20.34 批量远程执行命令
[root@localhost sbin]# vim exe.exp#!/usr/bin/expectset passwd "123456789"set host [lindex $argv 0]set cmd [lindex $argv 1]spawn ssh root@$hostexpect {"yes/no" {send "yes\r"}"password:" {send "$passwd\r"}}expect "]*"send "$cmd\r"expect "]*"send "exit\r"[root@localhost sbin]# vim exe.sh#!/bin/bashfor i in `cat /tmp/ip.list`do echo $i ./exe.exp $i "service nginx restart"done[root@localhost sbin]# sh exe.sh