Terraform/Ansible on Cloud–基础设施和应用管理实践

摘要:随着云计算、大数据、AI智能等前沿科技的发展,传统的研发速度,越来越难满足企业快速发展的需求。研发效能也成了继商业模式、技术突破之后的另一核心竞争力。在由阿里云研发协同RDC以及阿里云云栖社区联合举办的首届阿里巴巴研发效能嘉年华上,来自阿里云飞天八部企业服务云应用服务团队的高级研发工程师箫竹为大家分享了基础设施和应用管理实践,主要介绍了Terraform和Ansible两大自动化基础设施和应用管理工具,并结合实际应用场景介绍了如何在云上使用Terraform和Ansible工具提升基础设施和应用管理的效能。
直播视频请点击

以下内容根据演讲嘉宾现场视频以及PPT整理而成

本次分享的主题将主要围绕以下四个方面:

  • 什么是 IaC
  • Terraform和Ansible介绍
  • Terraform和Ansible的对比与结合
  • 操作演示

本次分享首先会通过具体的应用场景来向大家解释什么是基础设施即代码(IaC),第二个部分会着重介绍一些如何基于Terraform和Ansible实现对于基础设施和应用的有效管理,接下来会着重分析Terraform和Ansible这两个工具之间的差别以及它们是如何进行结合的,在分享的最后会通过两个具体的示例来向大家展示如何基于Terraform和Ansible这两个工具有效地部署应用。

一、什么是IaC
应用场景1
某应用1,为了增大吞吐率,需要对其做一个流量均衡处理,以扩大并发数、缩短延迟,所以需要使用一个负载均衡和ECS的组合,其架构如下图所示,一个负载均衡,下面挂载两台ECS。

ef8d146a3f78e234ce023a10d8af0d50bfacc6fa

应用场景1的具体实现步骤:首先会去新建一个SLB,然后在这个SLB下面创建两台ECS,同时为这两个ECS设定一个安全组,并且为这个安全组指定规则配置,然后将这两个ECS挂载到SLB下面,添加为其后端服务器,并为SLB配置监听端口,配置会话保持,并添加健康检查。以上的工作最少需要8个步骤。

172e9cc82b837feca5d815f70af2700f5e7633bf

应用场景2
某应用2,需要隔离的网络环境,这时就需要将应用搭建在VPC网络内,其架构如下图所示,在一个VPC下面有两台交换机,每个交换机下面有一个负载均衡单元。

163af56900eb327000f31f2e5487f0ad05fc7375

应用场景2的具体实现步骤:首先去创建一个VPC,然后在VPC下面创建两台VSwitch交换机,并为这两台交换机配置相应的NAT网关,然后为NAT网关新建共享带宽包,接着在每个交换机下各自创建两台ECS,并将ECS添加到SLB下面,最后为其中的一个VSwitch创建一个SNAT网关,进而为其实现一个端口转发。以上的工作的总体流程最少需要7个步骤。

01437ac0928615e3709a87b57a0566b660f0960a

应用场景3
随着业务的调整和业务量的增大,需要增加更多的节点或者集群以承载更大的并发和访问量,此时最简单的方法就是在已有架构的基础之上对已有的资源单元进行扩容。如下图所示,这里是对于应用场景2的扩容,需要在VPC下面新建一个交换机单元,此时的实现步骤就是首先在VPC下面新建一台交换机,然后在交换机下面新建一个SLB和两台ECS,然后将这个交换机和原来的NAT网关进行连接。

edfc208bcf145107f560c537fa47ab86d7281d5a

应用场景4
随着应用种类的增加,ECS、SLB等资源的数目也在增加,那么这时候应用就希望通过“打标签”的方式实现对于资源和应用的有效区分。通常情况下的做法是手工去为这些资源进行打标签,然后将这些应用和资源进行分组。

f63fb3252ee32aecaa368cae564571e27a5b61e3

应用场景5
随着应用的不断迭代,应用部署和发布的成本也在增加,那么如何实现多个应用的快速部署和发布呢?

2f6f10cd7b31e7e85685d14be39dfa67ebf9db7a

以上所有的场景都有一些共性:
操作流程和基本配置都是固定的,基本都是通过手工操作实现的

  • 手工操作效率低、 时间长
  • 手工操作时可能导致错误
  • 手工操作过程没有历史记录
  • 手工操作过程不能实现有效审计(不知道是谁做了什么样的操作)
  • 手工操作成本随着业务的复杂而不断增大

那么如何去解决这些场景所面临的一些难题呢?这时候就不得不使用自动化去进行处理。正如下图中所说的,我们可以将以上场景中这个相对固定的操作以及配置以代码的形式写入到模板里面,然后利用一些自动化的工具,比如Terraform和Ansible去读取这些模板,并将这些模板转化成为我们的资源,然后在转化成为资源之后,再利用一些应用的部署模板实现将应用快速地部署到生成出来的资源上,这也就是基础设施即代码。

3b141bf486d13c5e1b7550cf204f26db3453fdee

那么如何按照上述的思路解决场景3和场景5中遇到的难题呢?首先对于场景3的扩容问题,对已有的架构而言,首先需要去定义架构中已有的所有的资源,比如对于VPC而言,需要使用代码的形式将VPC定义到模板里面,同样的VSwitch也需要使用代码的形式定义到模板里面,所有的资源都要以一个相对应的资源表示定义到模板里面,之后通过Terraform执行这个模板实现对于资源的一键快速部署。当这些资源生产成功之后,可以利用第三方工具Terraform – Inventory实现将资源的访问信息直接转化到一个Inventory文件里面。接着当Ansible拿到这个Inventory文件之后可以利用其应用部署的Playbook实现对于应用的快速部署。当业务量迅速增加,整个应用架构需要进行有效扩容的时候该如何做呢?其实只需要在已有的资源模板中将其中的某个资源单元的数目由原来的数值增加到想要扩展的值,接着执行一次Terraform命令和Ansible命令就可以实现对于整个架构的快速扩容以及对于应用的快速部署。

d633a6156daad9be2444eed4e558563c3e3e516c

二、Terraform和Ansible介绍
接下来将会分享如何使用Terraform和Ansible实现对于基础设施架构和应用的有效管理。

Terraform介绍
Terraform是一个IT的自动化运维工具,我们可以利用Terraform将整个基础设施的搭建和管理的流程以代码的形式定义模板,Terraform通过读取这个模板来实现对于整个基础设施的有效管理。正如下图所示的,首先要对一些需要管理的资源以一种通用的语法定义到模板里面,然后执行Terraform命令,之后Terraform就会解析这个模板,并从模板中解析出来这些资源属于哪个云服务厂商并找到相应的Provider,再去调用对应的Open API,进而实现对于整个基础设施资源的有效生产。在将这些资源生产成功之后会将这些资源的信息写入到一个TF – State文件里面,这个文件将记录当前模板所定义的资源的所有信息,也正是因为这个文件的存在,保证了所定义资源的前后端一致性,也为后续对一整套资源的版本控制提供了支持。

e40f1fcfb15f3f7fbbecce8ba6dfff5bfd218788

Terraform安装
Terraform的安装是比较简单的,因为它是以一个二进制文件的形式呈现的,所以只需要到Terraform的官网上找到对应平台的二进制包下载下来,并配置相应的环境变量就可以使用了。在环境变量配置完成之后,执行“terraform version”这个命令,如果能够出现有效的版本号就说明Terraform已经安装成功。

b1ad525926741931d1a5be02ce84791a146742bf


Terraform模板

下图所展现的就是Terraform资源的模板,模板里面定义的资源主要有两个标识,一个是资源的标识,比如下图中的alicloud_security_group定义的就是安全组资源,后面的“group”表现的就是这个安全组资源在这个模板里面的名称。按照这样的方式就可以在模板里面定义很多资源,并且可以让模板里的资源相互引用,下图的模板里面一共定义了4个资源:安全组、ECS、SLB和SLB Attachment,其中SLB Attachment可以将所定义的ECS挂载到我们的SLB下面,整个过程非常方便,而且相互之间的引用也非常方便。

bf1a1f579cbca9e61dffc1068b8abb5843ff4263

Terraformd使用
Terraform的使用主要有三个非常基本的命令:

  • Terraform plan,实现对于模板所定义资源的预览功能,在真正生产资源之前可以实时地去查看当前模板所要生产哪些资源。
  • Terraform apply,这就是真正地生产资源的过程,执行这个命令就可以解析模板进而调用相应的API去实现对于资源的真实生产,资源后续的更新也会通过这个命令进行。
  • Terraform destroy,就是当需要去释放资源的时候,可以执行这个命令,从而达到对于模板所定义资源的全部释放销毁。
e2a639b245b5b0c37bc2f5f63a999b087ebf99f7

上图展现的就是执行Terraform apply命令之后的运行结果,第一行绿色的文字显示了这一次一共生产了6个资源,具体是哪些资源如上面所展示的这样。

资源拓扑映射
对于一个相对而言比较复杂的资源架构而言,如果将每个资源都进行模块化,将架构转化成为一个资源拓扑图之后,它们之间的相互关系会非常复杂。对于这样的非常复杂的相互依赖关系而言,如果我们用人工去进行搭建和连接这些关系,这时候的人工操作成本将会非常高。而使用Terraform工具,将它们之间的关系以代码的形式进行定义,定义之后只需要执行其中的一个命令或者两个命令就可以实现对于资源的快速生产,而且资源生产的过程也将会非常方便。

e6a57424fb2570971059e169ecd07a1736da1cf7

Ansible介绍
和Terraform一样,Ansible也是一个自动化的运维工具,但是Ansible除了能够实现和Terraform一样的生产、管理基础设施之外,更主要的是它还能非常快速地将应用部署到所生产出的基础设施上。Ansible的一个操作流程就是首先定义资源模板,然后利用Ansible命令去解析定义好的模板,找到相应的云服务提供商,调用相应的API,从而实现对于云资源的有效生产。在资源生产成功之后,使用动态Inventory文件或者其他工具实现对于Inventory文件的快速获取,然后基于需要部署应用的Playbook就可以实现将应用部署到所生产出来的机器上。

366e540c1de760f1a557efbc1fde0e7454c07d57

Ansible安装
因为Ansible是一个Python包,所以其安装比较简单,直接执行“sudo pip install ansible”就可实现对于Ansible的快速安装。当然如果想过要通过Ansible生产阿里云的机器,由于目前Ansible还没有将阿里云的Provider集成到自己的官方版本中,所以需要单独安装阿里云的Provider,其安装也非常简单,同样是一个Python包,但是安装之前需要先安装一个footmark,footmark面向阿里云服务的python包,提供了一系列管理阿里云服务的接口,应用这个包可以实现对于阿里云服务的有效管控,所以在安装阿里云Provider之前首先需要安装footmark,在将这两个安装成功之后,就可以通过实现一个简单的环境配置来实现对于阿里云Provider的有效引用。

aa4f6fe26d11aa8fba631a01fb917ba297f9c1d0

Ansible模板
如下图所示的是Ansible的模板,左边所展示的是在这个模板里面所定义的一些参数,里面包含了镜像ID、资源类型以及名称,下面是安全组的参数,比如安全组规则、入网规则以及出网规则。右边展现的则是具体资源的模板定义,可以看出上面是ECS Instance的资源,下面是安全组的资源,最下面则是将以上两个资源的生产结果进行连接,也就是将生产出来的ECS加入到生产出来的安全组里面。

fec555cf6d036432e7b1b6047efbceb101b517e4

Ansible环境搭建以及应用部署
那么Ansible具体在使用过程中如何实现整体的基础设施以及应用的分布式部署的呢?可以通过下面一个具体的示例为大家进行说明,大家想象这样的一个场景,假如我们需要将多个应用部署到多台服务器上,这时该如何做呢?

9bb5114dcf8deeaff21d1a15c38c000d99402d94

通常的做法是首先可以通过控制台或者API来生产出多台ECS,并登陆到每台ECS上去执行应用部署脚本,进而实现应用的快速部署。那么当使用Ansible之后,这样的过程是否能够变得更加简单呢?答案是肯定的,使用Ansible进行部署时第一步同样需要通过控制台或者API去生产出来我们想要的机器,并将这些机器的信息手动地写入到Inventory文件中,再去编写一个面向应用部署的Playbook,然后结合Playbook以及Inventory文件使用Ansible就可以实现应用的快速搭建和部署。

以上的过程是否能够再简单一些呢?其实可以将整个生产资源的过程也进行自动化,也就是将基础设施资源也定义成为模板,然后利用Ansible的Provider实现对于资源的快速搭建,在搭建成功之后利用Ansible的动态Inventory功能来动态地生产出想要的Inventory文件,接着使用已经定义好的Playbook实现应用的快速部署。整个过程从手动到自动化,可以看出它不仅仅是解决了流程上的复杂,而且也方便了后续应用的持续部署维护,将所有的这些步骤以及变更都以代码的形式记录到模板里面,每次只需要执行模板就可以实现整个流程的快速部署。

三、Terraform和Ansible的对比和结合

Terraform和Ansible的对比
Terraform和Ansible之间有什么区别呢?首先他们都可以实现对于基础设施资源的创建、属性资源的变更以及销毁。那么Terraform除了上述功能之外,由于其在资源生产成功之后会在本地以一个state文件的形式记录整个资源的详细信息,而这些信息的记录使得整个模板所定义的资源可以保证前后端的高度一致性,可以有利于后续对于整个一套资源的有效的版本控制。同时Terraform拥有一个DataSource功能,利用这个功能可以实现对于已有资源的获取,比如在生产资源之前想要查看当前有哪些可用区,有哪些可用镜像等,所有的这些都可以通过DataSource实现。除此之外,Terraform的模板可以进行分享和重用,当其他人需要搭建同样一套架构的时候只需要将自己的模板分享给他,于是就可以实现对于相同资源的快速生产。

2dee3331d3c4faf05351ed7d2767b397e5757a50

同样Ansible除了能够实现对于一些基础设施资源进行通用的管理之外,它还能够对于一些已有的基础设施资源进行状态控制,比如想要通过代码实现对于ECS资源的启动、停止以及重启操作,这时候就可以使用Ansible。其次,Ansible可以利用对于应用的快速部署的支持来实现对于多个应用的快速部署和维护,因为它支持了对于应用的快速部署,从而就可以解决基础设施和应用的同步伸缩,就如同前面提到的,当对于一个基础设施资源单元进行扩容之后,只需要使用相同的模板就可以同步实现对于应用的有效扩容。同样的Ansible的模板也可以进行分享和重用,其Playbook也可以进行分享和重用。

Terraform和Ansible的结合
Terraform和Ansible除了有上述的区别之外,能不能进行有效的结合呢?答案是肯定的,而它们之间有效结合的方式就是利用一个第三方的工具——Terraform – Inventory,这个第三方工具能够将Terraform生产出的资源转化为Ansible想要的Inventory文件,达到这一目的之后,Ansible就可以利用已有的Playbook和得到的Inventory文件来实现对于应用的快速部署。

c3ae473cb4777bcb8df954863e530f0a5899a568

四、操作演示
接下来会通过两个具体的实例向大家展示如何利用Terraform和Ansible这两个工具实现对于WordPress的快速部署。

2a4a948779a62599f6d8f5174b537361688d2c37

基于Ansible实现对WordPress的快速部署
这个过程主要包含这样的几个步骤:首先需要定义一个资源模板,然后利用Ansible去生产这些资源,当资源生产出来之后去记录相应的Inventory文件,然后利用已经写好的部署WordPress的Playbook来实现对于WordPress的快速搭建。

基于Terraform和Ansible的结合实现对WordPress的快速部署
首先要去定义一个Terraform的资源模板,然后利用Terraform – Inventory文件实现资源向Inventory文件的转化,最后利用Ansible实现对于应用的快速部署。

自动化能自动化的一切
可以看出当将整个部署的过程从手工操作转化成自动化的时候,一切都会变得非常简单,首先利用代码去描述资源的定义、资源的部署,以及后续应用的定义、应用的部署,只要整个过程中代码编写的比较好,代码测试通过,那么后续整个执行任务都不会出错,而且代码可以代替文档,其语法都是相对比较简单的,无须担心文档更新不及时或者因为成员沟通等造成的黑盒问题,也不用访问生产环境就可以知道生产环境下的配置情况,利用这些自动化的工具可以有效地提高整个团队的DevOps能力,进而可以提高整个团队的效率。

ffac8d425cff059e3d17ba744b2a1fdec8491a46

参考
下图展示了本次分享中涉及到的参考链接,大家可以在具体的网站上去寻找操作实例进行更加详细的参考和学习。

b4c81254fb12c793071cd9fd5a14854405d7ee3a

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/notes/293882.html

(0)
上一篇 2022年11月29日 23:24
下一篇 2022年11月29日 23:37

相关推荐

发表回复

登录后才能评论