对于大规模的集群,相信都有一整套比较完善的自动化部署方案。自动化部署有不少问题值得思考,好比如何均衡的利用每一个节点的资源,保证整个集群的负载打散;若是方便的加入新机器,如何在机器物理故障时下线它,而后将部署的任务迁移到其余的备机,有点资源管理的意味了。linux
本文不会讨论这些问题。只涉及一个很简单的场景:如何将应用部署到必定数量的机器,而后启动它。好比你在上线前,须要压力测试,须要评测性能,均可能须要人工的部署几十台机器。shell
若是纯人工,那么可能须要scp,或者wget,或者hadoop client,将应用下载到目标机器,而后解压,而后启动它。本文的目的就是脚本化上述操做。ssh
咱们知道,ssh能够远程执行一些命令ide
ssh hostname "command lines"
使用sshpass 能够解决输入密码的问题。函数
$ sshpass Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters -f filename Take password to use from file -d number Use number as file descriptor for getting password -p password Provide password as argument (security unwise) -e Password is passed as env-var "SSHPASS" With no parameters - password will be taken from stdin -h Show help (this screen) -V Print version information
sshpass不是默认安装的。oop
接下来的工做就很简单了,性能
sshpass -p your_password ssh "command1; command2;..."
若是你能够经过上述命令解决你的问题,那么恭喜你,不然,接着向下看吧。测试
有时候逻辑的确是复杂,有的应用仍是须要人工交互才能搞定。。。咱们须要彻底人工化,那么使用expect能够知足你的要求。this
相信你们都熟悉awk,sed等一众很是有用的linux 命令,那么expect也是。下面以设置ssh密码登录为例,讲解expect的用法。spa
uploadRsaKey() { expect <<EOF set timeout 20 spawn scp /home/work/.ssh/id_rsa.pub $1:~ expect { "password:" { send "your_password\r" expect eof } "*continue connecting*" { exec sleep 1 send "yes\r" expect "password:" { exec sleep 1 send "your_password\r" expect eof } } } EOF }
如今只是将key上传到额目标机器上了,那么如何install rsa key呢?
installRsaKey() { expect <<EOF set timeout 100 spawn ssh $1 expect { "password:" { send "your_password\r" expect "*" send "cat id_rsa.pub >> .ssh/authorized_keys\r" expect "*" send "exit\r" expect eof } "Last login" { send "exit\r" expect eof } } EOF }
最后给出一个通用的执行一个命令的函数吧:
exec_shell() { expect <<EOF set timeout 100 spawn ssh $1 expect { "Last login" { send "$2\r" expect "*" send "exit\r" expect eof } } EOF }