使用Terraform高效实现云自动化

更新时间:2025-01-23 06:33:14

本视频具体介绍了如何运用Terraform来高效地管理并实现云上自动化,详细介绍了Terraform是什么、Terraform的核心组件、Terraform实现云上自动化的步骤以及Terraform应用的最佳实践。

使用Terraform高效实现云自动化

以下是视频转写全文,供参考:

Hello,大家好,欢迎回到阿里云开放平台自动化专栏Auto Talk。本期我们带来的是使用Terraform高效实现云自动化。我是夏槐,来自阿里云开放平台团队。

首先我们看一下IaC的概念,I就是Infrastructure是云上的资源,Code指的是代码,基础设施即代码是通过易读的配置文件或者代码来定义和管理基础架构。首先这里面有资源的定义。资源我们这里稍微提一下,就是不仅仅包括我们直接理解的云服务器实例、对象存储空间等这些IaaS的资源。也包括PaaS层的,比如K8SNamespace,SaaS层的,比如说DNS条目等抽象的资源。

IaC的方法中,我们一般分成两类,一种叫命令式的,一种叫声明式的。命令式的主要关注基础设施创建的过程具体是怎么操作的,就是通过代码来描述执行的具体命令。另一类是声明式的,关注基础设施创建的最终状态和目标是什么,主要是通过代码去描述期望的状态。

IaC的工具也有很多,任何基于编程方法,以声明式或命令式执行变更或者配置基础架构的框架或者工具,我们都可以认为是IaC的工具。这里面阿里云有一方的工具,也有三方的工具。比如说一方有ROS,就是资源编排。三方我们支持被广泛使用的开发工具Terraform,TerraformHashiCorp公司推出的开源编排工具,阿里云是其官方四大Major Providers之一。

Terraform主要有如下几个特点:首先在编排方面提供统一的编排语言,即HCL,当然也支持JSON,以代码的方式定义资源,底层对资源的增删改查由云厂商来实现。第二点是在管理方面对代码模板的编写。也就是说对资源的定义和对模板的管理就是对资源的管理,Terraform本身会解析执行代码,管理资源的状态信息。第三是在标准方面,以Terraform的资源模型来管理资源、安全审计等能力,也可以和这个模型对齐,以代码化的方式来定义。最后,在流程方面,Terraform可以和VCS,包括ITSM、CI/CD等流程做集成,实现云资源的自服务管理。同时基于流程也可以让整个的系统和业务更加的自动化和标准化。

Terraform有这些核心的组件,这里简单做一些介绍。首先在概念上,刚才也提到Provider,阿里云是HashiCorp公司的四大major Provider之一。Provider本质上就是云服务商或者是Terraform的提供商,实现CRUD接口,并且完成相关的资源的API的编排,客户在模板中需要指定所使用的Provider,目前Terraform支持的Provider有三千多个。

另外一个重要的概念在Terraform里就是Resource,就是我们常说的资源。一个具体的资源或者服务都可以定义为资源,可以是IaaS层的资源,比如说ECS的实例,VPC的网络,也可以是SaaS层的资源,比如说DNS的路由条目。每个资源都具备完整的CRUD的生命周期。在Terraform中,一个资源和另一个资源的关系通常也被定义为资源,比如说磁盘和ECS实例的挂载。

除了资源的概念,还有一个比较重要的概念就是Data Source。Data Source专门提供对资源的动态查询能力,比如说获取存量ECS,获取可用区域,包括实例规格,实例镜像,这些信息都可以通过Data Source来实现。第四个概念就是State,模板中定义的资源在完成操作之后,会将资源属性及其资源管理保存到文件中,这个文件称之为状态文件,就是我们常说的State文件。StateLocalRemote之分,比如说Remote,我们通常将其放到OSS上,或者是AWSS3上。

最后一个常用的概念就是Module。我们可以把一个资源管理涉及到的多个资源封装为一个开箱即用的Package。就像我们平常写Java代码时,可以封装一些SDK或类似类的东西通过这种方式可以提升通用性、复用性和分享的能力。这个Package就是我们所说的Module。

Terraform的主要操作有以下几个:首先是init操作,initTerraform的初始化,用来加载模板依赖的Provider、Module、Remote State等等,是其他所有命令的前提。然后第二个就是plan命令,plan命令主要是预览模板中定义的资源。就是说您执行的时候,Terraform会告诉您,这个动作下去到底会创建或者修改哪些资源。接下来这个命令叫apply,plan是预览,apply就是真正的执行创建和变更的操作。

下一个就是destroy,destroy就是我们可以把模板里面的所有的资源通过这个命令销毁掉。最后还有一个就是import,import的作用是可以把过去没有用Terraform管理的存量资源导入到State文件里面。同时,您可以补充Terraform的模板。这样一来,后续您的资源的管理,尤其是持续的管理都可以通过Terraform实现。这是我们实现云上自动化的几个步骤。

首先,就是环境的准备。比如说我们要下载安装ProviderModule,然后配置一些比如说云厂商的账号和环境。最后下载一些IDE的插件,帮助我们更方便地写Terraform的代码。这个过程中我们也可以参考一些文档或者示例,甚至可以在一些PlayGround环境里面做一些试运行。比如说阿里云也有Cloud Shell里面集成Terraform,也可以在这里面做一些尝试。

那最终我们调试完了以后,就可以做真正的业务的集成。比如说我们可以把存量的资源导入State文件中,同时补充一些模板的信息。在这个过程中,我们可能需要考虑如何组织代码,以及刚才提到的可以通过Module的方式来实现代码的复用。另外一点是,在业务提升的阶段,我们肯定会通过测试的手段来保证这个模板最后执行的结果是符合我们的预期,也可以结合一些开源的安全合规组件,实现一些静态代码的检查。

再往下就是生产环境的一些配置,比如说状态文件的管理。刚才我们也提到有Local的管理和Remote的管理,对于Remote的管理,我们就需要开通OSS的这种资源,并且对状态文件进行配置。也可以把我们整个Terraform的执行集成到CI/CD的流程中。同时比如说像阿里云在真正进行资源的创建的时,可能会有一些开通权限的操作。也可以前置的封装出来具体的模板,然后前置去执行。

最后,在持续运行和监控这个阶段,我们主要会关注几点。第一个是运行时可能会出现一些报错,这种情况下需要通过云厂商提供的错误诊断的手段去排查问题。第二点是要针对Terraform的情况做一些监控报警。

最后一点常见的问题就是会有一些配置漂移的问题。比如说我们Terraform管理的资源,同时其他的团队还会通过控制台做资源的修改,或者是资源的一些新建。这样的话,这部分资源就不在我们Terraform管控范围之内,这个我们就叫配置漂移。对于这种配置漂移,需要把Terraform模板跟云上的资源状态做对齐。否则,您在再次执行Terraform的时,可能会出现diff的信息。如果我们没有特别关注到,可能会覆盖其他通过控制台修改的状态。

最后,提一个关于Terraform使用的最佳实践。这里面主要有两点。第一点是非常推荐大家在使用Terraform的时候,一定要结合到具体的代码仓库管理系统,比如说GitLab或者GitHub,将Terraform代码托管在这些工具中。进行基础设施的变更的时候,本质上就是对代码的管理。同时,我们也可以把整个Pipeline的流程封装成一个服务,然后集成到自服务的门户中。这样一来,基础设施团队提供的能力,就可以让研发通过自服务的方式来申请和管理资源。我们的基础平台团队只需要做代码的Review或者流程的审批,就可以实现研发团队的资源管控和生产目标。

这种方式主要有几个特点。第一个特点是具有自服务的能力,可以让研发团队通过自助的方式做申请和管理。这样有助于提高资源的管控的效率,这也是可选的,如果没有这种自服务的门户,我们也可以让研发团队直接在我们的代码仓库中提交PR,然后我们做代码的审核、代码的合并,最后通过Pipeline的方式执行Terraform命令。

第二个特点就是我们会把整个的流程,比如说Terraform的代码的提交,Terraformplan的触发器以及apply的具体执行,都通过一个Pipeline的方式编排起来。这样的话,就实现了整个流程的标准化,以及整个Terraform能力的平台化。第三个特点是,通过这种IaC的管理的架构,可以让我们跟云平台的对接、与云资源的对接变得更加的简单。我们不需要再编排大量的API,就可以有效避免资源供给的效率的瓶颈。

以上就是本期分享的全部内容。若您有任何的疑问或关于自动化的一些想法,欢迎扫描屏幕下方二维码加入钉群与我们交流,期待下期再见。