我是模板的新手,我正在尝试更改 terraform 模块以根据需要灵活调整许多“名称服务器”。如何遍历变量的值?现在我在做——
模板.tf -
variable "nameserver" {
type = list(string)
}
nameservers = [
"174.15.22.20",
"174.15.12.21"
]
nameserver_1 = element(var.nameservers, 0) #nameserver_1=174.15.22.20
nameserver_2 = element(var.nameservers, 1) #nameserver_2=174.15.12.21
Run Code Online (Sandbox Code Playgroud)
用户数据.yaml.tpl
nameserver ${nameserver_1}
nameserver ${nameserver_2}
Run Code Online (Sandbox Code Playgroud)
我想做类似的事情-
模板.tf
vars = {
count = length(var.nameserver)
for nameserver in nameservers:
nameserver_$(count.index)= ${element(var.nameserver,
count.index)}
}
Run Code Online (Sandbox Code Playgroud)
用户数据.yaml.tpl
for nameserver in nameservers:
nameserver ${nameserver_[count.index]}
Run Code Online (Sandbox Code Playgroud)
但无法在 template.tf 和 user_data.yaml.tpl 中找出正确的方法来做到这一点
任何帮助,将不胜感激 !
从你所展示的template.tf我猜测vars = { ... }声明是在一个data "template_file"块内。该template_file数据源主要是针对有0.11 Terraform兼容性和只支持字符串值的模板变量,但由于使用的是Terraform 0.12,你可以使用新的templatefile替代功能,这使得通过支持任何类型的值更容易些。
根据您使用的模板名称,我猜测您打算使用此结果分配给user_data,在这种情况下,执行此操作的语法templatefile如下所示:
user_data = templatefile("${path.module}/user_data.yaml.tpl", {
nameservers = var.nameservers
})
Run Code Online (Sandbox Code Playgroud)
在您的user_data.yaml.tpl文件中:
%{ for s in nameservers ~}
nameserver ${s}
%{ endfor ~}
Run Code Online (Sandbox Code Playgroud)
%{ ... }这里的序列是Terraform 模板语法。主配置文件中也可以直接使用相同的语法,因此对于这么小的模板,您可能更喜欢内联编写模板以简化操作:
user_data = <<-EOT
%{ for s in var.nameservers ~}
nameserver ${s}
%{ endfor ~}
EOT
Run Code Online (Sandbox Code Playgroud)
模板语法在这里是一样的,但是因为这是在主.tf配置文件中而不是在单独的模板文件中,所以我们可以直接在var.nameservers这里引用,而不是构建单独的模板变量映射。
您为模板文件提供的名称似乎表明您正在生成 YAML,尽管您显示的模板实际上并未生成有效的 YAML。如果你正在打算得到的结果是YAML,你必须在Terraform一些其他的选择可以更好的根据自己的目标:
首先,JSON 是 YAML 的一个子集,因此您可以要求 Terraform 对您的数据进行 JSON 编码,然后您实例中的 YAML 解析器(如果它符合 YAML 规范)应该能够解析它:
user_data = jsonencode({
nameservers = var.nameservers
})
Run Code Online (Sandbox Code Playgroud)
这种方法的一个优点是您可以让 Terraform 的jsonencode函数担心 JSON 语法、转义等,您只需将要表示的数据结构传递给它即可。如果它们可能包含重要的标点符号,则改用模板可能需要您处理值的引用或转义。
Terraform 的最新版本也有一个yamlencode功能,但在撰写本文时,它是实验性的,它如何格式化输出的确切细节可能会在未来版本中发生变化。我不建议user_data现在使用它,因为如果语法细节在未来版本中确实发生了变化,那么这将导致您的实例被计划更换。在未来版本的 Terraform 中,输出应该稳定,一旦团队从实际使用中获得足够的反馈,以确信其 YAML 格式决策对于广泛的用例集是可以接受的。
| 归档时间: |
|
| 查看次数: |
5320 次 |
| 最近记录: |