關於自動化部署

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

本文不會討論這些問題。只涉及一個很簡單的場景:如何將應用部署到必定數量的機器,而後啓動它。好比你在上線前,須要壓力測試,須要評測性能,均可能須要人工的部署幾十臺機器。shell

若是純人工,那麼可能須要scp,或者wget,或者hadoop client,將應用下載到目標機器,而後解壓,而後啓動它。本文的目的就是腳本化上述操做。ssh


1. 最簡單

咱們知道,ssh能夠遠程執行一些命令ide

ssh hostname "command lines"

可能惟一的障礙就是須要輸入密碼。固然了你可能說能夠設置ssh免密碼登錄,那麼你至少要每臺機器操做一下吧,仍是沒有繞過輸入密碼。

使用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;..."

那設置ssh 密碼登錄來講,實際上就是先wget 中控機的id_rsa.pub, 而後加到目標機的authorized_keys便可。幾條命令的羅列。

若是你能夠經過上述命令解決你的問題,那麼恭喜你,不然,接着向下看吧。測試



2. 人工交互不可避免怎麼辦

有時候邏輯的確是複雜,有的應用仍是須要人工交互才能搞定。。。咱們須要徹底人工化,那麼使用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
}

第7行其實是一個模糊匹配的過程,若是當前的交互中出現password,那麼send 你的密碼過去,注意必定要以\r結尾。固然了若是是continue connecting,那麼首先發送yes,而後再發送密碼過去。使用exec sleep 1,能夠sleep 1 秒。

如今只是將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
}

固然了,要注意.ssh 的權限要設置爲700, .ssh/authorized_keys的權限是600;若是權限不對,系統是不會讓你免密碼登錄的。

最後給出一個通用的執行一個命令的函數吧:

exec_shell()
{
expect <<EOF
set timeout 100
spawn ssh $1
expect {
    "Last login" {
    send "$2\r"
    expect "*"
    send "exit\r"
    expect eof

    }
}
EOF
}
相關文章
相關標籤/搜索