【问题标题】:Can I use for_each output as for_each input in an other resource in same *.tf file?我可以在同一个 *.tf 文件的其他资源中使用 for_each 输出作为 for_each 输入吗?
【发布时间】:2019-11-09 00:27:44
【问题描述】:

我在一个 .tf 文件中使用 2 个 ARM terraform 资源(azuread_user、azurerm_role_assignment),并希望将来自 azuread_user 的 for_each 输出变量 $id 作为 azurerm_role_assignment principal_id 的 for_each 输入变量。有没有办法做到这一点?能否提供代码示例?

data "azurerm_subscription" "init" {}

locals {

  csv_data = file("${path.module}/users.csv")
  instances = csvdecode(local.csv_data)

}

resource "azuread_user" "init" {

  for_each = { for inst in local.instances : inst.display_name => inst }

  display_name = each.value.display_name
  mail_nickname = each.value.mail_nickname
  user_principal_name = each.value.user_principal_name
  password            = "XXX#XXX#XXX"
  force_password_change = "true"
}


resource "azurerm_role_assignment" "ard" {
  scope                = "${data.azurerm_subscription.init.id}"
  role_definition_name = "Owner"
  principal_id         = "HERE THE FOR_EACH INPUT FROM OUTPUT VAR $ID"
}

【问题讨论】:

    标签: terraform terraform-provider-azure


    【解决方案1】:

    如果你想在azurerm_role_assignment.ard实例和azuread_user.init实例之间一一对应,你可以直接使用azuread_user.init作为for_eachazurerm_role_assignment.ard上的重复表达式:

    resource "azurerm_role_assignment" "ard" {
      for_each = azuread_user.init
    
      scope                = data.azurerm_subscription.init.id
      role_definition_name = "Owner"
      principal_id         = each.value.id
    }
    

    上述方法可以工作,因为任何设置了for_each 的资源在 Terraform 语言表达式中都显示为从实例键到表示每个实例的对象的映射。这符合对资源 for_each 的要求,并确保 each.value 将是由一个 azuread_user.init 实例生成的对象,由映射键关联。

    如果您的 CSV 中有一个显示名称为“MABU”的条目,那么您会在计划中看到具有以下地址的实例:

    • azuread_user.init["MABU"]
    • azurerm_role_assignment.ard["MABU"]

    【讨论】:

      【解决方案2】:

      未经测试:

      azuread_user 将输出一个属性调用 id。

      您可以使用 count 和 count.index 循环遍历值。

      resource "azurerm_role_assignment" "ard" {
        scope                = "${data.azurerm_subscription.init.id}"
        count                = "${length(azuread_user.init)}" 
        role_definition_name = "Owner"
        principal_id         = "${element(azuread_user.init.*.id, count.index)}"
      }
      

      【讨论】:

        猜你喜欢
        • 2023-02-16
        • 2021-06-01
        • 2021-08-16
        • 2021-09-24
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 2020-11-08
        相关资源
        最近更新 更多