在分布式集群系统中,由于有很多的节点,如果手动的部署,将是一个很耗时的过程。
由于每个节点部署服务相同,第一想到的就是scp命令做批处理,不过有个问题,scp命令每次都是提示输入密码,正好expect工具可以处理命令交互的情况。
前面已经讲过如何将expect做成绿色工具了,将所有节点的主机地址写入一个hosts-list文件中,循环读取地址执行scp拷贝。
升级包和expect工具的目录结构如下:
$ tree -L 3.├── done.sh├── hosts-list└── tools├── bin│ ├── expect│ ├── libexpect5.45.so│ └── libtcl8.4.so├── lib│ └── tcl8.4└── sbin└── docker.sh5 directories, 6 files
其中done是启动脚本,tools里面是expect工具命令,docker是执行scp命令脚本,hosts-list是节点主机地址。
done启动脚本如下:
$ cat done.sh #!/bin/bashusrname=ubuntupasswd=ubuntusrc_dir=../xtrouterdst_dir=/home/$usrnameexpect_bin=./tools/bin/expectdocker_shl=./tools/sbin/docker.shhosts_file=hosts-listfor line in $(cat $hosts_file)doecho "=================> start update host:$line"$expect_bin $docker_shl $line $usrname $passwd $src_dir $dst_dirdoneecho "all host update success!"
docke执行scp命令脚本如下:
$ cat tools/sbin/docker.sh #!/usr/bin/expectset timeout -1set host [lindex $argv 0]set username [lindex $argv 1]set password [lindex $argv 2]set src_file [lindex $argv 3]set dest_file [lindex $argv 4]spawn scp -v -r $src_file $username@$host:$dest_fileexpect {"(yes/no)?"{send "yes\n"expect "*assword:" { send "$password\n"}}"*assword:"{send "$password\n"}}expect "100%"expect eof
需要注意的一点是要将上面的超时时间设置为最大值,否则使用默认30秒后命令中断。
hosts-list主机列表如下:
$ cat hosts-list 11.37.7.111.37.7.211.37.7.311.37.7.411.37.7.511.37.7.611.37.7.711.37.7.811.37.7.911.37.7.1011.37.7.1111.37.7.1211.37.7.1311.37.7.1411.37.7.1511.37.7.1611.37.7.1711.37.7.1811.37.7.1911.37.7.20