0Pricing
Terraform Infrastructure as Code · 课时

使用外部数据与模板

使用 external 数据源将动态值引入 Terraform,并通过 templatefile 函数渲染配置文件。

使用外部数据与模板 是 CoddyKit 上的免费 Terraform Infrastructure as Code 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Terraform Infrastructure as Code 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Terraform Infrastructure as Code 课程共包含 4 节课。

超越内置数据源

您已经会使用数据源查询 AWS。有时,所需数据位于任何提供商之外,例如 shell 脚本的输出或内部 API 的返回值。external 数据源和 template 函数可以填补这一空白。

external 数据源

external 数据源会运行程序,并从其标准输出中读取 JSON。它是处理 Terraform 无法原生表达的逻辑时的备用方案。

data "external" "git_sha" {
  program = ["bash", "./scripts/git_sha.sh"]
}

程序约定

外部程序会从标准输入接收一个 JSON 对象,并且必须向标准输出打印一个值均为字符串的扁平 JSON 对象。任何其他情况都属于错误。

#!/bin/bash
echo '{"sha": "abc123"}'

读取外部结果

通过 result 映射访问返回的值。每个值都是字符串,因此如果需要其他类型,请进行类型转换。

resource "aws_instance" "app" {
  ami           = "ami-0abcd1234"
  instance_type = "t3.micro"

  tags = {
    GitSha = data.external.git_sha.result.sha
  }
}

何时避免使用 external

外部源会在每次计划时运行,如果脚本具有非确定性,就会破坏可复现性。如果存在真正的提供商数据源,请优先使用它;只有在确实缺少相应功能时才使用 external。

使用 templatefile 渲染文件

templatefile 函数会读取模板、替换变量并返回字符串。它非常适合生成 cloud-init 用户数据和配置文件。

resource "aws_instance" "web" {
  ami           = "ami-0abcd1234"
  instance_type = "t3.micro"
  user_data = templatefile("init.tftpl", {
    hostname = "web-01"
  })
}

模板语法

在 .tftpl 文件中,使用美元符号加大括号的语法插入值。Terraform 会替换传入的变量。

#!/bin/bash
hostnamectl set-hostname ${hostname}
echo 'Provisioned by Terraform'

模板中的循环

模板支持用于迭代的指令。for 指令会渲染重复的行,适合生成主机列表。

%{ for ip in ips ~}
server ${ip}:8080
%{ endfor ~}

使用 templatestring 编写内联模板

对于较短的片段,您可以跳过文件,直接在配置中使用 templatestring(或较旧的 format)构建动态字符串。

locals {
  greeting = templatestring("Hello, $${name}!", { name = "Ops" })
}

组合使用两者

一种常见模式是:external 源获取动态值,然后由 templatefile 将其注入渲染为用户数据的配置中。

user_data = templatefile("app.tftpl", {
  version = data.external.git_sha.result.sha
})

保持渲染结果幂等

由于 user_data 发生变化会强制替换实例,因此请保持模板输入稳定。输入持续变化的值(例如时间戳)会导致实例在每次应用时都被重新创建。

快速检查

测试您对 external 数据源的理解。

回顾:动态输入与模板

您扩展了 Terraform 的数据处理能力:

  • external 源会运行返回 JSON 的脚本。
  • templatefile 会渲染配置文件和用户数据文件。
  • 模板指令支持循环和插值。
  • 保持输入稳定,以避免不必要的替换。

常见问题解答

「使用外部数据与模板」课时是免费的吗?

是的 — 「使用外部数据与模板」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Terraform Infrastructure as Code 课程的其余内容,请升级到 CoddyKit PRO。 Terraform Infrastructure as Code 课程共包含 4 节课。

「使用外部数据与模板」这节课中我会学到什么?

使用 external 数据源将动态值引入 Terraform,并通过 templatefile 函数渲染配置文件。 你通过在浏览器中直接运行的动手代码来练习 Terraform Infrastructure as Code,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Terraform Infrastructure as Code 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Terraform Infrastructure as Code 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「使用外部数据与模板」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Terraform Infrastructure as Code 课中编写并运行代码吗?

能。每节 Terraform Infrastructure as Code 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用数据源查询数据
  2. 本地与远程执行配置器
  3. 空资源与触发器
  4. 使用外部数据与模板
← 返回 Terraform Infrastructure as Code