【问题标题】:Terraform dynamic group creation/loop issuesTerraform 动态组创建/循环问题
【发布时间】:2022-11-16 02:52:37
【问题描述】:

我已经搜索并尝试了很多,但还没有找到解决方案。

我正在尝试通过“azurerm_resource_provider_registration”资源管理订阅提供商和预览功能。

如果我只想使用以下方法管理具有多个子功能的一个提供商,我已经可以正常工作了:

tfvars 文件

provider_name = "Microsoft.Network"

provider_feature_name = {
    feature1 = {
        feature_name = "BypassCnameCheckForCustomDomainDeletion"
        registered = true
    }
    feature2 = {
        feature_name = "AllowTcpPort25Out"
        registered = true
    }
}

主程序

resource "azurerm_resource_provider_registration" "provider_registration" {
  name = var.provider_name 
  
  dynamic "feature"  {
    for_each   = var.provider_feature_name
    content {
      name       = feature.value.feature_name
      registered = feature.value.registered
    }
  }
}

如果我只想管理一个提供商及其功能,效果很好。

当/如果我想添加一个额外的“provider_name”时,问题就来了。我尝试了一个单独的 provider_name 块,但我不断收到“此处出现意外块”错误。如果我像这样引入一个块;

变量.tf

provider_name = {
    provider1 = {
        provider_name = "Microsoft.Network" {
          feature1 = {
            feature_name = "test"
            registered = true
          }
        }
     }
    provider2 = {
        provider_name = "Microsoft.Storage" {
          feature2 = {
            feature_name = "test2"
            registered = true
          }
        }

     }     
}

主文件

resource "azurerm_resource_provider_registration" "provider_registration" {


  for_each = var.provider_name

  name = each.value.provider_name

  dynamic "feature" {
    for_each = var.provider_feature_name
    content {
      name       = feature.value.feature_name
      registered = feature.value.registered
    }
  }

我可以让它循环,但不能让它仅将 feature1 关联到提供者 1 等,因为这些功能是该提供者独有的。它将 feature1 关联到提供者 1 和 2。

如果我尝试为“名称”值引入 for_each 或动态组,它会出现“此处不希望提供类型块”和/或“需要参数名称但未找到定义”

简而言之,我怎样才能让我的 main 遍历每个 provider_name 并且只将功能的子块与该提供者相关联(每个提供者类型可能有多个功能)。这种类型的资源是不可能的吗?或者我只是没有正确理解 loop/for_each 文档。

任何帮助表示赞赏

谢谢你。

【问题讨论】:

    标签: loops terraform terraform-provider-azure


    【解决方案1】:

    首先我们需要清理和优化输入结构。我推测这些值应该是多少,因为问题中指定了两种不同的假设结构,但结构本身是准确的。

    providers = {
      "Microsoft.Network" = {
        feature_name = "BypassCnameCheckForCustomDomainDeletion"
        registered   = true
      }
      "Microsoft.Storage" = {
        feature_name = "AllowTcpPort25Out"
        registered   = true
      }
    }
    

    现在我们可以轻松地在资源中使用带有 for_each 元参数的结构。

    resource "azurerm_resource_provider_registration" "provider_registration" {
      for_each = var.providers
    
      name = each.key
    
      feature {
        name       = each.value.feature_name
        registered = each.value.registered
      }
    }
    

    这导致两个提供者注册,每个提供者都映射了相应的功能。

    目前尚不清楚是否还需要每个提供者功能的多个特性。在那种情况下,解决方案会略有不同。

    【讨论】:

    • 嗨@Matt,感谢您的快速回复!是 - 需要每个提供者功能的多个特性。编辑主要帖子以反映。
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 2020-10-29
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2018-06-12
    • 2020-09-06
    相关资源
    最近更新 更多