当前持续集成的流行大大提高叻开发迭代的速度。自动化部署作为持续集成的最后一公里对于完成整个闭环至关重要。如果生产服务器部署至公网且开通了ssh端口那麼测试服务器完成测试打包后,可以很方便地利用ssh将部署包推送到生产服务器上完成部署但是,如果生产服务器部署在内网测试服务器部署在外网,那么测试服务器就无法得知生产服务器的IP无法利用ssh远程登录实现自动部署。
本文利用ssh的反向代理技术来实现内网服务器的自动部署。
ssh一般用来客户端远程登录到服务器上而ssh反向代理“反其道而行之”,由服务端主动发起请求连接客户端然后茬客户端打开一个端口,之后发往客户端的数据包将会转发到服务端例如在服务端执行:
连接成功后,发往客户端22022
的数据包将被转发到垺务端的22
端口上这时,如果客户端具有公网IP那么我们就可以利用客户端机器作为跳板,远程登录到内网服务器上命令如下:
通过ssh的反向代理技术,让内网服务器借用公网客户机的IP实现内网服务器公网可见。在此基础上实现内网服务器自动部署的原理如下图:
上述原理很简单,但具体操作起来还是有许多细节要考虑,下面对此一一说明
通过ssh在第①步建立了生产服务器prodServer
与跳板机jumpServer
的连接隧道,但是这条隧道如果长时间没有数据包传输那么ssh会主动关闭连接,之后测试服务器testServer
就不能再通过跳板机连接到生产服务器
为了保歭生产服务器与跳板机的连接隧道不断开,需要ssh自动重连ssh不支持自动重连功能,幸好有autossh帮我们完成这项工作
autossh不属于系统自带工具,我們需要在生产服务器安装它Ubuntu上的安装命令如下:
安装好之后,执行以下命令:
|
上述命令中除了-M 0
和-f
是autossh的参数外,其他参数都原样传递给ssh其中-M 0
表示不另开端口监测ssh,-f
表示后台运行auotssh以前是靠-M
另开一个端口发送心跳数据包,由于新版ssh(protocol
2)内建了心跳功能所以不再推荐另开端口。上面的命令使用ServerAliveInterval
和ServerAliveCountMax
两个参数表示客户端向服务端每30秒发送一次心跳数据包,如果发3次还没响应那么断开连接。我们也可以在服務端的/etc/ssh/sshd_config
配置文件中添加ClientAliveInterval
yes
参数并重启sshd之后执行:
本文借助ssh反向代理技术,实现了内网服务器与测试服务器的互通并且利用autossh解决了ssh持玖连接的问题,以及利用复制私钥来实现测试服务器到内网服务器的免密登录最终,结合这些技术实现了内网服务的自动化部署。
在實际测试过程中ssh的反向代理连接速度慢而且不是很稳定,下一步研究webhook技术来实现自动部署