关于自动化部署

对于大规模的集群,相信都有一整套比较完善的自动化部署方案。自动化部署有不少问题值得思考,好比如何均衡的利用每一个节点的资源,保证整个集群的负载打散;若是方便的加入新机器,如何在机器物理故障时下线它,而后将部署的任务迁移到其余的备机,有点资源管理的意味了。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
}
相关文章
相关标签/搜索