关于自动化部署

简介:

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

本文不会讨论这些问题。只涉及一个很简单的场景:如何将应用部署到一定数量的机器,然后启动它。比如你在上线前,需要压力测试,需要评测性能,都可能需要人工的部署几十台机器。

如果纯人工,那么可能需要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不是默认安装的。

接下来的工作就很简单了,

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\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
}



目录
相关文章
|
7月前
|
jenkins Devops 机器人
【devops】九、Jenkins流水线(下)
【devops】九、Jenkins流水线(下)
|
jenkins Java Shell
jenkins实现持续集成、持续部署
想要利用jenkins实现持续集成、持续部署,首先我们先思考需要jenkins帮我们做些什么事情才能达到这个目的。首先开发人员提交了代码jenkins应该知道这个变动;其次jenkins知道代码变更后,想要拉取代码,此时要求jenkins服务器上也要有代码拉取的终端,比如git、gitee等;再其次拉取完代码后jenkins就需要打包这些代码成为jar包或者war包,这就需要maven、gradle等打包工具;再然后jenkins需要将这些jar包部署到目标服务器,那就需要相应的插件和脚本来部署这些jar或者war包。
454 1
jenkins实现持续集成、持续部署
|
2月前
|
运维 资源调度 数据安全/隐私保护
容器化运维镜像仓库和资源调度
【2月更文挑战第14天】容器运维平台的两个关键组成,镜像仓库和资源调度。
|
7月前
|
运维 Kubernetes jenkins
【Kubernetes测试生产环境整体部署及全链路测试、自动化运维平台Jenkins与Devops环境搭建】
【Kubernetes测试生产环境整体部署及全链路测试、自动化运维平台Jenkins与Devops环境搭建】
227 0
|
11月前
|
缓存 网络安全 持续交付
CircleCI 自动化部署 #68
CircleCI 自动化部署 #68
131 0
|
11月前
|
jenkins Java 持续交付
从0搭建属于自己的jenkins持续集成平台
Jenkins在日常工作中占据了一个非常重要的角色,帮助我们节省了大量用于构建的时间。有些公司有运维大哥对Jenkins进行维护,如果没有那只能自己动手了。俗话说的好自己动手丰衣足食,所以本文就从0开始搭建属于自己的Jenkins持续平台。主要包含,普通项目构建、流水线构建、多分支流水线构建并将构建结果辅以钉钉通知。
从0搭建属于自己的jenkins持续集成平台
|
前端开发 JavaScript Java
持续集成与部署(四):部署 前后端分离
持续集成与部署(四):部署 前后端分离
持续集成与部署(四):部署 前后端分离
|
存储 运维 Kubernetes
在k8s安装CICD-devtron
在k8s安装CICD-devtron
194 0
|
运维 前端开发 jenkins
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化
之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个实例,容错率低 如何去解决?
Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化
|
敏捷开发 Devops 持续交付
CICD
最初是瀑布模型,后来是敏捷开发,现在是DevOps,这是现代开发人员构建出色的产品的技术路线。随着DevOps的兴起,出现了持续集成(Continuous Integration)、持续交付(Continuous Delivery) 、持续部署(Continuous Deployment) 的新方法。传统的软件开发和交付方法正在迅速变得过时。从历史上看,在敏捷时代,大多数公司会每月,每季度,每两年甚至每年发布部署/发布软件。然而,现在,在DevOps时代,每周,每天,甚至每天多次是常态。当SaaS正在占领世界时,尤其如此,您可以轻松地动态更新应用程序,而无需强迫客户下载新组件。很多时候,他们甚