zoukankan      html  css  js  c++  java
  • 关于自己主动化部署

    对于大规模的集群,相信都有一整套比較完好的自己主动化部署方案。自己主动化部署有非常多问题值得思考。比方怎样均衡的利用每一个节点的资源,保证整个集群的负载打散;假设方便的增加新机器。怎样在机器物理故障时下线它,然后将部署的任务迁移到其它的备机。有点资源管理的意味了。

    本文不会讨论这些问题。仅仅涉及一个非常easy的场景:怎样将应用部署到一定数量的机器。然后启动它。比方你在上线前。须要压力測试,须要评測性能,都可能须要人工的部署几十台机器。

    假设纯人工,那么可能须要scp。或者wget,或者hadoop client。将应用下载到目标机器,然后解压,然后启动它。本文的目的就是脚本化上述操作。


    1. 最简单

    我们知道。ssh能够远程运行一些命令

    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不是默认安装的。

    接下来的工作就非常easy了,

    sshpass -p your_password ssh "command1; command2;..."

    那设置ssh 密码登陆来说,实际上就是先wget 中控机的id_rsa.pub, 然后加到目标机的authorized_keys就可以。几条命令的罗列。

    假设你能够通过上述命令解决你的问题,那么恭喜你,否则,接着向下看吧。



    2. 人工交互不可避免怎么办

    有时候逻辑的确是复杂,有的应用还是须要人工交互才干搞定。

    。我们须要全然人工化,那么使用expect能够满足你的要求。

    相信大家都熟悉awk,sed等一众非常实用的linux 命令。那么expect也是。以下以设置ssh密码登陆为例,解说expect的使用方法。

    uploadRsaKey()
    {
    expect <<EOF
    set timeout 20
    spawn scp /home/work/.ssh/id_rsa.pub $1:~
    expect {
        "password:" {
            send "your_password
    "
            expect eof
        }
        "*continue connecting*" {
            exec sleep 1
            send "yes
    "
            expect  "password:" {
            exec sleep 1
            send "your_password
    "
            expect eof
        }  
        }
    }
    EOF
    }

    第7行实际上是一个模糊匹配的过程。假设当前的交互中出现password,那么send 你的密码过去,注意一定要以 结尾。

    当然了假设是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
    "
           expect "*"
           send "cat id_rsa.pub >> .ssh/authorized_keys
    "
           expect "*"
           send "exit
    "
           expect eof
        }
    
        "Last login" {
        send "exit
    "
        expect eof
        }
    }
    EOF
    }

    当然了,要注意.ssh 的权限要设置为700, .ssh/authorized_keys的权限是600;假设权限不正确,系统是不会让你免密码登陆的。

    最后给出一个通用的运行一个命令的函数吧:

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



  • 相关阅读:
    python文件压缩示例(压缩当前目录)
    C#实现Socket聊天室
    使用微软企业库5.0进行WCF服务边界上的异常保护
    使用python的内置ctypes模块与c、c++写的dll进行交互
    Python使用tkinter库创建图形界面HelloWorld
    手动处理Team Foundation Server 2010 数据仓库和分析服务数据库
    Linux mmap
    iwconfig linux 命令行配置无线网卡
    Qt中文乱码,设置字符集
    Flex 宋体、黑体、楷体、仿宋字体样式
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5140355.html
Copyright © 2011-2022 走看看