Terraform - 如何输出多个值

Terraform - How to output multiple value

我对 Terraform 和编程还很陌生,但是,我必须提高自己的技能,因此非常感谢您提供正确的 output.tf 文件的建议。

在我的main.tf里,我写了

terraform {

  required_version = ">=0.12"
  
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "RG1" {
  name      = "AZ-VNET"
  location  = var.resource_group_location
}
resource "azurerm_resource_group" "RG2" {
  name      = "AZ-Migrate"
  location  = var.resource_group_location
}

在我的 output.tf 我写道:

output "resource_group_name" {
    value = azurerm_resource_group.RG*.name
   
}

结果没有打印两个资源组名称。

你可以在一个输出中有多个资源,但要让它工作,你需要使用一些terraform函数,或者根据类型格式化输出,如果它是一个列表,字符串,映射..当你有机会,看看 https://www.terraform.io/language/functions -- 我将展示一个例子,你将有一个 ID 列表。

1 - 顺便说一句,我们不能像通配符一样在字符串中使用 *,* 主要用于处理模块、动态资源或输出列表的资源,但在任何情况下在这种情况下,在资源名称中放置 * 将不起作用。我们在资源的属性之前使用 *,假设我们有一个创建 ABC 资源的模块,并且该资源具有 id 属性。它将是 module.ABC.*.id- 但它并不适用于所有情况,您需要知道输出的类型是什么,如果它是字符串、列表、映射,就像我说的那样。

3 - 我不使用 Azure,但如果你在 https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group 上查看该资源的文档 - 你可以看到从该资源导出的唯一属性是 id。鉴于此,您可以执行以下操作:

output "resource_group_name" {
  value = [azurerm_resource_group.RG1.id, azurerm_resource_group.RG2.id]
}

现在假设你真的需要输出这些资源的名称,你可以创建locals块来定义资源的名称,然后你就可以导出它们查询locals 值,例如:

locals {
  azurerm_resource_group_rg1 = "AZ-VNET"
  azurerm_resource_group_rg2  = "AZ-Migrate"
}


resource "azurerm_resource_group" "RG1" {
  name      = local.azurerm_resource_group_rg1
  location  = var.resource_group_location
}
resource "azurerm_resource_group" "RG2" {
  name      = local.azurerm_resource_group_rg2
  location  = var.resource_group_location
}

输出为:

output "resource_group_name" {
  value = [local.azurerm_resource_group_rg1, local.azurerm_resource_group_rg2]
}

但是现在不要那样做,我不知道他们是否会被重新创建,我不知道这些资源。如果你擅长这个,就这样做吧。

如果你知道了请告诉我。