我是新的模板,我试图改变terraform模块,以灵活的许多“名称服务器”的需要。
如何迭代变量的值?
现在我正在做:
template.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.21user_data.yaml.tpl
nameserver ${nameserver_1}
nameserver ${nameserver_2}我想做这样的事情:
template.tf
vars = {
count = length(var.nameserver)
for nameserver in nameservers:
nameserver_$(count.index)= ${element(var.nameserver, count.index)}
}user_data.yaml.tpl
for nameserver in nameservers:
nameserver ${nameserver_[count.index]}但我无法在template.tf和user_data.yaml.tpl中找到正确的方法来实现这一点。
任何帮助都将不胜感激!
发布于 2019-08-20 18:06:18
根据您对template.tf的展示,我猜想vars = { ... }声明在data "template_file"块中。template_file数据源主要用于Terraform0.11兼容性,它只支持模板变量的字符串值,但是由于您使用Terraform0.12,所以可以使用新的templatefile函数,这可以通过支持任何类型的值来简化。
从您使用的模板名称中,我猜您打算使用此结果将此结果分配给user_data,在这种情况下,在templatefile中执行此操作的语法如下所示:
user_data = templatefile("${path.module}/user_data.yaml.tpl", {
nameservers = var.nameservers
})在您的user_data.yaml.tpl文件中:
%{ for s in nameservers ~}
nameserver ${s}
%{ endfor ~}这里的%{ ... }序列是Terraform模板语法。同样的语法也可以直接在主配置文件中使用,所以对于这样小的模板,您可能更喜欢内联地编写模板,以使事情变得更简单:
user_data = <<-EOT
%{ for s in var.nameservers ~}
nameserver ${s}
%{ endfor ~}
EOT这里的模板语法是相同的,但是由于这是在主.tf配置文件中而不是在单独的模板文件中,所以我们可以在这里直接引用var.nameservers,而不是构建一个单独的模板变量映射。
您给模板文件指定的名称似乎表明您正在生成YAML,尽管您显示的模板实际上并没有生成有效的YAML。如果您打算将结果变成YAML,那么您在Terraform中还有一些其他选项,根据您的目标可能会更好:
首先,JSON是YAML的一个子集,因此您可以请求Terraform对数据进行编码,然后您的实例中的YAML解析器(如果符合YAML规范)应该能够解析它:
user_data = jsonencode({
nameservers = var.nameservers
})这种方法的一个优点是,您可以让Terraform的jsonencode函数担心JSON语法、转义等等,您只需将想要表示的数据结构传递给它。相反,使用模板可能需要处理引用或转义值,如果它们可能包含重要的标点符号。
Terraform的最新版本也有一个yamlencode函数,但在编写本报告时,它还处于实验性阶段,并且在将来的版本中可能会更改其输出的格式的具体细节。我不建议现在使用它作为user_data,因为如果语法细节在将来的版本中确实发生了变化,那么这将导致您的实例被计划替换。在Terraform的未来版本中,一旦团队从现实世界中获得足够的反馈,相信YAML格式的决策对于广泛的用例来说是可以接受的,那么输出就应该稳定下来。
https://stackoverflow.com/questions/57561084
复制相似问题