Template.tf 和 user_data.yaml.tpl- 循环遍历列表类型的变量

Bet*_*nes 4 terraform

我是模板的新手,我正在尝试更改 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 中找出正确的方法来做到这一点

任何帮助,将不胜感激 !

Mar*_*ins 8

从你所展示的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 格式决策对于广泛的用例集是可以接受的。