遍历 terraform 中的列表映射?
Iterating through a map of lists in terraform?
我正在尝试设置一个通用但可自定义的模板。
所以使用模块,我想遍历包含列表的地图,例如:
module "instance"
{
...
ip_by_subnets = {
subnet1 = [ip1,ip2]
subnet2 = [ip3]
subnet3 = []
subnet4 = [ip4,ip5,ip6,...]
}
...
}
在哪里
subnet# = a subnet cidr block
ip# = private IP address
对于每个子网,我需要 运行 通过并为每个私有 ip 创建一个实例。
伪代码基本上会这样做:
foreach subnet# in ip_by_subnets
foreach ip# in list
create an instance resource
但我想不出要放入资源模板的代码。
做了一些错误的尝试,例如
subnet_id = "${element(var.ip_by_subnets[count.index])}"
但这行不通。
我还考虑过在模块中使用 count
,但我必须将 elb 移到它自己的模块中。我能做到,但我想先尝试这种方式
有人知道怎么做吗?
对其他方法的任何建议(例如不同的数据结构表示赞赏)
似乎在 Terraform 0.12 发布之前这不是(容易)可行的。
0.12 版本包括 For
表达式以及许多其他改进
{for s in var.list : s => upper(s)}
{
"a" = "A"
"b" = "B"
"c" = "C"
}
未测试,但想象一下它会像这样工作:
{for l in var.map : for s in var.list : s => upper(s)}
{
"a" = "A"
"b" = "B"
"c" = "C"
}
我正在尝试设置一个通用但可自定义的模板。
所以使用模块,我想遍历包含列表的地图,例如:
module "instance"
{
...
ip_by_subnets = {
subnet1 = [ip1,ip2]
subnet2 = [ip3]
subnet3 = []
subnet4 = [ip4,ip5,ip6,...]
}
...
}
在哪里
subnet# = a subnet cidr block
ip# = private IP address
对于每个子网,我需要 运行 通过并为每个私有 ip 创建一个实例。
伪代码基本上会这样做:
foreach subnet# in ip_by_subnets
foreach ip# in list
create an instance resource
但我想不出要放入资源模板的代码。 做了一些错误的尝试,例如
subnet_id = "${element(var.ip_by_subnets[count.index])}"
但这行不通。
我还考虑过在模块中使用 count
,但我必须将 elb 移到它自己的模块中。我能做到,但我想先尝试这种方式
有人知道怎么做吗? 对其他方法的任何建议(例如不同的数据结构表示赞赏)
似乎在 Terraform 0.12 发布之前这不是(容易)可行的。
0.12 版本包括 For
表达式以及许多其他改进
{for s in var.list : s => upper(s)}
{
"a" = "A"
"b" = "B"
"c" = "C"
}
未测试,但想象一下它会像这样工作:
{for l in var.map : for s in var.list : s => upper(s)}
{
"a" = "A"
"b" = "B"
"c" = "C"
}