我希望下面的资源能够摄取包含嵌套对象映射的变量/本地。
资源:
resource "azurerm_postgresql_flexible_server_firewall_rule" "pgsql_fw_rules" {
for_each = ???
server_id = module.pgsql[each.key].id
name = ???
start_ip_address = ???
end_ip_address = ???
}
变量/局部:
+ output1 = {
+ aa1 = {
+ azure_services = {
+ end_ip = "0.0.0.0"
+ start_ip = "0.0.0.0"
}
+ rule2 = {
+ end_ip = "10.255.255.255"
+ start_ip = "10.0.0.1"
}
+ ruleabc = {
+ end_ip = "1.1.1.2"
+ start_ip = "1.1.1.1"
}
+ tf_user = {
+ end_ip = "127.0.0.2"
+ start_ip = "127.0.0.1"
}
}
+ aa2 = {
+ azure_services = {
+ end_ip = "0.0.0.0"
+ start_ip = "0.0.0.0"
}
+ rulexyz = {
+ end_ip = "1.1.1.2"
+ start_ip = "1.1.1.1"
}
+ tf_user = {
+ end_ip = "127.0.0.2"
+ start_ip = "127.0.0.1"
}
}
}
正如您从上面的资源中看到的,我不确定如何访问每个对象映射的内容,这就是我想要的帮助。
这里有一些限制:
each.key
语句必须是客户的名称(aa1、aa2等)-第一个地图的键我假设:
for
的 for_each 可以实现技巧,尽管构建它的逻辑我不明白有什么想法吗?
为了让事情变得更容易,您可以:
${server_name}-${rule_name}
for_each
locals {
output1 = {
aa1 = {
azure_services = {
end_ip = "0.0.0.0"
start_ip = "0.0.0.0"
}
rule2 = {
end_ip = "10.255.255.255"
start_ip = "10.0.0.1"
}
ruleabc = {
end_ip = "1.1.1.2"
start_ip = "1.1.1.1"
}
tf_user = {
end_ip = "127.0.0.2"
start_ip = "127.0.0.1"
}
}
aa2 = {
azure_services = {
end_ip = "0.0.0.0"
start_ip = "0.0.0.0"
}
rulexyz = {
end_ip = "1.1.1.2"
start_ip = "1.1.1.1"
}
tf_user = {
end_ip = "127.0.0.2"
start_ip = "127.0.0.1"
}
}
}
flattened_rules = flatten([
for server_name, rules in local.output1 : [
for rule_name, details in rules : {
server_name = server_name
rule_name = rule_name
start_ip = details.start_ip
end_ip = details.end_ip
}
]
])
# Create a map with key as "${server_name}-${rule_name}" and value as the rule details
rules_map = {
for rule in local.flattened_rules : "${rule.server_name}-${rule.rule_name}" => rule
}
}
resource "null_resource" "example" {
for_each = local.rules_map
triggers = {
server_name = each.value.server_name
rule_name = each.value.rule_name
start_ip = each.value.start_ip
end_ip = each.value.end_ip
}
}
跑步terraform plan
:
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# null_resource.example["aa1-azure_services"] will be created
+ resource "null_resource" "example" {
+ id = (known after apply)
+ triggers = {
+ "end_ip" = "0.0.0.0"
+ "rule_name" = "azure_services"
+ "server_name" = "aa1"
+ "start_ip" = "0.0.0.0"
}
}
# null_resource.example["aa1-rule2"] will be created
+ resource "null_resource" "example" {
+ id = (known after apply)
+ triggers = {
+ "end_ip" = "10.255.255.255"
+ "rule_name" = "rule2"
+ "server_name" = "aa1"
+ "start_ip" = "10.0.0.1"
}
}
# null_resource.example["aa1-ruleabc"] will be created
+ resource "null_resource" "example" {
+ id = (known after apply)
+ triggers = {
+ "end_ip" = "1.1.1.2"
+ "rule_name" = "ruleabc"
+ "server_name" = "aa1"
+ "start_ip" = "1.1.1.1"
}
}
# null_resource.example["aa1-tf_user"] will be created
+ resource "null_resource" "example" {
+ id = (known after apply)
+ triggers = {
+ "end_ip" = "127.0.0.2"
+ "rule_name" = "tf_user"
+ "server_name" = "aa1"
+ "start_ip" = "127.0.0.1"
}
}
# null_resource.example["aa2-azure_services"] will be created
+ resource "null_resource" "example" {
+ id = (known after apply)
+ triggers = {
+ "end_ip" = "0.0.0.0"
+ "rule_name" = "azure_services"
+ "server_name" = "aa2"
+ "start_ip" = "0.0.0.0"
}
}
# null_resource.example["aa2-rulexyz"] will be created
+ resource "null_resource" "example" {
+ id = (known after apply)
+ triggers = {
+ "end_ip" = "1.1.1.2"
+ "rule_name" = "rulexyz"
+ "server_name" = "aa2"
+ "start_ip" = "1.1.1.1"
}
}
# null_resource.example["aa2-tf_user"] will be created
+ resource "null_resource" "example" {
+ id = (known after apply)
+ triggers = {
+ "end_ip" = "127.0.0.2"
+ "rule_name" = "tf_user"
+ "server_name" = "aa2"
+ "start_ip" = "127.0.0.1"
}
}
Plan: 7 to add, 0 to change, 0 to destroy.