簡體   English   中英

Terraform 輸出:如何創建(地圖?)以及如何使用 map? map 是正確的工具嗎?

[英]Terraform Outputs: How do I create a (map?) and how do I use the map? Is a map even the right tool?

我正在努力解決一些 terraform 概念。

我成功地使用aztfmod/azurecaf提供程序來命名我的資源組,但這意味着我需要為compan.net.resource_group模塊獲取該名稱作為 output,以便我可以在調用compan.net.key_vault模塊。

# terraform.tfvars

resource_groups = {
  rg1 = { 
    name     = "resourcegroup1"
    location = "eastus"
  }
  rg2 = { 
    name     = "resourcegroup2"
    location = "eastus"
  }
}
# root main.tf

provider "azurerm" {
  features {}
}

module "companynet" {
  source = "./modules/companynet"

  tenant_id         = var.tenant_id
  environment       = var.environment
  resource_groups   = var.resource_groups
  key_vaults        = var.key_vaults
  storage_accounts  = var.storage_accounts
  app_service_plans = var.app_service_plans
}
# modules/companynet/main.tf

module "resource_group" {
  source          = "../companynet.resource_group"
  environment     = var.environment
  resource_groups = var.resource_groups
}

module "key_vault" {
 source          = "../companynet.key_vault"
 tenant_id       = var.tenant_id
 environment     = var.environment
 resource_groups = "${module.resource_group.resource_groups.companynet}"
 key_vaults      = var.key_vaults
 
}

模塊resource_group具有以下main.tf

# modules/companynet.resource_group/main.tf

resource "azurecaf_name" "resource_group" {
  for_each      = var.resource_groups
  name          = each.value.name
  resource_type = "azurerm_resource_group"
  suffixes      = ["${var.environment}", "001"]
}

resource "azurerm_resource_group" "resource_group" {
  for_each = var.resource_groups
  name     = azurecaf_name.resource_group[each.key].result
  location = each.value.location

}

但我不知道如何獲取該資源組名稱的 output。

我嘗試了一些不同的方法,但都不起作用

# modules/companynet.resource_group/outputs.tf

output "resource_groups" {
 value = azurerm_resource_group.resource_group[*].name
}

value = azurerm_resource_group.resource_group.name

value = azurerm_resource_group.resource_group.compan.net.name

value = azurerm_resource_group.resource_group[compan.net].name

這些中的每一個都會導致一個或另一個錯誤,都表明modules/compan.net.resource_group/outputs.tf有問題

理想情況下,我會得到一個 object,然后我可以在另一個模塊中迭代它。 我希望能夠調用類似的東西來訪問其他模塊中的那些資源組名稱,例如:

# modules/companynet.key_vault/main.tf

resource "azurerm_key_vault" "key_vault" {
  for_each            = var.key_vaults
  name                = azurecaf_name.key_vault[each.key].result
  location            = var.resource_groups.location

  resource_groups     = "${module.resource_group.resource_groups.[companynet]}"

  sku_name            = "standard"
  tenant_id           = var.tenant_id
}

azurerm_resource_group.resource_group是用for_each聲明的,因此該表達式引用 map 個對象,其中鍵與for_each表達式的鍵匹配,值是相應聲明的資源實例。

References to Resource Attributes中有各種在不同情況下引用資源屬性的示例,包括以下有關使用for_each的資源:

當資源設置了for_each參數時,資源本身變為實例對象的 map 而不是單個 object,並且實例的屬性必須由鍵指定,或者可以使用for表達式訪問。

  • aws_instance.example["a"].id返回以“a”為鍵的資源的 ID。
  • [for value in aws_instance.example: value.id]返回每個實例的所有 ID 的列表。

第二項顯示了如何使用for表達式生成aws_instance.example的 id列表,但它並未准確顯示如何生成 map 而是希望您參考有關for表達式的鏈接文檔以了解那:

for表達式周圍括號的類型決定了它產生的結果類型。

上面的示例使用[],它生成一個元組。 如果您改用{} ,則結果為 object,您必須提供兩個由=>符號分隔的結果表達式:

 {for s in var.list: s => upper(s)}

此表達式生成一個 object,其屬性是var.list中的原始元素,它們的對應值是大寫版本。 例如,結果值可能如下所示:

 { foo = "FOO" bar = "BAR" baz = "BAZ" }

單獨的for表達式只能生成 object 值或元組值,但 Terraform 的自動類型轉換規則意味着您通常可以在需要列表、映射和集合的位置使用結果。

本節介紹如何生成 object,然后說明您可以在需要 map 的位置使用結果。 在實踐中,通常可以在 Terraform 中互換使用對象類型值和映射類型值,因為它們的共同點是它們都具有由字符串鍵標識的元素。 區別在於 object 類型的每個屬性可以有一個單獨的類型,而 map 的所有屬性必須有相同的類型。

鑒於所有這些信息,我們可以生成一個object值來描述每個資源組的名稱,如下所示:

output "resource_groups" {
  value = { for k, g in azurerm_resource_group.resource_group : k => g.name }
}

對於大多數用途來說,這是一個對象類型的結果而不是特定的 map 並不重要,但是由於我們知道.name始終是一個字符串,我們可以推斷出這個 object 的所有屬性都具有字符串類型的值,因此使用tomap function顯式轉換為 map 字符串也是有效的(根據上述文檔,這是“預期 [...] 映射 [...] 的位置”):

output "resource_groups" {
  value = tomap({
    for k, g in azurerm_resource_group.resource_group : k => g.name
  })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM