这有点难以描述。为了清楚起见,我简化了它之后,我得到了一张看起来像这样的地图:
server_ip_configs = {
mgmt = {
ct = "1"
}
applicationgateway = {
ct = "1"
}
monitor = {
ct = "1"
}
app = {
ct = "3"
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是迭代地图以创建一个平面列表,其中元素乘以 ct 属性的数量成为一个新的平面列表。所以我们最终得到一个看起来有点像这样的列表:
server_ip_configs_mapped = [
{
name = "mgmt-1"
}
{
name = "applicationgateway-1"
}
{
name = "monitor-1"
}
{
name = "app-1"
}
{
name = "app-2"
}
{
name = "app-3"
}
]
Run Code Online (Sandbox Code Playgroud)
通过设置变量显式为每行创建元素列表很简单:
data "null_data_source" "server_list_ip_configs" {
count = lookup(var.server_ip_configs[var.server_role], "ct", 0)
inputs = {
name = "${var.server_role}-${count.index +1}"
}
}
Run Code Online (Sandbox Code Playgroud)
我可以将其放入模块中并调用该模块的多个实例并连接结果。但这不是一个好方法,而且一点也不干。我的想法是否正确,在 Terraform 中没有其他方法可以做到这一点?是否因为 terraform 本质上是声明性的,也许我应该声明一个包含多个实例的列表,而不是尝试生成一个?使用 for 循环不起作用,因为从我所看到的来看,您无法使用整数来显式迭代。所以不行:
for i in 5
Run Code Online (Sandbox Code Playgroud)
欢迎对此的任何答案。谢谢。
@Helder 很接近,但我对请求的解释略有不同。您的意图是根据 ct 值构建列表,该值看起来像一个计数。这应该就是您正在寻找的。请注意使用 来range()执行您在该语句中查找的操作for i in 5。
variable "server_ip_configs" {
default = {
mgmt = { ct = "1" }
applicationgateway = { ct = "1" }
monitor = { ct = "1" }
app = { ct = "3" }
}
}
locals {
server_ip_configs_mapped = flatten([
for server, count in var.server_ip_configs : [
for i in range(count.ct) : {
"name" = join("-", [server, i+1])
}
]
])
}
output server_ip_configs_mapped { value = local.server_ip_configs_mapped }
Run Code Online (Sandbox Code Playgroud)
输出:
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
server_ip_configs_mapped = [
{
"name" = "app-1"
},
{
"name" = "app-2"
},
{
"name" = "app-3"
},
{
"name" = "applicationgateway-1"
},
{
"name" = "mgmt-1"
},
{
"name" = "monitor-1"
},
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6075 次 |
| 最近记录: |