介绍
在 Terraform 中,输出值(Output Values)是一种在资源部署完成后,暴露有关资源关键数据的方式。它们类似于 Terraform 模块的返回值,可用于轻松查询诸如服务器 IP 地址、数据库连接字符串或文件路径等信息。这使得这些信息能够通过命令行轻松获取,并允许其他 Terraform 配置使用它们。
在本实验中,你将学习如何定义、应用和查看输出值。我们将从一个创建本地文件的基础 Terraform 配置开始,然后添加一个输出块来暴露该文件的路径。
创建用于定义输出的 outputs.tf 文件
在这一步中,我们将为输出定义创建一个专用文件。虽然你可以将输出块放在任何 .tf 文件中,但将其放在名为 outputs.tf 的独立文件中是一种常见的惯例和最佳实践。这能保持配置的条理性,并让你轻松找到项目中所有的输出。
你所有的工作都将在 ~/project 目录下完成,这是终端中的默认目录。
首先,让我们检查一下已经为你预先创建好的 main.tf 文件。
ls -l
你应该能看到 main.tf 文件和一个 .terraform 目录。
total 4
-rw-rw-r-- 1 labex labex 279 Oct 15 12:39 main.tf
现在,使用 touch 命令创建 outputs.tf 文件。
touch outputs.tf
该命令会在当前目录下创建一个名为 outputs.tf 的空文件。你可以通过再次列出文件来验证它是否创建成功。
ls -l
现在你会在文件列表中看到 outputs.tf。
total 4
-rw-rw-r-- 1 labex labex 279 Oct 15 12:39 main.tf
-rw-rw-r-- 1 labex labex 0 Oct 15 12:39 outputs.tf
定义 local_file 文件名的输出
在这一步中,你将在 outputs.tf 文件中定义一个输出块。输出块用于为你的 Terraform 配置声明单个输出值。
输出块的基本语法如下:
output "NAME" {
## Arguments go here
}
其中,NAME 是一个字符串,用于为输出命名,你稍后将使用该名称来查询其值。
让我们使用 nano 编辑器打开 outputs.tf 文件,并添加我们的第一个输出块。
nano outputs.tf
现在,将以下代码添加到文件中。我们将输出命名为 file_path。
output "file_path" {
}
添加代码后,按 Ctrl+X,然后按 Y,最后按 Enter 保存文件并退出 nano。
这个块目前还没有实际作用,因为它缺少 value 参数。我们将在下一步中添加它。
在输出块中引用资源属性
在这一步中,我们将通过指定要显示的值来使输出变得有用。这是通过输出块内的 value 参数实现的。该值通常是对配置中定义的资源属性的引用。
引用资源属性的语法是 <RESOURCE_TYPE>.<RESOURCE_NAME>.<ATTRIBUTE>。
在我们的 main.tf 文件中,定义了一个如下所示的资源:
resource "local_file" "example" {
## ...
}
local_file 资源有一个名为 filename 的属性,它保存了该资源所管理文件的路径。要引用此属性,我们使用 local_file.example.filename。
让我们将此引用添加到我们的输出块中。再次使用 nano 打开 outputs.tf。
nano outputs.tf
修改文件以包含 value 参数,如下所示:
output "file_path" {
value = local_file.example.filename
}
这告诉 Terraform,file_path 输出的值应为名为 example 的 local_file 资源中 filename 属性的值。
按 Ctrl+X、Y 和 Enter 保存文件并退出 nano。
运行 terraform apply 更新配置
在这一步中,你将应用配置更改。每当你添加、删除或修改输出时,都必须运行 terraform apply,以便 Terraform 识别这些更改并更新状态文件(state file)。状态文件是 Terraform 存储输出值的地方。
在终端中运行 terraform apply 命令。
terraform apply
Terraform 首先会向你展示执行计划。它会检测到你添加了一个输出,并计划将其添加进去。由于 local_file 资源尚未创建,它也会计划创建该资源。
系统会提示你确认操作。输入 yes 并按 Enter。
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
## local_file.example will be created
+ resource "local_file" "example" {
+ content = "This is an example file managed by Terraform."
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./example.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ file_path = "./example.txt"
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
local_file.example: Creating...
local_file.example: Creation complete after 0s [id=ec3adcab998872def2df6200fb03992ac6f237a4]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
file_path = "./example.txt"
正如你在输出中所见,应用已成功完成,Terraform 现在显示了 file_path 输出及其对应的值。
运行 terraform output 查看文件名
在这一步中,你将使用 terraform output 命令从状态文件中查看输出值。这对于在无需手动解析状态文件或重新运行 terraform apply 的情况下检索基础设施信息非常有用。
要查看配置中定义的所有输出,只需在不带任何参数的情况下运行该命令。
terraform output
这将以人类可读的格式显示所有输出。
file_path = "./example.txt"
你也可以通过提供输出名称作为参数来查询特定的输出值。这在脚本编写或仅需获取单条信息时非常有用。
terraform output file_path
该命令将仅打印指定输出的原始值。
"./example.txt"
这使得在 Shell 脚本中使用输出变得非常容易,例如,通过将其赋值给变量:FILE=$(terraform output -raw file_path)。-raw 标志会去除引号。
总结
恭喜你完成了本次实验!
在本实验中,你学习了 Terraform 输出管理的基础知识。你成功完成了以下操作:
- 通过创建专用的
outputs.tf文件来组织配置。 - 定义了一个
output块来声明输出值。 - 在输出块中引用资源属性以暴露其值。
- 使用
terraform apply应用配置,使输出生效。 - 使用
terraform output从命令行查询输出值。
Terraform 输出是从基础设施中提取重要信息,并将你的 Terraform 工作流与其他工具和脚本集成的强大功能。



