[英]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.