Terraform 输出管理

LinuxBeginner
立即练习

介绍

在 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 输出的值应为名为 examplelocal_file 资源中 filename 属性的值。

Ctrl+XYEnter 保存文件并退出 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 工作流与其他工具和脚本集成的强大功能。