本期推荐的terraform-可以在任何云上自动化基础架构。
HashiCorp Terraform 是一种基础架构即代码工具,可让您在可读的配置文件中定义云和本地资源,您可以对其进行版本控制、重用和共享。然后,您可以使用一致的工作流程在整个生命周期内配置和管理所有基础架构。Terraform 可以管理计算、存储和网络资源等低级组件,以及 DNS 条目和 SaaS 功能等高级组件。
Terraform特征
- 基础设施即代码:使用高级配置语法描述基础设施。这允许您对数据中心的蓝图进行版本控制和处理,就像您处理任何其他代码一样。此外,基础设施可以共享和重用。
- 执行计划:Terraform 有一个“计划”步骤,它会生成一个执行计划。执行计划显示了当您调用 apply 时 Terraform 将执行的操作。这可以让您在 Terraform 操作基础设施时避免任何意外。
- 资源图:Terraform 构建所有资源的图,并并行创建和修改任何非依赖资源。因此,Terraform 尽可能高效地构建基础设施,并且运营商可以深入了解其基础设施中的依赖关系。
- 变更自动化:可以将复杂的变更集应用到您的基础设施,只需最少的人工交互。通过前面提到的执行计划和资源图,您可以准确地知道 Terraform 将改变什么以及以什么顺序进行更改,从而避免了许多可能的人为错误。
工作流:
Terraform 语言
这是 Terraform 配置语言的文档。它与Terraform CLI、 Terraform Cloud和 Terraform Enterprise的用户相关。Terraform 的语言是它的主要用户界面。您用 Terraform 语言编写的配置文件告诉 Terraform 要安装哪些插件、要创建哪些基础设施以及要获取哪些数据。Terraform 语言还允许您定义资源之间的依赖关系,并从单个配置块创建多个类似的资源。
Terraform 语言的语法仅包含几个基本元素:
资源"aws_vpc" "main" {
cidr_block = var.base_cidr_block }
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body <IDENTIFIER> = <EXPRESSION> # Argument }
例子
以下示例描述了 Amazon Web Services 的简单网络拓扑,只是为了让您了解 Terraform 语言的整体结构和语法。可以使用其他提供商定义的资源类型为其他虚拟网络服务创建类似的配置,并且实际的网络配置通常会包含此处未显示的其他元素。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 1.0.4"
}
}
}
variable "aws_region" {}
variable "base_cidr_block" {
description = "A /16 CIDR range definition, such as 10.1.0.0/16, that the VPC will use"
default = "10.1.0.0/16"
}
variable "availability_zones" {
description = "A list of availability zones in which to create subnets"
type = list(string)
}
provider "aws" {
region = var.aws_region
}
resource "aws_vpc" "main" {
# Referencing the base_cidr_block variable allows the network address
# to be changed without modifying the configuration.
cidr_block = var.base_cidr_block
}
resource "aws_subnet" "az" {
# Create one subnet for each given availability zone.
count = length(var.availability_zones)
# For each subnet, use one of the specified availability zones.
availability_zone = var.availability_zones[count.index]
# By referencing the aws_vpc.main object, Terraform knows that the subnet
# must be created only after the VPC is created.
vpc_id = aws_vpc.main.id
# Built-in functions and operators can be used for simple transformations of
# values, such as computing a subnet address. Here we create a /20 prefix for
# each subnet, using consecutive addresses for each availability zone,
# such as 10.1.16.0/20 .
cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 4, count.index+1)
}
Terraform安装
- Terraform Cloud 和 Terraform Enterprise 安装提供程序作为每次运行的一部分。
- Terraform CLI 在 初始化工作目录时查找并安装提供程序。它可以从 Terraform 注册表自动下载提供程序,或从本地镜像或缓存加载它们。如果您使用的是持久工作目录,则无论何时更改配置的提供者都必须重新初始化。
- 为了节省时间和带宽,Terraform CLI 支持可选的插件缓存。您可以使用CLI 配置文件plugin_cache_dir中的设置 启用缓存。
工作目录内容
Terraform 工作目录通常包含:
- 描述 Terraform 应管理的资源的 Terraform 配置。这种配置预计会随着时间而改变。
- 一个隐藏.terraform目录,Terraform 使用它来管理缓存的提供程序插件和模块,记录 当前处于活动状态的工作区,并记录最后一次已知的后端配置,以防下次运行时需要迁移状态。此目录由 Terraform 自动管理,并在初始化期间创建。
- 状态数据,如果配置使用默认local后端。这是由 Terraform 在terraform.tfstate文件(如果目录仅使用默认工作区)或terraform.tfstate.d目录(如果目录使用多个工作区)中管理的。
初始化
- 运行terraform init命令以初始化包含 Terraform 配置的工作目录。初始化后,您将能够执行其他命令,例如terraform plan和terraform apply。
- 如果您尝试运行依赖于初始化而不首先初始化的命令,该命令将失败并显示错误并说明您需要运行 init。
- 初始化执行多个任务来准备目录,包括访问已配置后端中的状态、下载和安装提供程序插件以及下载模块。在某些情况下(通常是从一个后端更改为另一个后端时),它可能会要求用户提供指导或确认。
重新初始化
- Terraform 配置的某些类型的更改可能需要重新初始化,然后才能继续正常操作。这包括对提供者要求、模块源或版本约束以及后端配置的更改。
- 您可以通过再次运行来重新初始化目录terraform init。事实上,您可以随时重新初始化;init 命令是幂等的,如果不需要更改,它将不起作用。
- 如果需要重新初始化,任何依赖于初始化的命令都将失败并显示错误并告诉您。
Terraform 注册表发布
Terraform 注册表是一个交互式资源,用于发现与 Terraform 一起使用的各种集成(提供程序)和配置包(模块)。Registry 包括由 HashiCorp、第三方供应商和我们的 Terraform 社区开发的解决方案。我们对 Registry 的目标是提供插件来管理任何基础设施 API、预制模块以快速配置通用基础设施组件,以及如何编写优质 Terraform 代码的示例。
导航注册表
注册表为模块和提供程序提供了许多不同的类别,以帮助导航大量可用选项。选择提供商或模块卡以了解更多信息,将结果过滤到特定层,或使用注册表顶部的搜索字段来查找您要查找的内容。
用户帐号
任何有兴趣发布提供程序或模块的人都可以创建一个帐户并使用 GitHub 帐户登录到 Terraform Registry。单击“登录”按钮,然后按照登录提示进行操作。授权使用 GitHub 帐户并登录后,您可以直接从您管理的存储库之一发布提供程序和模块。
用于 Terraform 的 CDK
Terraform 云开发工具包 (CDKTF) 允许您使用熟悉的编程语言来定义和配置基础设施。这使您无需学习 HashiCorp 配置语言 (HCL) 即可访问整个 Terraform 生态系统,并允许您利用现有工具链的强大功能进行测试、依赖管理等。
我们目前支持 TypeScript、Python、Java、C# 和 Go(实验性)。
Terraform 的 CDK 是如何工作的?
适用于 Terraform 的 CDK 利用AWS 云开发工具包中的概念和库将您的代码转换为 Terraform 的基础设施配置文件。
在高层次上,您将:
- 创建应用程序:使用内置或自定义模板以您选择的语言构建项目。
- 定义基础架构:使用您选择的语言来定义您想要在一个或多个提供商上配置的基础架构。CDKTF 自动从 Terraform 提供程序和模块中提取模式,为您的应用程序生成必要的类。
- 部署:使用cdktfCLI 命令为基础设施配置 Terraform,或将您的代码合成为其他人可以直接与 Terraform 一起使用的 JSON 配置文件。
何时将 CDK 用于 Terraform
CDKTF 提供了许多好处,但它并不是每个项目的正确选择。在以下情况下,您应该考虑使用 CDKTF:
- 您有强烈的偏好或需要使用过程语言来定义基础设施。
- 您需要创建抽象来帮助管理复杂性。例如,您想要创建构造来对由多种资源和便利方法组成的可重用基础架构模式进行建模。
- 您可以轻松进行自己的故障排除,并且不需要商业支持。
—END—
开源协议:MPL-2.0 license