0

我正在尝试使用 Terraform 元素函数设置 Azure 可用区 (AAZ),但我两次收到以下错误。由于有 3 个 AAZ,我想为此使用 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

4

2 回答 2

0

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

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

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

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

于 2019-11-04T17:20:45.297 回答
0

我找到了答案。

马丁你是对的,这就是错误消息所说的内容,并且将字符串列表获取到 zone 属性结果是一个真正的 PITA。我尝试了每一种语法变化。我尝试了 tolist 功能。没有。最终起作用的是拆分功能。这是我的代码现在的样子:

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

马丁您对我发送 null 而不是 "" 的另一条评论更有意义,这就是我选择做的。我还没有测试过。到目前为止,我只验证了这些区域。我不敢相信 split 工作时,它可能有点骇人听闻,但它完成了工作。我确认它确实按照我的意愿构建了所有区域。每次1到3。如果 null 不起作用,我会更新我的答案......但现在;任何在 Azure 可用区中苦苦挣扎并让 Terraform 识别值 1 到 3 的人都可以使用我在上面发布的代码。有用!

于 2019-11-04T20:41:19.627 回答