Terraform
Terraform 语言文档
使用 Terraform 配置文件语言来描述 Terraform 管理的基础设施。
这是 Terraform 配置文件语言的文档。它与 Terraform CLI、HCP Terraform 和 Terraform Enterprise 的用户相关。Terraform 的语言是其主要用户界面。您用 Terraform 语言编写的配置文件会告诉 Terraform 安装哪些插件,创建哪些基础设施以及获取哪些数据。Terraform 语言还允许您定义资源之间的依赖关系,并从单个配置块创建多个类似的资源。
动手实践: 尝试 编写 Terraform 配置教程。
关于 Terraform 语言
Terraform 语言的主要目的是声明 资源,这些资源代表基础设施对象。所有其他语言特性都仅存在于使资源定义更灵活和方便。
Terraform 配置是 Terraform 语言中的完整文档,它告诉 Terraform 如何管理给定的基础设施集合。配置可以包含多个文件和目录。
Terraform 语言的语法仅由几个基本元素组成
resource "aws_vpc" "main" {
cidr_block = var.base_cidr_block
}
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
- 块是其他内容的容器,通常代表某种对象的配置,例如资源。块具有块类型,可以有零个或多个标签,并且具有一个主体,其中包含任意数量的参数和嵌套块。大多数 Terraform 的功能都由配置文件中的顶级块控制。
- 参数为名称分配一个值。它们出现在块中。
- 表达式表示一个值,无论是文字值,还是通过引用和组合其他值来表示的。它们作为参数的值或出现在其他表达式中。
Terraform 语言是声明式的,描述了一个期望的目标,而不是达到该目标所采取的步骤。块的顺序以及它们组织的文件的顺序通常不重要;Terraform 仅考虑资源之间的隐式和显式关系,以确定操作顺序。
示例
以下示例描述了 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)
}