使用外部数据与模板
使用 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 反馈 — 无需本地设置。
此课程中的所有课时
- 使用数据源查询数据
- 本地与远程执行配置器
- 空资源与触发器
- 使用外部数据与模板