如何在Terraform中使用Element for Azure可用性区域



我正试图使用Terraform元素函数设置Azure可用性区域(A.A.Z(,但我两次出现以下错误。由于有3个A.A.Z。我想使用Element来实现这一点,因为如果我能弄清楚语法或哪里出了问题,它会非常好地工作。元素将继续循环通过我想要的相同编号集,因为我的模块可能会请求3台服务器或300台。下面的代码是来自main.tf的错误:我得到了两次错误。

zones = "${var.avzones}" ? "${element(["1", "2", "3"], "${count.index + 1}")}" : ""
Error: Incorrect attribute value type
on ..main.tf line 283, in resource "azurerm_virtual_machine" "vm":
283:   zones                         = "${var.avzones}" ? "${element(["1", "2", "3"], "${count.index + 1}")}" : ""
Inappropriate value for attribute "zones": list of string required.

任何想法都将不胜感激——如果我找到答案,我会回来发布——

干杯,-Sam Kachar

错误消息告诉我们zones参数需要一个字符串列表,但这里给出的表达式似乎只返回一个字符串。

看起来你的目标是从列表中只选择一个区域,在这种情况下,条件表达式的两个"臂"应该分别返回一个元素列表和一个空列表:

zones = var.avzones ? [element(["1", "2", "3"], count.index + 1)] : []

以上假设指定的区域为零是有效的。如果没有,您可能需要使用null而不是[],以使zones参数未指定并接受远程系统选择的默认值,或者您可能需要自己选择合适的默认值。

我找到了答案。

Martin,你说得对,这就是错误消息所说的,将字符串列表添加到zones属性是一个真正的PITA。我尝试了各种各样的语法。我试着测试功能。没有什么但最终起作用的是Split函数。以下是我的代码现在的样子:

zones = "${var.avzones}" ? split("","${element(["1","2","3"], "${count.index}")}") : null

Martin,你对我发送null而不是"的另一条评论更有意义,这就是我选择做的。我还没有测试它。到目前为止,我只验证了这些区域。我简直不敢相信,当拆分成功时,它可能有点烦人,但它完成了任务。我验证了它确实按照我的意愿构建了所有的区域。每次都是从1到3。如果null不起作用,我会更新我的答案。。。但就目前而言;任何在Azure可用性区域中挣扎并让Terraform识别值1到3的人都可以使用我上面发布的代码。它有效!

最新更新