天天看点

linux下使用expect+scp+shell实现分布式集群系统安装,升级,部署

在分布式集群系统中,由于有很多的节点,如果手动的部署,将是一个很耗时的过程。

由于每个节点部署服务相同,第一想到的就是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.sh

5 directories, 6 files      

其中done是启动脚本,tools里面是expect工具命令,docker是执行scp命令脚本,hosts-list是节点主机地址。

done启动脚本如下:

$ cat done.sh 
#!/bin/bash
usrname=ubuntu
passwd=ubuntu
src_dir=../xtrouter
dst_dir=/home/$usrname
expect_bin=./tools/bin/expect
docker_shl=./tools/sbin/docker.sh
hosts_file=hosts-list
for line in $(cat $hosts_file)
do
      echo "=================> start update host:$line"
      $expect_bin $docker_shl $line $usrname $passwd $src_dir $dst_dir
done

echo "all host update success!"      

docke执行scp命令脚本如下:

$ cat tools/sbin/docker.sh 
#!/usr/bin/expect
set timeout -1
set 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_file
expect {
"(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.1
11.37.7.2
11.37.7.3
11.37.7.4
11.37.7.5
11.37.7.6
11.37.7.7
11.37.7.8
11.37.7.9
11.37.7.10
11.37.7.11
11.37.7.12
11.37.7.13
11.37.7.14
11.37.7.15
11.37.7.16
11.37.7.17
11.37.7.18
11.37.7.19
11.37.7.20