基于Ansible和CodeDeploy的DevOps解决方案

发布于 2020年10月15日

名词解释:

Ansible:由红帽Red Hat开源并主导的自动化运维工具,帮助运维实现IT自动化,降低人为操作错误,提高业务自动化率,提升运维工作效率。Ansible常用于软件部署自动化、配置自动化、管理自动化、软件平滑升级等。它拥有丰富的内置模块,并且有开放的API接口、完善的文档体系,以及活跃的社区。

CodeDeploy:是由公有云厂商AWS提出的应用部署规范,利用YAML格式,清晰的定义应用部署的全生命周期(从DownloadBundle开始到ValidateService结束)。AWS实现了基于CodeDeploy规范的公有云服务,即AWS CodeDeploy,提供给AWS客户使用。

DevOps:DevOps中的Dev指Development,Ops指的是Operations。DevOps的目标是打通开发运维的壁垒,实现开发运维一体化。这也就是说DevOps并不是某个系统或者某个工具,更不会等价于某些具体的名词(比如容器、Jenkins)。

图1 DevOps的目标是实现开发运维一体化

背景:DevOps为什么这么火?

毋庸置疑,DevOps已经成为近些年IT行业内最火爆的方向之一。众多企业也在积极的学习、实践并落地DevOps。本质上来讲,由于行业竞争激烈,软件正在不断地颠覆传统行业,有预测称21世纪所有企业都会是软件企业。

业务的快速迭代、变更,依赖于IT能力的变革与提升。DevOps是IT研发、部署、运维能力不断演进的阶段性结果,是新的开发模式、新的运维模式共同作用下,实现IT赋能业务增长、提升企业竞争力的有效手段。

基于Ansible和CodeDeploy的DevOps方案
图2 DevOps异常火爆,采纳率超过70%,且逐年上升

深入理解DevOps后,我们会发现DevOps涵盖了整个开发和运维的阶段,每个阶段的能力范围和复杂程度都不一样,所以落地DevOps也会涉及不同的工具和系统。

基于Ansible和CodeDeploy的DevOps方案
图3 DevOps涵盖从代码到上线运维的各个阶段

现实:企业在DevOps实践中常见的问题

DevOps早已不是一个新鲜的词汇了。因为它显而易见的优势,过去几年越来越多的企业都在引入DevOps,希望建立自己的DevOps体系与文化。而根据每家企业自身的特点,能够顺利地在较短的时间完成转型的公司又非常少,更多的企业在建设过程中多少都会遇到一些亟待解决的问题。我们总结出了DevOps实践过程中的三条主线,下面来一一分析每条主线下企业可能遇到的一些问题。

基于Ansible和CodeDeploy的DevOps方案
图4 DevOps(CI/CD)的三条主线

主线1:从代码到制品库

大多数客户实践DevOps的过程中已经可以实现从代码库(Git/SVN)到制品库(Nexus)的持续打包流水线,但是仍然还会存在一些经常被忽视的问题,例如:

■ 没有建立统一的打包规范;

■ 没有建立统一的制品库;

■ 不同环境(开发、测试、生产)的部署包是不一致的;

■ 部署时不经过制品库(紧急上线,或者临时变更)。

主线2:从制品库到可运行的服务

这一步是DevOps落地实践中挑战最大的,即如何快速地将开发人员提交的制品快速部署到相应环境。在这一过程中,常常遇到的问题包括:

■ 环境创建非常慢;

■ 手工SSH登录初始化服务器;

■ 无统一的应用部署工具;

■ 部署后没有全面的健康检查。

主线3:从开发环境到生产环境

■ 开发、测试、准生产、生产四种环境不健全,缺少某些环境;

■ 四种环境的创建方法不一样;

■ 四种环境的代码部署方法不一致(这常见于代码和配置没有分离,开发和生产是两个不同的包,部署方法肯定也不一样);

■ 没经过开发测试和准生产环境的验证,直接上线。

从上面的分析不难看出,企业在实践DevOps的过程中,围绕这三条主线或多或少都会遇到一些问题。DevOps的落地很难一蹴而就,企业需要针对上述分析,在一个稳定的框架下不断迭代,做到将“DevOps落地”持续DevOps化。

落地:FIT2CLOUD DevOps解决方案

FIT2CLOUD多云管理平台基于统一的框架,采用灵活的模块化组合来应对不同企业的不同诉求,追求模块级别的重用,逐步形成了以云管平台为核心的多元化解决方案体系。其中,基于FIT2CLOUD多云管理平台的“监控、自动化及DevOps解决方案”便是我们今天所讨论的重点。

基于Ansible和CodeDeploy的DevOps方案
图5 FIT2CLOUD DevOps解决方案全流程

如上图所示,FIT2CLOUD DevOps解决方案涵盖了整个流水线的规范和工具选择。从左至右,开发人员提交代码到仓库(Git/SVN),使用持续集成工具(开源Jenkins)拉取最新代码构建部署包,并上传到制品库(开源Nexus/Artifactory)进行保存。

在Jenkins Job构建的同时,FIT2CLOUD 多云管理平台提供的Jenkins插件会自动在多云管理平台对应的应用下注册一个新的版本。用户可以在多云管理平台进一步执行应用后续部署的相关动作,也可以在插件中设置部署操作的自动触发,以简化流程。

在应用的生命周期内,多云管理平台会对其持续进行各项指标的监控,并基于Grafana提供可视化图表。如果应用监控项超过预设指标,监控告警模块会发出相关告警信息。

运维人员在项目维护中,可以借助JumpServer开源堡垒机(jumpserver.org)访问应用所在机器的后台,进行一系列的运维管理工作。多云管理平台会自动将纳管的机器相关信息同步至JumpServer,并授权给管理人员。同时,该平台还和JumpServer对接了单点登录,用户可在多云管理平台中选择机器一键通过堡垒机登录机器后台,这种方式对于运维团队来说更为便捷与安全。

测试人员可以在Jenkins上使用MeterSphere开源持续测试平台(metersphere.io)所提供的插件将Job与测试用例做关联,通过Jenkins触发MeterSphere测试任务,以便在各个环境更新后第一时间执行预设的测试用例,从而保障系统的稳定与可靠。

在FIT2CLOUD DevOps解决方案中,核心的三个使用场景:

1. 在持续集成CI方面,多云管理平台实现与主流CI工具Jenkins的对接,进一步管理了Jenkins中的凭据、构建任务、视图等。结合多云管理平台自身的组织能力,对以上纳管内容进行权限再分配,实现对资源更加集中与规范的管理。

特别是,我们提供了用于对接多云管理平台的Jenkins插件,即在每次构建任务执行完成后,自动在多云管理平台创建新的应用版本,可以直接用于应用的部署。

基于Ansible和CodeDeploy的DevOps方案
图6 对接Jenkins 配置
基于Ansible和CodeDeploy的DevOps方案
图7 配置Jenkins Job

2. 在持续部署CD方面,FIT2CLOUD多云管理平台主要承担环境管理、制品仓库管理、代码部署引擎的职责。FIT2CLOUD多云管理平台从应用的角度对主机进行分组管理,并完成基础环境配置。该平台支持管理Nexus、Nexus3、阿里云OSS、AWS S3、Artifactory等多种制品库,主要用来存放需要部署的各个版本的应用部署包。

基于Ansible和CodeDeploy的DevOps方案
图8 环境管理、创建应用

持续部署CD中最重要的是代码部署引擎,即按照用户预先定义的事件脚本来实现自动化部署。FIT2CLOUD DevOps解决方案中的代码部署引擎,遵从于前文提到的AWS CodeDeploy部署规范。与之有所区别的是,此方案中的代码部署引擎适用于各种公有云、私有云,以及本地物理裸机环境。

基于Ansible和CodeDeploy的DevOps方案
图9 AWS CodeDepoly 部署规范

应用的打包内容除了应用程序代码外,只需要一个AppSpec.yml文件和一些用于处理安装中一个或多个事件的脚本文件。AppSpec.yml 脚本不仅定义了代码部署的路径,还指定了要在部署过程的各个阶段在每个实例上运行的脚本文件。

一般的部署事件有7个,如图9所示,以Install为中心,在安装部署包前后会自动且规范化地做一些譬如应用停止、依赖检查、依赖安装、部署后的验证等操作。企业可以根据情况按需选择,往往这些步骤只需要脚本化即可。

基于Ansible和CodeDeploy的DevOps方案
图10 FIT2CLOUD 多云管理平台应用部署流程

值得一提的是,上述代码部署引擎的实现,是通过开源自动化运维工具Ansible作为命令下发的组件。与其他一些自动化运维工具相比,Ansible是无客户端Agent的,底层通过SSH通信。因此,用户无需在客户机上安装或配置任何程序,就可以运行Ansible任务,这样减少了许多管理开销。

基于Ansible和CodeDeploy的DevOps方案
图11 Ansible 组件执行部署动作的输出日志

3. 在监控层面,FIT2CLOUD多云管理平台选用Prometheus作为集中的监控告警系统,通过在监控对象上安装部署各种Prometheus Exporter来采集不同维度的监控数据。监控告警中心会根据Exporter自动给监控对象进行归类,并且支持从业务系统维度对监控对象进行管理。

监控告警中心提供了灵活的自定义监控面板的功能,用户可以根据自己的需要自行分组和设置各自所需的监控图表。除此之外,监控告警中心还结合了Grafana的监控展示功能,天然支持所有Grafana的展示面板,给用户提供了更好的体验。

基于Ansible和CodeDeploy的DevOps方案
图12 Grafana监控面板

总体来看,FIT2CLOUD DevOps 解决方案体现了DevOps企业环境落地四个着力点:

首先,注重规范性的建设,尤其是基于AWS CodeDeploy的部署规范,在对项目现有代码及架构无侵入、无限制的前提下,有效保证了CD过程的高效性与可靠性;

其次,在工具的选择上,FIT2CLOUD多云管理平台集成了主流开源技术,例如Prometheus、Grafana、Ansible、Jenkins、Nexus等,并且在代码仓库、制品库等方面提供多种类型工具的支持;

第三,在流程约束方面,多云管理平台在代码到制品库、制品库到可运行的服务,以及开发环境到生产环境三条线路上都建立了完备的流程体系,并且这些体系在很多项目上都经过了时间的验证,可以很大程度地改善了企业DevOps流程混乱的问题。

最后,无论是什么样的企业,有着怎样的业务背景或需求,在建设DevOps系统的过程中,也需要同步建设DevOps企业文化。加强开发与运维部门之间的沟通与协作,让流程中各个角色的员工都参与其中,FIT2CLOUD飞致云会与各个客户一起持续地学习和改进。

基于Ansible和CodeDeploy的DevOps方案
图13 DevOps企业环境落地四个着力点

实践:某大型券商DevOps落地实践

和大多数想要建设DevOps体系的企业一样,该券商也想打破在传统部署方式下所面临的一些困境。在与FIT2CLOUD飞致云的合作中,该券商用户提出的DevOps建设目标包括:

1. 自助服务,操作可追溯。基于多云管理平台的多租户能力、规范的流程为使用者提供丰富的自服务操作,实现资源的自助申请、自动发放、DevOps自动化构建与部署。同时基于多云管理平台的记录能力,使各项操作有迹可循,管理员可以随时追溯。

2. DevOps全流程便捷操作。基于多云管理平台的集成能力,实现其对DevOps全流程的管理。应用人员在多云管理平台申请资源后,在资源生命周期内,可以继续在多云管理平台进行CI(持续构建)、CD(持续部署)的操作。由多云管理平台统一管理应用构建任务、应用版本,并且输出相关日志。

3. 建构灵活,方便友好支持周边系统。多云管理平台不仅局限于多云管理和DevOps,更希望在复杂且快速更迭的IT环境下它能够持续为企业带来更多的价值。尤其是能方便友好地支持周边系统,建立联系,为企业更好地赋能。

基于FIT2CLOUD多云管理平台,该券商设计并打造出符合自身发展需求的统一资源管理门户。同时,结合多云管理平台对Jenkins、Ansible的集成与支持,可以统一管理资源周期及DevOps周期,用户可以在多云管理平台完成从机器申请到应用部署的一系列操作。

1. 异构基础设施资源统一纳管与管理

通过多云管理平台对多种基础设施资源的友好支持,形成对异构IT资源的统一纳管。管理员可对租户设置相应配额,随时查看所有基础设施资源的使用情况。

2. 虚拟机生命周期及DevOps周期内自动化漏洞检测

该券商将多云管理平台与漏洞扫描平台对接。这样一来,多云管理平台纳管的机器无需再做额外的配置,即可在其生命周期内进行自动化漏洞扫描。另外,当用户在DevOps模块对机器进行了部署操作后,多云管理平台会自动化触发对该机器的扫描,如果有漏洞信息会及时形成报告推送给相关责任人。这也在一定程度上实现了DevOps一体化的安全防护。

3. 整合DevOps能力,形成资源与应用统一操作平台

基于该券商的业务需要,FIT2CLOUD多云管理平台在已有DevOps模块的基础上,进一步升级优化,达到用户可全流程使用该平台进行资源申请、Job构建、代码部署等操作的目标。

4. 灵活的模块化架构、规范的API为持续性对接周边系统夯实基础 

FIT2CLOUD多云管理平台采用模块化的设计及容器化的一键部署,当需要整合新的功能或者对接外部系统时,能够在不影响原有模块功能的前提下使用新模块进行设计和对接。新的模块可以一键安装在原有多云管理平台之上,并且可以随时对模块进行开关及卸载操作。

基于Ansible和CodeDeploy的DevOps方案
图14 某大型券商DevOps落地全景图
基于Ansible和CodeDeploy的DevOps方案
图15 某大型券商DevOps落地概览(部署分析界面)

编者注:本文作者卢杨为FIT2CLOUD飞致云南区高级项目经理。