共计 6862 个字符,预计需要花费 18 分钟才能阅读完成。
Terraform
- 1. Terraform 是什么?
-
2. Terraform 核心功能
- 2.1. 基础架构即代码 (Infrastructure as Code)
- 2.2. 执行计划 (Execution Plans)
- 2.3. 资源图 (Resource Graph)
- 2.4. 自动化变更 (Change Automation)
-
3. Terraform 如何运作
- 3.1. 代码
- 3.2. 模块
- 3.3. 模块注册表
- 3.4. 丰富的 REST API
- 3.5. VCS 集成
- 3.6. 配置设计器
- 3.7. 工作区
- 3.8. 变量
- 3.9. 运行
- 3.10. 状态
-
4. Terraform 使用案例
- 4.1. Heroku 应用程序设置
- 4.2. 多层应用
- 4.3. 自服务集群 (Self-Service Clusters)
- 4.4. 软件演示
- 4.5. 一次性环境
- 4.6. 软件定义网络
- 4.7. 资源调度程序
- 4.8. 多云部署
-
5. Terraform 与其他工具对比
- 5.1. Chef,Puppet 等
- 5.2. CloudFormation, Heat 等
- 5.3. Boto,Fogd 等
- 5.4. 自定义解决方案
1. Terraform 是什么?
Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具 (基础架构自动化的编排工具)。它的目标是 “Write, Plan, and create Infrastructure as Code”, 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务。具体的说就是可以用代码来管理维护 IT 资源,把之前需要手动操作的一部分任务通过程序来自动化的完成,这样的做的结果非常明显:高效、不易出错。
Terraform 提供了对资源和提供者的灵活抽象。该模型允许表示从物理硬件、虚拟机和容器到电子邮件和 DNS 提供者的所有内容。由于这种灵活性,Terraform 可以用来解决许多不同的问题。这意味着有许多现有的工具与 Terraform 的功能重叠。但是需要注意的是,Terraform 与其他系统并不相互排斥。它可以用于管理小到单个应用程序或达到整个数据中心的不同对象。
Terraform 使用配置文件描述管理的组件 (小到单个应用程序,达到整个数据中心)。Terraform 生成一个执行计划,描述它将做什么来达到所需的状态,然后执行它来构建所描述的基础结构。随着配置的变化,Terraform 能够确定发生了什么变化,并创建可应用的增量执行计划。
Terraform 是用 Go 语言开发的开源项目,你可以在 github 上访问到它的源代码。
2. Terraform 核心功能
2.1. 基础架构即代码 (Infrastructure as Code)
基础设施使用高级配置语法进行描述。这可以让你的数据中心蓝图像你其他代码一样进行版本控制和管理。此外基础设施可以被分享和重用。
2.2. 执行计划 (Execution Plans)
Terraform 有一个 plan 步骤,它生成一个执行计划。执行计划显示了当执行 apply 命令时 Terraform 将做什么。通过 plan 进行提前检查,可以使 Terraform 操作真正的基础结构时避免意外。
2.3. 资源图 (Resource Graph)
Terraform 构建的所有资源的图表,它能够并行地创建和修改任何没有相互依赖的资源。因此,Terraform 可以高效地构建基础设施,操作人员也可以通过图表深入地解其基础设施中的依赖关系。
2.4. 自动化变更 (Change Automation)
把复杂的变更集应用到基础设施中,而无需人工交互。通过前面提到的执行计划和资源图,我们可以确切地知道 Terraform 将会改变什么,以什么顺序改变,从而避免许多可能的人为错误。
3. Terraform 如何运作
Terraform Enterprise 在基础架构之上提供协作,治理和自助服务工作流,作为来自开源的代码配置。Terraform Enterprise 为团队合作构建基础架构提供工作空间,模块和其他强大的构造。运营商可以将基础架构作为代码打包成可重复使用的模块,使开发人员能够以自助服务的方式快速进行配置。同样,作为代码和日志记录的策略使组织能够保护,管理和审核其整个部署。
Terraform 允许将基础架构表示为代码。期望的状态以简单的人类可读语言表达。Terraform 使用此语言提供更改的执行计划,可以对其进行安全性审核,然后应用于更改。可扩展的提供商允许 Terraform 管理广泛的资源,包括硬件,IaaS,PaaS 和 SaaS 服务。
3.1. 代码
使用简单的人类可读配置语言 HashiCorp 配置语言(HCL)来定义所需的基础架构资源拓扑。还可以在 JSON 中定义配置,以进行编程生成和应用程序集成。
resource "google_compute_instance""server" {
name = "server"
machine_type = "g1-small"
zone = "us-centrall-a"
disk {image = "ubuntu-1404-trusty-v20160114e"}
}
resource "dnsimple_record""hello" {
domain = "example.com"
name = "server"
value = "${google_compute_instance.server.network_interface.0.address}"
}
3.2. 模块
封装资源组以创建可重用的基础结构块。模块允许用户指定可变输入和消耗基础设施,而无需细节方面的专家。
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "my-vpc"
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
enable_vpn_gateway = true
tags = {
Terraform = "true"
Environment = "dev"
}
}
3.3. 模块注册表
来自合作伙伴,贡献者和 HashiCorp 的社区模块库。自定义模块的私有注册表,经过版权,验证和批准供组织内部使用。
3.4. 丰富的 REST API
利用 Terraform API 将配置工作流程集成到现有的 CI / CD 管道或自定义自动化工具中。
3.5. VCS 集成
使用您首选的版本控制系统编写,版本,审查和协作 Terraform 代码。与 Terraform Enterprise 集成以自动验证配置更改并触发 Terraform。将使用 Terraform 进行的更改链接到版本控制中的关联更改。
3.6. 配置设计器
基于 GUI 的工作流,用于组合模块和为用户定义变量,以便在不必将基础架构编写为代码的情况下提供基础架构。
3.7. 工作区
工作区将单片基础架构分解为更小的组件或“微基础架构”。这些工作区可以与团队对齐,以实现基于角色的访问控制。通过一个窗格查看云提供商,团队和环境中的所有工作区。保护并审核所有工作区更改。
3.8. 变量
粒度变量允许轻松重用代码并启用动态更改以扩展资源和部署新版本。所有变量都经过加密,受访问控制保护,并在配置过程中根据需要进行检索。
3.9. 运行
Terraform 使用两阶段供应计划(干运行)和应用(执行)。可以在执行前检查计划,以确保预期的行为和安全。可以从 GUI,使用 API或从 CLI 应用 Terraform 运行,以保留与 OSS 相同的工作流程。策略检查步骤适用于计划。
3.10. 状态
状态文件是当前配置资源的记录。状态文件启用基础结构的版本化历史记录,并在静态时加密。可以检查版本以查看增量更改。提供远程状态存储和管理,使团队能够共享状态,一次阻止多个更改,以及查看团队所有基础结构更改的版本化历史记录。
4. Terraform 使用案例
当前页面列出了 Terraform 的一些实际使用案例,实际的用例比我们讲到的要多很多。由于其原生扩展性,可以增加 provider 和 provisioner 来进一步扩展 Terraform 操作资源的能力。
4.1. Heroku 应用程序设置
Heroku 是个流行的托管 web 应用的 PaaS 平台。开发者们创建一个应用程序,然后追加附件组件,如:数据库或邮件供应商等。最好的特性之一就是可以动态调整 dynos 和 workers 的数量。但是,但多数普通应用会很快需要许多附加组件和外部服务。
Terraform 可以用来代码化 HeroKu 应用需要的一些配置,以确保所有所需组件可用,但是它可以更进一步做到:配置 DNSSimple 设置一个 CNAME,或为应用配置一个 CloudFare CDN。最妙的是,Terraform 可以在不借助 Web 界面的前提下在 30 秒以内完成所有工作。
4.2. 多层应用
多层架构一个非常常见的模式。大多数两层架构是使用数据库层的 web 服务器集群。增加其他层用于 API 服务器,缓存服务器,路由网格等。使用该模式是因为每一层可以独立伸缩,并为关注点进行隔离。
Terraform 是一个构建和管理基础设施的完美工具。每一层都可以被描述为一个资源集,并且每层间的依赖关系都会被自动处理;Terraform 会在 web 服务器启动前确保数据库服务器已经可用并且负载均衡可以感知后端 web 节点。每一层通过只修改配置文件的计数值,使用 Terraform 可以很容易实现伸缩。因为创建和配置资源被代码化和自动化了,所以,随负载弹性伸缩变得不再重要。
4.3. 自服务集群 (Self-Service Clusters)
在一定的组织规模下,管理一个大型且在增长的基础设施对于集中式运维团队而言变得非常有挑战性。取而代之的是变为创建自服务的基础设施,允许产品团队使用集中运维团队提供的工具管理他们自己的基础设施。
使用 Terraform,如何构建和伸缩一个服务的知识可以被代码化为一个配置文件。Terraform 配置文件可以在组织内分享传播,使客户团队可以像黑盒一样使用配置文件,并且使用 Terraform 作为工具来管理服务。
4.4. 软件演示
现代软件越来越向网络化和分布式发展。尽管又像 Vagrant 这样的工具构建虚拟环境用于演示,在与生产环境更接近的真实基础设施做演示依然充满挑战。
软件开发这可以提供一个 terraform 配置文件来在类似 AWS 的云平台上创建,配置,引导一个演示环境。这使最终用户很容易在他们自己的基础设施上演示软件,设置可以调整参数像集群数量以更加严格的测试任意规模的工具。
4.5. 一次性环境
同时有 production 和 staging 或 QA 环境是常用的实践。这些环境是生产环境副本的缩小版克隆,用于在正式环境发布新应用前的测试。随着生产环境增长,也越来越复杂,维护一个最新版 staging 环境的工作也日益繁重。
使用 Terraform,生产环境可以被代码化,然后共享给 staging, QA 或 dev。这些环境可以被用于快速启动新环境进行测试,也很容易被销毁。Terraform 可以帮助驯服平行环境的复杂性,使弹性创建和销毁变得可行。
4.6. 软件定义网络
软件定义网络(SDN)在数据中心中变得越来越受欢迎,因为它为运维和开发提供了更多控制并使网络更好的支持运行于上层的应用。大多数 SDN 的实现有一个控制层和一个基础设施层。
Terraform 可以用于软件定义网络的代码化配置。这些配置以后可以使用 Terraform 自动配置和代码化代码化控制层接口。这使得配置可以版本化和自动变更。比如:AWS VPC 是最常见的软件定义网络之一,且可以使用 Terraform 配置。
4.7. 资源调度程序
一个大型基础架构下,为应用静态分配机器变得越来越具有挑战性。为了解决该问题,涌现了大量像 Borg, Mesos, YARN, 和 Kubernetes 的调度器。他们可以用来动态调度 Docker 容器,Hadoop,Spark 和许多其他软件工具。
Terraform 并不局限于像 AWS 这样的物理 provider。资源调度器可以被认为是一个 provider,Terraform 能够向他们请求资源。这使 Terraform 可以用于多层:配置物理基础设施,运行调度器以及配置调度器网格。
4.8. 多云部署
跨云扩展基础设施依提升容错能力通常很有吸引力。只用一个可用区或一家云提供商,容错能力往往受限于该提供商的能力。拥有多云部署可以更优雅的恢复某宕掉的可用区甚至整个云平台。很明显多云部署很有挑战,因为目前已有的针对基础设施管理的工具都是针对特定云平台的。Terraform 不限定某个云平台,允许一个配置文件用于管理多个云提供商甚至可以处理跨云依赖。它简化了管理和编排,可帮助运维构建大型多云基础设施。
5. Terraform 与其他工具对比
Terraform 提供了一个资源和服务商的灵活的抽象层。该模型允许可以表示从物理硬件,虚拟机和容器到邮件和 DNS 提供商的所有信息。因为灵活性,Terraform 可以被用于解决许多不同的问题。这意味着许多已存在的工具与 Terraform 功能重叠。我们对比了 Terraform 和大量此类工具,但是需要注意到 Terraform 与其他系统并不是互斥的。它可以被用来管理单个应用程序或整个数据中心。
5.1. Chef,Puppet 等
配置管理工具在已存在的机器上安装和管理软件。Terraform 不是一个配置管理工具,并且它允许现有的工具专注于自己的优势:引导和初始化资源。
使用 provisioners,在资源被创建以后,Terraform 可以使任意配置管理工具可以被用于配置和初始化资源。Terraform 专注于数据中心和相关服务的更高层次的抽象,而不牺牲配置管理工具来做他们最擅长事情的能力。它也拥抱这些工具所负责的成功编排,使整个基础设施的部署简单可靠。
5.2. CloudFormation, Heat 等
像 CloudFormation, Heat 这样的工具。允许将基础设施的细节编写为配置文件。配置文件允许基础设施被弹性创建,修改和销毁。Terraform 受其所解决问题的启发。
Terraform 同样使用配置文件配置基础设施细节,但是它更进一步与云平台无关并且能够结合多 provider 和多服务编排。例如:Terraform 可以同时编排 AWS 和 OpenStack 集群,开启第三方 provider 像 Cloudflare 和 DNSimple 集成 CDN 和 DNS 服务。这使 Terraform 可以利用其支持的服务来表现和管理整个基础设施,而不是仅仅已存在于单个 provider 里的子集。它提供一种统一的语法,而不是需要运维为每个平台和服务使用独立且不可相互交互的工具。
Terraform 通过使用执行计划的概念将计划语法和执行阶段分开。通过执行 terraform plan,更新当前状态并查询配置文件生成新的执行计划。该计划包含所有将要被执行的动作:将被创建,销毁和变更的资源。运维可以检查其状态以确保其符合预期。使用 terraform graph,该计划将被可视化并按顺序输其出依赖关系。一旦计划被获取,执行语法会被限制在计划中的动作内。其他工具将计划和执行阶段结合在一起,这意味着运维人员被迫在心里推断变更带来的影响,这在一个大型基础架构中会很快变得难以追溯。Terraform 让运维人员有信心应用变更,因为他们事前可以确切知道将会发生什么。
5.3. Boto,Fogd 等
像 Boto, Fog 这样的库,被用于原生访问云提供商和服务所提供的 API。一些库强制专注于特定的云,有些则尝试打通所有的云并隐藏于以上的不同。使用客户端工具仅提供对于 API 的低级访问,需要应用程序开发者创建他们自己的工具来构建和管理他们的基础设施。
Terraform 不打算提供对于提供商的低级编程访问,而已提供一个高级语法来描述云资源和服务如何被创建,制备和结合。Terraform 非常灵活,使用一个基于插件的模型支持 providers 和 provisioners,赋予它支持几乎所有服务 API 的能力。
5.4. 自定义解决方案
Terraform 的设计旨在解决这些挑战。它提供了一个简单,统一的语法,允许管理几乎任意资源而不需要学习一个新工具。通过捕获所有资源,他们之间的依赖关系可以被自动解决,所以运维人员不需要记住和推理。消除构建工具的负担使运维人员专注于他们的基础设施而不是工具。
此外,Terraform 是一款开源工具。除了 HashiCorp 公司,Terraform 社区也在帮助扩展它的功能,修复 bug,完善文档和使用案例。Terraform 帮助解决每个组织都存在的一个问题并提供一种适用的标准以避免不同组织间重复造轮子。它的开源特性确保它可以长远发展。