【问题标题】:proper way to use nested variables in terraform在 terraform 中使用嵌套变量的正确方法
【发布时间】:2019-11-22 04:30:32
【问题描述】:

在我的 terraform 脚本中,我有

resource "azuread_application" "main" {
  count           = "${length(var.sp_names)}"
  name            = "${sp_prefix}-${var.sp_names[count.index]}"

  available_to_other_tenants = false
}

resource "azuread_service_principal" "main" {
  count           = "${length(var.sp_names)}"
  application_id  = "${azuread_application.main.["${sp_prefix}"-"${var.sp_names[count.index]}"].application_id}"
}

当我运行 terraform init 时,我收到以下错误:

点后面需要属性名。

使用嵌套变量和列表对象的正确方法是什么?

【问题讨论】:

  • 您使用的是哪个版本的 Terraform?以下答案与 0.12.x 有关。我假设你正在使用。

标签: terraform terraform-provider-azure


【解决方案1】:

为了将资源表示为实例映射而不是实例列表,您需要使用for_each 而不是count:

resource "azuread_application" "main" {
  for_each = { for n in var.sp_names : n => "${var.sp_prefix}-${n}" }

  name                       = each.value
  available_to_other_tenants = false
}

上面的for_each 表达式是一个for expression,它将您的名称列表或名称集转换为从给定名称到前缀名称的映射。因此,在该块中的其他表达式中,each.key 将生成原始给定名称,each.value 将生成前缀名称。

然后,您可以类似地使用for_each 来声明意图“为每个应用程序创建一个服务主体”,方法是将应用程序资源的映射本身用作服务主体资源的for_each 表达式:

resource "azuread_service_principal" "main" {
  for_each = azuread_application.main

  application_id  = each.value.application_id
}

在这种情况下,azuread_application.main 值是从无前缀名称到代表每个已声明应用程序的对象的映射。因此 this 块中的each.key 又是无前缀名称,但each.value 是相应的应用程序对象,我们可以从中访问application_id 值。

如果您的 var.sp_names 中有一个字符串 "example",则 Terraform 会将上述内容解释为创建两个名为 azuread_application.main["example"] 和 azuread_service_principal.main["example"] 的对象的请求,并通过 var.sp_names 值标识这些实例。这与count 不同,其中实例的地址类似于azuread_application.main[0] 和azuread_service_principal.main[0]。通过使用for_each,我们确保在var.sp_names 中添加和删除项目将在这些资源中添加和删除相应的实例,而不是更新碰巧共享相同数字索引的现有实例。

【讨论】:

    【解决方案2】:

    我假设您使用的是 0.12.x 之前的版本。如果不是,Martin 的答案是最好的。

    你需要利用飞溅。

    resource "azuread_service_principal" "main" {
      count           = "${length(var.sp_names)}"
      application_id  = "${azuread_application.main.*.application_id}"
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多