【问题标题】:Terraform parameterizing blockTerraform 参数化块
【发布时间】:2022-01-14 06:29:36
【问题描述】:

我正在azurerm_app_service 之上创建一个模块。我不想增加输入变量列表来收集更大块的所有可能值,例如site_config

variable var1{}
variable var2{}
..
..
..
variable varN{}

resource "azurerm_app_service" "example" {
  name                = "example-app-service"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id

    site_config {
        key1 = var.var1
        key2 = var.var2
        ...
        ...
        keyN = var.varN
        
      }

  app_settings = {
    "SOME_KEY" = "some-value"
  }
}

我想参数化整个块本身。

类似的东西

variable var_block{
  type = map()
}

resource "azurerm_app_service" "example" {
  name                = "example-app-service"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id

      site_config {
        var.var_block   
      }

  app_settings = {
    "SOME_KEY" = "some-value"
  }
}

在 python 世界中寻找 **kwargs 之类的东西。

有没有可能实现?

【问题讨论】:

  • 你好@user1960109,site_config 有指定参数列表,如果你正在创建一个新参数,那么它会报错,这里不需要这个参数。
  • 作为上述注释的扩展,您需要将变量类型为 object 并带有可选值,这会变得混乱。如果site_config 是一个参数而不是一个块,那么这将更加可行,但大概可以声明多个site_config
  • @AnsumanBal-MT 我完全同意我们可以得到错误,因为意外的参数不可用。这里的假设是这些模块的消费者将知道要提供哪些可能的值。在那种情况下,我们有什么办法可以简化它吗?
  • @MattSchuchard 肯定添加对象类型很难管理和混乱。不幸的是,AzureRM 带有 site_config 作为块而不是参数。

标签: terraform terraform-provider-azure hcl


【解决方案1】:

您可以使用动态块仅从一个点管理所有值,例如,在我的示例中,您可以看到使用局部变量的示例,除此之外,您可以使用变量来处理和管理它们。

在开始之前,您必须使用for_eachlookup 来查找并验证变量中的值,如果找不到键,则返回空值,这种行为对于可选参数非常有用.

locals {
    site_configs = [
        {
            acr_use_managed_identity_credentials = "value1"
            acr_user_managed_identity_client_id = "value1"
            always_on = "value1"
            app_command_line = "value1"
            cors = "value1"
        },
        {
            acr_use_managed_identity_credentials = "value2"
            acr_user_managed_identity_client_id = "value2"
            always_on = "value2"
            app_command_line = "value2"
            cors = "value2"
        }
    ]
}


resource "azurerm_app_service" "example" {
  name                = var.variable_here
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id

  dynamic "syte_config" {
      for_each = local.syte_configs
      content {
          lookup(syte_config.value, "acr_use_managed_identity_credentials", null)
          lookup(syte_config.value, "acr_user_managed_identity_client_id", null)
          lookup(syte_config.value, "always_on", null)
          lookup(syte_config.value, "app_command_line", null)
          lookup(syte_config.value, "cors", null)
      }
  }

  app_settings = {
    "SOME_KEY" = "some-value"
  }
}


【讨论】:

  • 感谢您的建议。我想让属性内的键也成为动态的。像这样的东西```动态“site_config”{for_each = var.site_config内容{each.key = each.value}}```
  • 太好了,您也可以为资源创建一个 for_each,但听起来有点具体,当然,您必须对其进行测试,直到获得预期结果
  • 不,我提到的不起作用。仅供参考。
猜你喜欢
  • 2021-05-15
  • 2021-12-02
  • 2021-11-07
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2021-01-30
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多