如何在 Terraform 中使用 Element for Azure 可用区
How to use Element for Azure Availability Zones in Terraform
我正在尝试使用 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.
任何想法将不胜感激 -- 如果我找到答案,我会回来 post--
干杯,
-山姆·卡查尔
错误消息告诉我们 zones
参数需要一个字符串列表,但这里给出的表达式似乎 return 一个字符串。
看起来你的目标是 select 只是列表中的一个区域,在这种情况下,条件表达式的两个 "arms" 应该 return 一个单元素列表和一个空列表:
zones = var.avzones ? [element(["1", "2", "3"], count.index + 1)] : []
以上假定指定零区域是有效的。如果不是,您可能需要使用 null
而不是 []
来保留未指定的 zones
参数并接受远程系统默认的 selected,或者您可能需要select自己一个合适的默认值。
我找到了答案。
Martin 你是对的,这就是错误消息所说的内容,并且获取区域 属性 的字符串列表结果是一个真正的 PITA。我尝试了语法的每一种变体。我试着列出功能。没有什么。最终起作用的是 Split 函数。这是我的代码现在的样子:
zones = "${var.avzones}" ? split("","${element(["1","2","3"], "${count.index}")}") : null
Martin,您关于我发送 null 而不是 "" 的其他评论更有意义,这就是我选择做的事情。我还没有测试过。到目前为止,我只是验证了这些区域。我无法相信 split 何时起作用,它可能有点 hackish,但它完成了工作。我证实它确实按照我的意愿构建了所有区域。每次从 1 到 3。如果 null 没有解决,我会更新我的答案......但现在;任何努力使用 Azure 可用区并让 Terraform 识别值 1 到 3 的人都可以使用我在上面发布的代码。有效!
我正在尝试使用 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.
任何想法将不胜感激 -- 如果我找到答案,我会回来 post--
干杯, -山姆·卡查尔
错误消息告诉我们 zones
参数需要一个字符串列表,但这里给出的表达式似乎 return 一个字符串。
看起来你的目标是 select 只是列表中的一个区域,在这种情况下,条件表达式的两个 "arms" 应该 return 一个单元素列表和一个空列表:
zones = var.avzones ? [element(["1", "2", "3"], count.index + 1)] : []
以上假定指定零区域是有效的。如果不是,您可能需要使用 null
而不是 []
来保留未指定的 zones
参数并接受远程系统默认的 selected,或者您可能需要select自己一个合适的默认值。
我找到了答案。
Martin 你是对的,这就是错误消息所说的内容,并且获取区域 属性 的字符串列表结果是一个真正的 PITA。我尝试了语法的每一种变体。我试着列出功能。没有什么。最终起作用的是 Split 函数。这是我的代码现在的样子:
zones = "${var.avzones}" ? split("","${element(["1","2","3"], "${count.index}")}") : null
Martin,您关于我发送 null 而不是 "" 的其他评论更有意义,这就是我选择做的事情。我还没有测试过。到目前为止,我只是验证了这些区域。我无法相信 split 何时起作用,它可能有点 hackish,但它完成了工作。我证实它确实按照我的意愿构建了所有区域。每次从 1 到 3。如果 null 没有解决,我会更新我的答案......但现在;任何努力使用 Azure 可用区并让 Terraform 识别值 1 到 3 的人都可以使用我在上面发布的代码。有效!