多云下Terraform和Packer开源工具实践分享

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud

在2017云栖大会·深圳峰会上,来自阿里云云开发的黎山分享了《Multi-Cloud基础设施和应用管理实践》。软件行业的变化、云计算的出现和兴起,推动着越来越多的企业选择Multi-Cloud模式。黎山详细介绍了Terraform和Packer开源工具的使用方法,通过4个案例源码分享了具体的实践过程。

以下内容根据直播视频整理而成。

软件行业的发展带来的DevOps的变化

多云下Terraform和Packer开源工具实践分享

在很多年前,软件会被打包成EXE或其他可运行的包,由于网络费用比较高,所以软件以小为美,并且软件功能单一、架构简单,发布周期比较慢。后来,软件行业发生了很大变化,软件开始分层(服务层、UI层等),加入很多日志、服务监控等模块,架构变得异常复杂。同时,云计算开始出现并兴起,我们可以不用再太多考虑机房的硬件设施,云计算也提供了缓存、日志、备份等多种服务,那是不是云计算的出现会让我们安枕无忧?

多云下Terraform和Packer开源工具实践分享

据调查显示,越来越多的企业选择Multi-Cloud模式,选择Multi-Cloud的原因有很多,比如云计算平台数据中心的访问速度/云服务的性能/可用性(上图是2017年以来云计算大故障事件)、云计算平台的成本、云计算平台的安全性、客户服务质量、本地化、云计算平台的提供商、以及企业自有的数据中心地点。在Multi-Cloud模式下,IaC尤其重要。DevOps职责包括五大部分:开发运维协作;自动化、基础设施即代码;持续集成/测试;持续交付/部署;持续监控/反馈。

用工具实现自动化

自动化高于手工

按照固定流程所进行的手工工作,比如手工回归测试和手工部署工作,无趣、缓慢且无法审计。如果能将其代码化,且用版本控制系统管理起来,并加以自动化,这既能节省以后手工运行的大量时间,又能体验到开发测试和部署脚本工作的乐趣。

基础设施即代码高于手工配置

传统Ops的部署工作有些需要用鼠标在界面上点来点去,效率很低;效率高一些的Ops用了自动化脚本,但很多脚本都没有进行版本控制,更别提针对脚本的自动化测试了。如果能够将基础设施的维护工作都通过编写代码并加以版本控制来完成,那么会带来很多好处,比如Ops可以不用通过访问生产环境,就能知道生产环境上的配置情况;非运维人员如Dev,就有机会去学习这些运维配置代码并且加以修改,提升整个团队的DevOps能力;另外工具能方便地读取这些代码,来自动化地维护基层设施,大幅度提升Ops的工作效率。

一张图看懂IaC

多云下Terraform和Packer开源工具实践分享

上图中,右下方是基础设施,主线是Packer、Terraform、容器服务、cloud-init,其中每一部分中灰色字体是表示不同的工具但可以实现与其类似的事情。从图中可以看出,我们可以根据代码定义镜像的内容,通过Packer制作镜像存储在一个媒介中;通过代码定义资源的编排,然后通过Terraform将这些资源创建起来;利用应用定义的方式创建基础设施;在资源的运行时期,利用工具配置基础设施。

Terraform/Packer的介绍

Terraform和Packer是来自HashiCorp家族。Packer是镜像制作工具,它基于aliyun的基础镜像或本地镜像,生成自定义镜像。Terraform是资源编排工具,通过模板定义资源的描述,管理资源的创建、更新、销毁全命周期。它们的特点是支持多平台(Aliyun、AWS、Azure、OpenStack、VMWare等)、开源(成熟、透明、可自增强)。

Terraform

多云下Terraform和Packer开源工具实践分享

Terraform是通过模板来创建资源,创建之后会生成tfstate文件,该文件会作为后期更新、加载资源的依据。

多云下Terraform和Packer开源工具实践分享

上图左边是Terraform的模板,最主要的是resource,其中“alicloud_instance”表示使用的是阿里云,后面的“instance”是其别名,里面定义了创建ECS镜像的ID、实例类型、创建数量、可用区、安全组、是否IO优化、是否分配IP、ECS的标签。data也是可选的,利用正则表达式过滤,模板就可以使用过滤之后的结果。output是用来方便于整个资源创建后获取信息发布的输出。

多云下Terraform和Packer开源工具实践分享

Terraform最常用的有三个命令:terraform plan(预览);terraform apply(执行);terraform destroy(销毁)。上图为整个VPC集群创建完成的输出,可以看到ECS的参数、资源状况。

多云下Terraform和Packer开源工具实践分享

上图是VPC集群资源拓普图,下方有一个VPC,然后有vswitch,VPC内有一个安全组,其上有规则作用,有两台ECS(worker和master),eip作用在别名为master的ECS上,自定义路由也指向了master。

Packer

多云下Terraform和Packer开源工具实践分享

手动创建镜像的过程是:首先需要自己创建一台ECS,安装好相应组件,打快照,然后创建镜像。Packer的目的是将这些手动的过程自动化起来。Packer通过模板的描述,选择创建经典网络ECS或者VPC网络ECS,然后自动打快照、创建镜像,如果是基于本地镜像的话还会上传镜像到自定义镜像列表中,最后可以共享镜像、复制镜像。

多云下Terraform和Packer开源工具实践分享

上图右边是Packer的模板,builders的type用来描述是基于阿里云的定义的镜像,下方部分是创建完ECS之后所做的事情。

多云下Terraform和Packer开源工具实践分享

上图是整个创建的过程,它会把需要的资源都创建起来,然后在对应的机器上安装软件。创建完成之后会把软件卸载掉,最后返回镜像的ID。

实例演示

四个实例演示的模板详情可以通过以下链接查看。

创建ECS、修改标签(TAG)

首先预览一下所有的资源,没有问题的话运行Terraform真正创建资源。将TAG进行修改,再次运行terraform apply会看到资源被改动。

模板地址:https://github.com/alibaba/terraform-provider/tree/master/terraform/examples/alicloud-ecs

创建ECS、创建SLB、挂载ECS

最后修改ECS的数量,再去执行terraform apply的时候,不仅看到有一台ECS添加,并且可以看到其挂载到了SLB上。

模板地址:https://github.com/alibaba/terraform-provider/tree/master/terraform/examples/alicloud-ecs-slb

创建VPC集群、销毁VPC集群

模板地址:https://github.com/alibaba/terraform-provider/tree/master/terraform/examples/alicloud-ecs-vpc-cluster

Packer制作ChefServer镜像、Terraform创建ECS启动ChefServer

模板地址:https://github.com/alibaba/packer-provider/tree/master/examples/alicloud/chef

多云下Terraform和Packer开源工具实践分享

对于企业,可以基于.tfstate开发自己的应用资源管理系统。以应用的视角,看到应用所依赖的云平台有哪些,以及每个云平台所用到的资源。

相关推荐