Terraform/Ansible on Cloud--基础设施和应用管理实践
摘要:随着云计算、大数据、AI智能等前沿科技的发展,传统的研发速度,越来越难满足企业快速发展的需求。研发效能也成了继商业模式、技术突破之后的另一核心竞争力。在由阿里云研发协同RDC以及阿里云云栖社区联合举办的首届阿里巴巴研发效能嘉年华上,来自阿里云飞天八部企业服务云应用服务团队的高级研发工程师箫竹为大家分享了基础设施和应用管理实践,主要介绍了Terraform和Ansible两大自动化基础设施和应用管理工具,并结合实际应用场景介绍了如何在云上使用Terraform和Ansible工具提升基础设施和应用管理的效能。本次分享的主题将主要围绕以下四个方面:
- 什么是 IaC
- Terraform和Ansible介绍
- Terraform和Ansible的对比与结合
- 操作演示
本次分享首先会通过具体的应用场景来向大家解释什么是基础设施即代码(IaC),第二个部分会着重介绍一些如何基于Terraform和Ansible实现对于基础设施和应用的有效管理,接下来会着重分析Terraform和Ansible这两个工具之间的差别以及它们是如何进行结合的,在分享的最后会通过两个具体的示例来向大家展示如何基于Terraform和Ansible这两个工具有效地部署应用。
一、什么是IaC
应用场景1
某应用1,为了增大吞吐率,需要对其做一个流量均衡处理,以扩大并发数、缩短延迟,所以需要使用一个负载均衡和ECS的组合,其架构如下图所示,一个负载均衡,下面挂载两台ECS。


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


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

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

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

以上所有的场景都有一些共性:
操作流程和基本配置都是固定的,基本都是通过手工操作实现的
- 手工操作效率低、 时间长
- 手工操作时可能导致错误
- 手工操作过程没有历史记录
- 手工操作过程不能实现有效审计(不知道是谁做了什么样的操作)
- 手工操作成本随着业务的复杂而不断增大
那么如何去解决这些场景所面临的一些难题呢?这时候就不得不使用自动化去进行处理。正如下图中所说的,我们可以将以上场景中这个相对固定的操作以及配置以代码的形式写入到模板里面,然后利用一些自动化的工具,比如Terraform和Ansible去读取这些模板,并将这些模板转化成为我们的资源,然后在转化成为资源之后,再利用一些应用的部署模板实现将应用快速地部署到生成出来的资源上,这也就是基础设施即代码。


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

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

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

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

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

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

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

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

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

以上的过程是否能够再简单一些呢?其实可以将整个生产资源的过程也进行自动化,也就是将基础设施资源也定义成为模板,然后利用Ansible的Provider实现对于资源的快速搭建,在搭建成功之后利用Ansible的动态Inventory功能来动态地生产出想要的Inventory文件,接着使用已经定义好的Playbook实现应用的快速部署。整个过程从手动到自动化,可以看出它不仅仅是解决了流程上的复杂,而且也方便了后续应用的持续部署维护,将所有的这些步骤以及变更都以代码的形式记录到模板里面,每次只需要执行模板就可以实现整个流程的快速部署。
三、Terraform和Ansible的对比和结合
Terraform和Ansible的对比
Terraform和Ansible之间有什么区别呢?首先他们都可以实现对于基础设施资源的创建、属性资源的变更以及销毁。那么Terraform除了上述功能之外,由于其在资源生产成功之后会在本地以一个state文件的形式记录整个资源的详细信息,而这些信息的记录使得整个模板所定义的资源可以保证前后端的高度一致性,可以有利于后续对于整个一套资源的有效的版本控制。同时Terraform拥有一个DataSource功能,利用这个功能可以实现对于已有资源的获取,比如在生产资源之前想要查看当前有哪些可用区,有哪些可用镜像等,所有的这些都可以通过DataSource实现。除此之外,Terraform的模板可以进行分享和重用,当其他人需要搭建同样一套架构的时候只需要将自己的模板分享给他,于是就可以实现对于相同资源的快速生产。

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

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

这个过程主要包含这样的几个步骤:首先需要定义一个资源模板,然后利用Ansible去生产这些资源,当资源生产出来之后去记录相应的Inventory文件,然后利用已经写好的部署WordPress的Playbook来实现对于WordPress的快速搭建。
首先要去定义一个Terraform的资源模板,然后利用Terraform - Inventory文件实现资源向Inventory文件的转化,最后利用Ansible实现对于应用的快速部署。
自动化能自动化的一切
可以看出当将整个部署的过程从手工操作转化成自动化的时候,一切都会变得非常简单,首先利用代码去描述资源的定义、资源的部署,以及后续应用的定义、应用的部署,只要整个过程中代码编写的比较好,代码测试通过,那么后续整个执行任务都不会出错,而且代码可以代替文档,其语法都是相对比较简单的,无须担心文档更新不及时或者因为成员沟通等造成的黑盒问题,也不用访问生产环境就可以知道生产环境下的配置情况,利用这些自动化的工具可以有效地提高整个团队的DevOps能力,进而可以提高整个团队的效率。

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