對於大規模的集羣,相信都有一整套比較完善的自動化部署方案。自動化部署有不少問題值得思考,好比如何均衡的利用每一個節點的資源,保證整個集羣的負載打散;若是方便的加入新機器,如何在機器物理故障時下線它,而後將部署的任務遷移到其餘的備機,有點資源管理的意味了。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 }