【问题标题】:Terraform to create azure subnet delegation for selected subnets using for_eachTerraform 使用 for_each 为选定的子网创建 azure 子网委托
【发布时间】:2022-01-09 21:48:56
【问题描述】:

我需要一些关于在选定的天蓝色子网上创建委派的帮助。我的代码如下所示。

我的变量文件中定义的变量

variable “subnets” {
type = map(any)
}

我的 tfvar 文件包含以下值

subnets = {
mlops-aue-snt-aks = [“10.255.232.0/24”]
mlops-aue-snt-stg = [“10.255.233.0/26”]
mlops-aue-snt-kv = [“10.255.233.128/27”]
AzureBastionSubnet = [“10.255.233.160/27”]
mlops-aue-snt-shd = [“10.255.234.0/25”]
mlops-aue-snt-db1 = [“10.255.235.0/26”]
mlops-aue-snt-db2 = [“10.255.235.64/26”]
mlops-aue-snt-aci = [“10.255.235.128/26”]
}

这是我的子网代码

resource “azurerm_subnet” “azr_subnet” {
for_each = var.subnets

name = each.key
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = each.value
enforce_private_link_endpoint_network_policies = true
}

所有子网都是用这个创建的,一切都很好,但现在我需要为 mlops-aue-snt-db1 和 mlops-aue-snt-db2 添加 service_delegation,而对于其他子网则不同。我不确定如何使用我现有的代码来实现这一点。我无法从代码中分离出子网,因为它会强制删除现有的子网并创建不推荐的新子网。我确实阅读了一些关于使用动态块进行更改的帖子,但不确定如何根据我的要求为选择性子网实施它。

谁能建议如何在 terraform 中实现这一点?

【问题讨论】:

    标签: terraform terraform-provider-azure


    【解决方案1】:

    您可以使用 dynamic blocks 来做到这一点,并通过稍微更改您的 subnets 来做到这一点。

    subnets = {
        mlops-aue-snt-aks = {
                cidr = [“10.255.232.0/24”]
                service_delegation = false
        }    
        # the rest in same format
        mlops-aue-snt-db1 = {
                cidr = [“10.255.235.0/26”]
                service_delegation = true
        }    
        mlops-aue-snt-db2 = {
                cidr = [“10.255.235.64/26”]
                service_delegation = true
        }
        # ...
    }
    

    然后

    resource "azurerm_subnet" "azr_subnet" {
        for_each = var.subnets
    
        name = each.key
        resource_group_name = azurerm_resource_group.rg.name
        virtual_network_name = azurerm_virtual_network.vnet.name
        address_prefixes = each.value.cidr
        enforce_private_link_endpoint_network_policies = true
        
        dynamic "delegation" {
            for_each = each.value.service_delegation == "true" ? [1] : []
            
            content {
                name = "delegation"
    
                service_delegation {
                name    = "Microsoft.ContainerInstance/containerGroups"
                actions = ["Microsoft.Network/virtualNetworks/subnets/join/action", "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action"]
                }        
            }
        
        }
    }
    

    【讨论】:

    • 感谢@Marcin 的快速回复。我尝试了这个解决方案,但 terraform 没有检测到我在子网上的现有基础设施有任何变化。我在 terraform plan 之后收到此消息“没有更改。您的基础架构与配置匹配。”
    • 是的,您的回答真的很有帮助,但理想情况下,terraform 应该将其标记为更改,如果我使用 azurerm_subnet 创建子网,它将在正常情况下执行此操作,它会检测到更改并在之后显示更新计划。但在这种情况下,它没有向我显示任何更新,所以我怀疑它是否真的会在应用后对子网进行任何更改。
    • @Prem 感谢您告诉我。您可以为提供新的、修改过的代码提出新问题。以这种方式提供帮助会更容易。
    • 想告诉你你的答案是正确的并且有效。早些时候我犯了一些错误,所以 terraform 没有检测到任何变化,但它对我来说非常好。我也可以看到子网委派的变化。我还有2点要理解。一是在each.value.service_delegation == "true" ? [1] : [] 中使用[1] and [] 的作用是什么。如果您可以解释这一点,那么有没有办法在这段代码中将不同的委托分配给剩余的子网以及如何?再次感谢您的帮助。
    • 谢谢,我已选择您的回复作为工作解决方案。如果您能解释我在之前的 cmets 中提出的 2 个问题,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2018-03-22
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2019-11-22
    相关资源
    最近更新 更多