跳到主要内容

OpenTofu 语言文档

这是 OpenTofu 配置语言的文档。它与 OpenTofu CLITACOS(TF 自动化和协作软件)的用户相关。OpenTofu 的语言是其主要用户界面。您用 OpenTofu 语言编写的配置文件告诉 OpenTofu 要安装哪些插件、要创建哪些基础设施以及要获取哪些数据。OpenTofu 语言还允许您定义资源之间的依赖关系,并从单个配置块创建多个类似的资源。

关于 OpenTofu 语言

OpenTofu 语言的主要目的是声明 资源,这些资源代表基础设施对象。所有其他语言特性都只是为了使资源的定义更加灵活和方便。

一个 OpenTofu 配置 是一个完整的 OpenTofu 语言文档,它告诉 OpenTofu 如何管理给定的基础设施集合。一个配置可以由多个文件和目录组成。

OpenTofu 语言的语法仅包含几个基本元素

代码块
resource "aws_vpc" "main" {
cidr_block = var.base_cidr_block
}

<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
  • 是其他内容的容器,通常表示某种对象的配置,例如资源。块具有 块类型,可以具有零个或多个 标签,并且具有一个 主体,其中包含任意数量的参数和嵌套块。OpenTofu 的大多数功能都是由配置文件中的顶级块控制的。
  • 参数 将一个值分配给一个名称。它们出现在块中。
  • 表达式 表示一个值,可以是字面值,也可以是通过引用和组合其他值来表示。它们作为参数的值出现,或者出现在其他表达式中。

OpenTofu 语言是声明式的,它描述的是一个想要达成的目标,而不是实现该目标的步骤。块的顺序以及它们所在的组织文件通常并不重要;OpenTofu 仅在确定操作顺序时考虑资源之间的隐式和显式关系。

示例

以下示例描述了 Amazon Web Services 的简单网络拓扑,只是为了展示 OpenTofu 语言的整体结构和语法。可以使用其他提供者定义的资源类型为其他虚拟网络服务创建类似的配置,而实际的网络配置通常包含此处未显示的附加元素。

代码块
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, OpenTofu 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)
}