是否可以在同一* .tf文件中的其他资源中将for_each输出用作for_each输入?

时间:2019-11-08 09:17:12

标签: terraform terraform-provider-azure

我在一个.tf文件中使用2个ARM terraform资源( azuread_user,azurerm_role_assignment ),并希望将来自azuread_user的for_each输出变量$ id作为azurerm_role_assignment主体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"
}

2 个答案:

答案 0 :(得分:0)

未测试:

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)}"
}

答案 1 :(得分:0)

如果您希望azurerm_role_assignment.ard实例和azuread_user.init实例之间一一对应,则可以直接将azuread_user.init用作{{1 }}:

for_each

上面的方法之所以可行,是因为设置了azurerm_role_assignment.ard的任何资源在Terraform语言表达式中都显示为从实例键到代表每个实例的对象的映射。符合资源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将是由一个for_each实例产生的对象,并通过映射键进行关联。

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

  • each.value
  • azuread_user.init
相关问题