使用Terraform插值将资源转换为字符串列表

时间:2017-10-24 17:48:13

标签: interpolation terraform

给定.tfvars包含:

environment = "dev"
web_servers = ["192.168.0.1","192.168.0.2"]

以及node资源,例如:

resource "node" "web_nodes" {
  count = "${length(var.web_servers)}"
  name = "${var.environment}_web_${count.index}"
  address = "${element(var.web_servers, count.index)}"
}

我想动态地表达以下内容:

resource "pool" "homepage_pool" {
  name = "homepage_${var.environment}"
  nodes = [
    "dev_web_0:443",
    "dev_web_1:443"
  ]
}

计划输出如:

nodes.2387117855: "" => "dev_web_1:443"
nodes.3005787823: "" => "dev_web_0:443"

我认为pool.nodes应使用formatlist()join()或2的组合生成.2。努力寻找合适的例子。

我能得到的最接近的计划如下:

nodes.467461356: "" => "\"/Common/preprod_web_0\","/Common/preprod_web_1\""

1 个答案:

答案 0 :(得分:4)

formatlist函数可以与“splat”运算符一起使用,以获得您需要的结果。

“splat”运算符允许您从一组count ed资源实例的给定属性中简明地创建列表。您的示例似乎是您要使用节点名称和硬编码端口443,在这种情况下,这可以表示如下:

resource "pool" "homepage_pool" {
  name = "homepage_${var.environment}"
  nodes = "${formatlist("%s:443", node.web_nodes.*.name)}"
}

表示法node.web_nodes.*.name表示获取在名称name下创建的每个实例的node.web_nodes属性,并从中生成字符串列表。然后formatlist依次将给定格式应用于列表的每个元素,附加:443端口后缀。